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
还木有评论哦,快来抢沙发吧~