You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

切换至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的逻辑不兼容该场景。
适配步骤如下:

  1. 移除AndroidManifest.xml中的android:extractNativeLibs="true"配置,保持和Gradle默认值对齐。
  2. 修改你的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.")
        }
    }
}
  1. 如果你需要直接加载so,无需手动拷贝到本地,直接调用System.load("${apkPath}!/${apkLibPath}")即可完成加载,系统会直接映射APK内的未压缩so执行。

补充说明

你观测到的lib-0/lib-1/lib-main这类目录,是Google Play动态交付特性的存储目录,用来存放不同Feature模块解压后的so文件,如果你没有使用动态Feature模块,无需关注这些目录,直接按上述方案适配即可。

内容的提问来源于stack exchange,提问作者rupinderjeet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:54:05