Android虚拟设备运行应用.so加载失败,物理设备正常该如何解决?
问题排查与处理方案
第一步:优先排查.so文件的ABI架构匹配问题
- 该问题90%以上是架构不匹配导致:绝大多数默认创建的Android虚拟设备为x86/x86_64架构,而你使用的物理设备一般是arm64-v8a/armeabi-v7a架构。如果你存放的.so文件仅提供了arm架构版本,没有适配x86系列架构,模拟器运行时就找不到对应架构的so文件,进而触发原生方法找不到的报错。
- 验证方式:打开你存放.so文件的
libs目录,查看子文件夹命名,如果仅存在armeabi-v7a、arm64-v8a文件夹,没有x86、x86_64文件夹,即可确认是该问题。 - 两种解决方案任选其一:
- 去spatialite官方渠道获取x86、x86_64架构的.so文件,放到
libs目录下对应命名的子文件夹中 - 新建arm架构的虚拟设备:创建模拟器时在镜像选择页,选择ABI为arm64-v8a的系统镜像即可,高版本Android模拟器已支持直接运行arm架构的.so文件
- 去spatialite官方渠道获取x86、x86_64架构的.so文件,放到
第二步:检查build.gradle的ABI过滤规则
- 检查
build.gradle的defaultConfig代码块下是否存在ndk.abiFilters配置,如果该配置仅指定了arm架构的过滤规则,模拟器运行时会自动剥离x86系列的.so文件,导致加载失败。 - 处理方式:把
x86、x86_64加入过滤列表,或者临时注释该配置验证问题是否解决。
第三步:验证.so文件是否被正确打包进APK
- 打包生成APK后直接拖入Android Studio打开,查看APK内部的
lib目录下是否存在和模拟器架构匹配的.so文件,如果不存在说明打包阶段就没有把对应架构的so打包进去,需要回头检查目录配置和ABI过滤规则。 - 你配置的
jniLibs.srcDirs = ['libs']规则是生效的,不需要额外把.so复制到src/main/jniLibs下,两个目录二选一配置即可,重复存放反而可能出现文件冲突。
关于虚拟设备/data/data/xxxxx/lib路径的疑问
该路径是Android系统安装应用时,自动把和设备架构匹配的.so文件解压存放的默认路径,本身不会对.so加载产生负面影响。如果安装后该路径下没有你需要的.so文件,本质还是打包时未包含对应架构的.so,或者架构不匹配系统没有解压对应文件导致的。
内容的提问来源于stack exchange,提问作者leomessi
相关产品推荐
相关产品推荐

