Android App带原生库打包为App Bundle报错但APK正常该如何修复
问题原因
- App Bundle默认的架构分发逻辑和普通APK完全不同:普通APK会将所有配置的ABI架构so库全量打包,而App Bundle默认开启按ABI拆分,Google Play向用户分发时只会下发用户设备对应架构的so文件。Vitamio作为多年未更新的老旧库,没有采用系统标准的
System.loadLibrary()加载逻辑,内部自行实现了so扫描、解压、加载逻辑,多数版本会强制遍历所有预设ABI目录,只要有一个目录找不到对应so就会抛出错误,哪怕当前设备适配的so实际存在也会加载失败。 - 旧版Vitamio普遍存在架构适配不全的问题:绝大多数公开的Vitamio版本仅提供了armeabi(32位ARMv5)架构的so库,未适配armeabi-v7a、arm64-v8a等新架构。如果你的项目中其他第三方库包含了新架构的so,App Bundle构建时会自动生成所有出现过的架构的单独分发包,而新架构包中没有Vitamio的对应so,分发到新架构设备时就会出现加载失败。
- 你之前修改的
enableSplit = false是普通APK多ABI拆分的专属配置,对App Bundle的架构拆分逻辑完全不生效,因此无法解决问题。
修复方案
- 方案1:修改App Bundle的架构拆分配置,仅保留Vitamio支持的ABI。在app模块的build.gradle文件的
android代码块中添加如下配置:
android { // 原有其他配置不变 bundle { abi { // 关闭ABI拆分,全量打包所有架构so,和普通APK逻辑一致 enableSplit = false // 如果需要精准控制保留的架构,也可以开启拆分后仅保留支持的架构,示例如下: // enableSplit = true // include "armeabi", "armeabi-v7a" } } }
- 方案2:补全所有目标架构的Vitamio so库。如果能获取到Vitamio对应arm64-v8a、x86等你需要支持的架构的编译产物,将so文件对应放入
jniLibs目录下的对应架构子目录中,保证每个架构目录下都有完整的Vitamio so文件即可。 - 方案3:强制开启so解压逻辑。App Bundle默认开启
extractNativeLibs = false配置优化安装包体积,部分老旧so无法适配这种页对齐直接加载的逻辑,可以在AndroidManifest.xml的application节点添加如下属性:
android:extractNativeLibs="true"
安装时会把所有so解压到应用私有目录,适配Vitamio的自定义加载逻辑。
- 方案4(长期最优):替换Vitamio为当前仍在维护的主流播放库,比如ExoPlayer、ijkplayer等,从根源规避老旧无人维护库的兼容性问题。
内容的提问来源于stack exchange,提问作者moster67
相关产品推荐
相关产品推荐

