解压so文件的逻辑问题在Android系统安装apk时出现。(so文件怎么解密)(iso文件怎么解压)

访客 248 0

Android 系统安装 apk 时解压 so 的逻辑问题

0X0 前言

在 Android 系统中,当我们安装apk文件时,lib目录下的so文件会被解压到app的原生库目录。一般来说,这些so文件会放置在/data/data//lib目录下。然而,根据系统和CPU架构的不同,拷贝策略也会有所不同。我们在测试过程中发现了一些不正确配置so文件的问题。例如,在某些应用程序使用第三方so时,只配置了特定CPU架构的so可能导致适配问题在某些机型上出现。因此,本文主要介绍了在不同版本的Android系统中安装apk时PackageManagerService选择解压so库的策略,并提供了一些建议来正确配置so文件。

0x1 Android4.0以前

当 apk 被安装时,虽然执行路径有所不同,但最终都会调用到一个核心函数——copyApk,其职责是拷贝 apk 中的资源。

根据 Android 源码 2.3.6 的参考,其内部函数 copyApk 包含了一段选取原生库 so 的逻辑。

public static int listPackageNativeBinariesLI(ZipFile zipFile, List nativeFiles) throws ZipException, IOException {
    String cpuAbi = Build.CPU_ABI;
    int result = listPackageSharedLibsForAbiLI(zipFile, cpuAbi, nativeFiles);
    
    /* 
     * Some architectures are capable of supporting several CPU ABIs
     * for example, 'armeabi-v7a' also supports 'armeabi' native code
     * this is indicated by the definition of the ro.product.cpu.abi2 system property.
     *
     * only scan the package twice in case of ABI mismatch 
     */
    
    if (result == PACKAGE_INSTALL_NATIVE_ABI_MISMATCH) {
        final String cpuAbi2 = SystemProperties.get(ro.product.cpu.abi2, null);
        if (cpuAbi2 != null) {
            result = listPackageSharedLibsForAbiLI(zipFile, cpuAbi2, nativeFiles);
        }
    }
    
    return result;
}  
private static int listPackageSharedLibsForAbiLI(ZipFile zipFile, String cpuAbi, List libEntries) throws IOException, ZipException {
    final int cpuAbiLen = cpuAbi.length();
    boolean hasNativeLibraries = false;
    boolean installedNativeLibraries = false;
    
    if (DEBUG_NATIVE) {
        Slog.d(TAG, Checking  + zipFile.getName() +  for shared libraries of CPU ABI type  + cpuAbi);
    }
    
    Enumeration

标签: 文件 问题 系统

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~