切换至Android App Bundle后应用无法找到native原生库问题咨询
禁用
android.bundle.enableUncompressedNativeLibs的影响 - 安装包体积上升:开启该优化时原生so库无需压缩直接打包,最终AAB/APK体积比压缩so的场景小10%~20%,禁用后so会被压缩存储,安装包体积会相应变大。
- 安装后存储空间占用升高:开启优化时系统无需解压so库,可直接从APK包内映射加载so,禁用后安装时需要将所有so解压到应用私有目录,额外占用与so总大小相等的存储空间。
- 应用安装速度变慢:新增了解压so的步骤,so体积越大安装速度下降越明显。
适配该优化的方案
你当前的报错核心原因是:开启该优化时,原生so库不会被解压到context.applicationInfo.nativeLibraryDir目录,系统会直接从APK包内加载so,你写的遍历本地目录找so的逻辑不兼容该场景。
适配步骤如下:
- 移除
AndroidManifest.xml中的android:extractNativeLibs="true"配置,保持和Gradle默认值对齐。 - 修改你的so校验逻辑,兼容两种场景:
private fun ensureNativeLibAvailable(context: Context, libName: String) { // 优先检查本地解压的so(适配旧版本、特殊ROM场景) val nativeDir = File(context.applicationInfo.nativeLibraryDir) val localLib = findFile(libName, nativeDir) if (localLib != null) return // 本地不存在则检查APK包内的so(适配未压缩so的优化场景) val apkPath = context.applicationInfo.sourceDir val abi = Build.SUPPORTED_ABIS.first() // 取当前设备优先匹配的ABI val apkLibPath = "lib/$abi/$libName" // 校验APK中是否存在对应so ZipFile(apkPath).use { zipFile -> if (zipFile.getEntry(apkLibPath) == null) { throw RuntimeException("$libName not found.") } } }
- 如果你需要直接加载so,无需手动拷贝到本地,直接调用
System.load("${apkPath}!/${apkLibPath}")即可完成加载,系统会直接映射APK内的未压缩so执行。
补充说明
你观测到的lib-0/lib-1/lib-main这类目录,是Google Play动态交付特性的存储目录,用来存放不同Feature模块解压后的so文件,如果你没有使用动态Feature模块,无需关注这些目录,直接按上述方案适配即可。
内容的提问来源于stack exchange,提问作者rupinderjeet
相关产品推荐
相关产品推荐

