如何在 x86 上编译安卓系统,使其支持安装 ARM 架构的 apk,并且能够在 x86 上使用模拟器运行?

2021-07-16 11:00:09 +08:00
 strawberrydafu

实验室有工作需要修改安卓系统,然后在上面跑从安卓市场爬下来的大批量应用。

编译的安卓系统不支持 ARM

现在存在的问题是,从安卓市场里爬下来的应用都是 ARM 架构的,在编译好的安卓系统里安装时会报错 使用的安卓源码版本是android-9.0.0_r36 编译命令为

export OUT_DIR_COMMON_BASE=/out
source ./build/envsetup.sh
lunch sdk_phone_x86-userdebug
make -j20

# 编译完成后运行模拟器
emulator

之后用 adb 安装某新闻应用com.ss.android.article.news_8.3.3.apk会报错

Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]

推测是 apk 用到了 arm 架构的二进制文件,没办法在 x86 架构上跑。在网上搜索了一下,发现 x86 好像也是能运行 arm 模拟器的,但是运行效率会很低。于是换了一个目标文件夹自己尝试了一下编译了一个新版本 ( lunch 使用第一个默认选项 aosp_arm-eng )

make clobber
export OUT_DIR_COMMON_BASE=~/out-arm
source ./build/envsetup.sh
lunch aosp_arm-eng
make -j20

# 编译完成后运行模拟器
emulator

但是此时模拟器长时间黑屏,无法启动。不清楚是什么原因

Android Studio 中的系统映像支持 ARM

之后搜索了一下,发现在 Android 文档中提到了运行 ARM 的方法

Android 9 和 11 系统映像对 ARM 二进制文件的支持

如果您之前因为应用依赖 ARM 二进制文件而无法使用 Android 模拟器,那么现在您可以使用 Android 9 x86 系统映像或任何 Android 11 系统映像来运行应用,而无需再下载特定的系统映像来运行 ARM 二进制文件。这些 Android 9 和 Android 11 系统映像默认支持 ARM,而且与采用完全 ARM 模拟的系统映像相比,它们提供显著提升的性能。

做了以下尝试:

  1. 从 Android Studio 里获取的 Android9 和 Android11 系统映像都能进行com.ss.android.article.news_8.3.3.apk的安装。(说明从 AS 获取的系统映像支持 ARM 架构的 apk )
  2. 同时也试了一下 Android Studio 中 ARM 的模拟器( Pixel2 XL,android7.1.1 armv7 ),能运行起来,但是确实非常卡顿。这时使用 adb 安装com.ss.android.article.news_8.3.3.apk无法得到响应(输入命令后长时间内命令行无反馈)。对于低版本的 x86 模拟器的模拟器( Pixel2 XL,android7.1.1 x86 ),则会报错Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113](架构错误会报错,但架构正确也不一定能安装)

现在我的主要问题是以下两个:

  1. 是否一定能确认安装失败的原因是架构问题?
  2. 应该用什么配置编译安卓,使得 x86 的系统映像支持 arm ?或者是我缺失了什么文件吗?

谢谢各位

13123 次点击
所在节点    Android
26 条回复
winterbells
2021-07-16 11:45:18 +08:00
没看懂,大部分的安卓应用不都是四种架构都有吗( x86 x8664 arm arm64-va8 )

去 apkmirror 下?
strawberrydafu
2021-07-16 12:34:55 +08:00
@winterbells 研究是要对国内应用进行检测。检测的环境需要通过修改安卓系统来进行构建(获取部分库的调用信息)。因此需要跑的是国内的应用,但很多国内应用都没办法在 apkmirror 里找到。
目前来说最方便的方法就是从部分应用商店的网页爬,这时没办法选择架构,默认下载下来的版本就是对应 arm 架构的。如果能下载到 x86 架构的应用,这个问题也能绕过去。(我试着联系过几家国内的应用商店,不过都石沉大海了
vk42
2021-07-16 12:52:04 +08:00
基本无解,找老板要钱买个性能好点的电脑吧……
nicocho
2021-07-16 14:00:06 +08:00
现在 Android 应用开发给 Apk 瘦身, 第一条就是条件允许的前提下,只保留 ARM-V7 之类动态库。
因为市面上 X86 的 Android 设备市场占有率基本可以忽略。
0o0O0o0O0o
2021-07-16 14:16:34 +08:00
因为就是不支持,常用模拟器已经一些极少数的 x86 设备靠的是 libhoudini,Google 在较新版本的 android studio 的 emulator 里也提供了类似方案以适配高版本的 Android

https://github.com/geeks-r-us/anbox-playstore-installer

https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html?m=1
trgl
2021-07-16 14:22:12 +08:00
退而求其次,弄个树莓派?
nieyujiang
2021-07-16 14:23:01 +08:00
现在市面上还有 x86 的安卓手机么......
tomato1111
2021-07-16 14:27:15 +08:00
arm 转 x86 的安卓虚拟机效率极底。。。你那个黑屏很有可能只是系统还在启动。。。不是开玩笑。。。。 安卓官方这些模拟器,尤其是转译的没有任何实用价值。。。建议还是用第三方游戏模拟器的,比如 mumu,夜神,蓝叠之类的,他们兼容 arm 而且效率也可以
aneostart173
2021-07-16 14:33:30 +08:00
qemu 模拟 arm 啊。
NSAgold
2021-07-16 15:01:04 +08:00
houdini 二进制转换库
当初 intel 的 atom 平板用的这个来运行 arm 的应用
ch2
2021-07-16 15:12:44 +08:00
用 houdini 就行了,x86 转译 arm 效果还是不错的,只是有的 app 会检测架构是不是 x86,不是 arm 就不提供正常功能
imcczy
2021-07-16 15:58:40 +08:00
1. 就是架构的问题
2. 这个情况太多,别人根本没法帮你下结论

此外,别信什么 houdini 什么的,此项目 Intel 早就不做了,多年未更新,你要大批量跑 App 必然会遇到 bug 。但最近 Google 官方貌似出了一个类似的,可以试试
其实你这个场景,华为的 ARM 服务器非常适合,支持 qemu+aosp7/9 或者 anbox,原生 arm 支持。48 核 916 或者 96 核 920 任君选
ReferenceE
2021-07-16 16:04:53 +08:00
好家伙,你就是微软员工负责 win11 安卓子系统的是吧
0o0O0o0O0o
2021-07-16 16:33:41 +08:00
@imcczy #12

houdini 是市面模拟器主流方案吧? bug 虽然有,但我觉得目前是比 Google 那个 arm translation 好太多了,缺点只是 Android 版本低。

我的体验是:

arm 的云手机(也包括你说的自己跑 qemu+aosp )才是真的难搞,那些做黑产的专项优化的云手机我不清楚,但我个人能买到的或者 github 能找到的此类方案,大部分适配真的成问题。比如 aws 上的 genymotion cloud arm,闪退率惊人,没有仔细研究,看日志大概都是有些东西没模拟全,还不如它的 x86 版本+libhoudini 。。。

而 anbox 的主要优势我觉得在于 lxc 和开源,论兼容(此处兼容和传统意义上的兼容有些不一样,要包括反检测)和商业模拟器是没法比的,它也不在意这一点,跑楼主的需求,会需要写大量的反检测。

https://www.genymotion.com/blog/just-launched-arm-native-android-in-the-cloud-environment-on-aws/
0o0O0o0O0o
2021-07-16 16:39:57 +08:00
@imcczy
@0o0O0o0O0o #14

其实我也知道 arm+kvm 是上限很高的方案,x86 转译太容易被检测,只是我目前没有找到很成熟的方案或者产品,如果是我接触的局限,你可以推荐一下,我一直很向往云手机。。。
imcczy
2021-07-16 16:48:28 +08:00
@0o0O0o0O0o #14

官方 emulator 就是 qemu 呀

成熟商用方案目前是没有的,尤其是有特殊需求的,得自己做。华为一直说要对外商用。
华为这套基础软硬件我们用着还行,当然前后做了很多定制的优化,以及外围服务等。
供参考: https://support.huaweicloud.com/kunpengcps/kunpengcps.html
PS:我也见过把几十块 rk3399 板集成在一起的" 服务器"...
strawberrydafu
2021-07-16 17:21:59 +08:00
谢谢各位回复。
我最开始是比较想知道如何编译出 android studio 中提供的镜像( android9 & 11 兼容 arm ),不过看起来 houdini 和 anbox 也满足需求,我这两天先尝试一下。
项目需要修改密码学库代码( JCE & JCA ),还不太清楚 Anbox 是否能够容易地进行相应修改
strawberrydafu
2021-07-16 17:24:47 +08:00
另外服务器相关的方案不太清楚开销是否能承受(项目要跑大量应用),直觉上讲优先级可能比较低
3dwelcome
2021-07-16 17:58:29 +08:00
国内的 PC 模拟器基本上都是 houdini 技术,又不可能自己来写 arm -> x86 转译器。
ryh
2021-07-16 19:26:23 +08:00
买个 arm64 的 chromebook 来测试? 必须使用 x86 吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/789860

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX