Android App Bundle安装后lib/$ABI目录无原生.so文件问题
Android App Bundle部署后lib/$ABI目录为空的问题排查与解决
可能的原因及对应解决方案
1. 原生库未被构建工具检测到依赖
当使用App Bundle时,如果代码中没有直接引用.so文件(比如通过System.loadLibrary直接调用),构建工具(R8/ProGuard)或App Bundle打包逻辑会认为这些库是可选资源,不会将其纳入基础交付包中。常见场景是通过反射、字符串拼接等动态方式加载库。
解决方法:
在代码中添加一个空的静态代码块,显式引用所有需要的原生库,让构建工具检测到依赖:
static { try { System.loadLibrary("exepython2.7"); System.loadLibrary("ffi"); System.loadLibrary("bdiff"); } catch (UnsatisfiedLinkError e) { // 实际运行时若用其他方式加载,可忽略此错误 } }
如果使用ProGuard/R8,需确保上述代码块不被混淆移除,在proguard-rules.pro中添加:
-keep class com.your.package.YourEntryClass { static {}; }
2. ABI过滤或sourceSets配置错误
检查app/build.gradle中的ABI配置是否覆盖了目标设备的架构,同时确认jniLibs目录指向正确。
解决方法:
确认defaultConfig中包含目标ABI:
android { defaultConfig { ndk { abiFilters 'arm64-v8a', 'armeabi-v7a' // 根据设备需求调整 } } }
验证sourceSets的jniLibs路径配置正确:
android { sourceSets { main { jniLibs.srcDirs = ['libs'] // 替换为你的.so文件实际存放目录 } } }
3. bundletool安装命令参数异常
即使拆分后的.apks包含对应ABI的库,若安装命令指定错误参数(比如强制指定非设备ABI),也会导致库不被部署。
解决方法:
使用标准命令安装,避免手动指定错误ABI:
bundletool install-apks --apks=your_app.apks
若连接多台设备,指定目标设备ID:
bundletool install-apks --apks=your_app.apks --device-id=your_device_id
4. 按需交付模块配置问题
如果将原生库放在动态功能模块中,而非基础模块(base),或者开启了按需交付设置,这些库不会在应用首次安装时自动下载。
解决方法:
确保所有必需的.so文件都放在基础模块的jniLibs目录下,检查bundle配置中ABI拆分是否开启:
android { bundle { abi { enableSplit = true // 开启ABI拆分,确保生成对应架构的拆分APK } } }
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

