如何在 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 ?或者是我缺失了什么文件吗?

谢谢各位

8952 次点击
所在节点    Android
26 条回复
BrokenVns
2021-07-16 23:39:37 +08:00
能申请经费的话,2000-3000 买块 Android 推荐的开发版( https://source.android.google.cn/setup/build/devices )或者弄台 M1(最快的 Android 模拟器)。源码编译的话我觉得可以考虑使用 cuttlefish 替代 QEMU,我自己的体验来说 cuttlefish 版比 qemu 版快一些。https://source.android.google.cn/setup/create/cuttlefish
MiketsuSmasher
2021-07-17 10:03:33 +08:00
如果只是调试,可以考虑用 BlissOS-x86,最新版本的安卓 9 镜像支持绝大多数 arm 应用,虽然不知道他们的 houdini 是从哪里来的
Rheinmetal
2021-07-17 10:26:31 +08:00
小黄鱼捡工作室淘汰手机 然后刷机 这个方案省事一点 吧
zhanlanhuizhang
2021-07-21 17:18:21 +08:00
你直接买个小米手机,刷个自己编译的系统。不然使用虚拟机就只有 x86,x86_64 。现在好像没有看懂 arm 的虚拟机。
baymaxx
2021-07-30 19:57:43 +08:00
@BrokenVns 我想问一下,这个 cuttlefish 其他版本你能跑起来吗,我目前只能跑起来最新版本的也就是 Android T,我想在 https://ci.android.com/ 这个上面找到 Android 11 和 Android 10 的镜像发现跑不起来。。。
baymaxx
2021-08-03 21:06:33 +08:00
@BrokenVns cuttlefish x86 的镜像能跑 arm 的应用吗?

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

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

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

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

© 2021 V2EX