android - 在官方 Android 模拟器上安装 ARM Translation (libhoudini)
问题描述
我有一个使用本机 ARM 共享库 ( .so
) 的小型应用程序。使用 Genymotion 时,我可以成功安装 ARM 翻译包(只需删除 ZIP 文件),并且该应用程序在基于 x86 的模拟器上运行良好。
现在我需要在 Genymotion 不支持的无头 linux 服务器中运行相同的应用程序。我下载了官方的谷歌模拟器和相应的系统镜像。从 zip 存档中提取文件并上传到/system
分区后,我可以运行houdini --version
,但应用程序不会安装 ( INSTALL_FAILED_NO_MATCHING_ABIS
)。
你能指导我如何在官方的谷歌 x86 模拟器上运行包含 ARM 库的应用程序吗?
解决方案
houdini --version 的输出是什么?
当您安装应用程序时,PackageManager 会检查应用程序的 ABI(哪些库包含在 apk .so 文件中)和系统的 ABI(系统支持的库类型)
如果你跑getprop | grep -i abi
getprop | grep -i abi
[ro.product.cpu.abi]: [x86]
[ro.product.cpu.abilist]: [x86,armeabi-v7a,armeabi]
[ro.product.cpu.abilist32]: [x86,armeabi-v7a,armeabi]
[ro.product.cpu.abilist64]: []
在此输出中,系统支持 x86、armeabi-v7a 和 armeabi 类型的 32 位 .so 文件。
请在您的设备上检查此输出。很可能在此输出中不会提及 armeabi。
因此,当 PackageManager 尝试安装 ARM 应用程序并检查此 ABI 不受支持时,它会引发INSTALL_FAILED_NO_MATCHING_ABIS
错误。
因此,您将不得不修复系统 ABI。编辑文件/system/build.prop
以添加 ARM 支持,在ro.product.cpu.abilist and ro.product.cpu.abilist32
. 如果您运行的是 64 位 Android,则必须更改这些行。
ro.product.cpu.abilist=x86_64,x86,arm64-v8a,armeabi-v7a,armeabi
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi
ro.product.cpu.abilist64=x86_64,arm64-v8a
推荐阅读
- java - Java 格式负整数
- html - 在导航元素内垂直对齐 div
- swift - Swift for macOS:如何跨窗口控制器调用函数?
- jquery - 截屏并显示在 Angular 1.6 的新弹出窗口/选项卡中
- azure-virtual-machine - 我的 Azure 门户中突然停止了 100 个 Vm
- elf - ELF - sh_offset 字段的目的是什么?
- ios - 从 xmpp 服务器获取归档消息 - Swift
- yaml - Ansible/yaml:for 语法中的 if 语法
- spring-boot - 在 Spring Boot 中的 @Transactional 方法之后,实体未在 Exposed 中持久化
- javascript - 在 React Js 中禁用元素