Android 12 x86_64模拟器加载aar中.so文件异常求助
核心原因
Android 12 对多ABI应用的加载逻辑做了调整,加上x86_64模拟器可能开启了ARM64翻译功能,导致进程实际以ARM64架构运行,但你的自定义加载逻辑却强行加载了x86_64版本的.so,从而引发架构不匹配的错误。另外,Android 11与12的ABI优先级排序不同,这也是旧版本正常、新版本出问题的关键。
解决方案
1. 修复自定义加载逻辑,匹配当前进程ABI
你的代码中NativeNetworkMonitor.GetNativeLibraryAbsolutePath()可能在Android 12下返回了固定路径,没有根据当前进程的实际ABI动态获取正确的.so路径。建议替换为系统提供的API来获取对应ABI的native库目录:
// 需提前获取全局Application Context,静态块中可通过全局实例调用 String nativeAbsolutePath = getApplicationContext().getApplicationInfo().nativeLibraryDir;
这个API会自动返回当前进程ABI对应的so目录(比如x86_64进程返回/data/app/xxx/lib/x86_64),避免硬拼路径导致的架构不匹配。
2. 关闭模拟器的ARM64翻译功能
如果测试不需要ARM64兼容性,直接在模拟器设置中关闭ARM翻译:
- 打开Android Studio的Device Manager
- 找到目标x86_64模拟器,点击"Edit"
- 在"Advanced Settings"中取消勾选"Enable ARM64 translation"
- 重启模拟器后,进程会以x86_64原生模式运行,加载对应so即可正常工作
3. 强制应用优先使用x86_64 ABI
在AndroidManifest.xml的<application>标签中添加属性,指定优先使用x86_64架构:
<application ... android:primaryCpuAbi="x86_64">
该属性会让应用在支持x86_64的设备上优先选择该ABI运行,覆盖系统默认的优先级排序。
4. 检查extractNativeLibs配置
如果你的AndroidManifest.xml中设置了android:extractNativeLibs="false",so文件会直接从APK内部加载,而非提取到/data/app目录。这时候自定义路径拼接可能失效,建议改为:
<application ... android:extractNativeLibs="true">
或者直接使用系统API获取正确的加载路径(方案1),避免手动拼接路径。
5. 拆分ABI构建(临时应急方案)
正如你已经尝试的,按单个ABI拆分构建aar并仅引入x86_64版本,可以绕过系统的ABI选择逻辑,但这仅适合测试场景,正式发布仍需支持多ABI。
内容的提问来源于stack exchange,提问作者nbonbon

