V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
strawberrydafu
V2EX  ›  Android

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

  •  
  •   strawberrydafu · 99 天前 · 2624 次点击
    这是一个创建于 99 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    编译的安卓系统不支持 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 ?或者是我缺失了什么文件吗?

    谢谢各位

    26 条回复    2021-08-03 21:06:33 +08:00
    winterbells
        1
    winterbells   99 天前
    没看懂,大部分的安卓应用不都是四种架构都有吗( x86 x8664 arm arm64-va8 )

    去 apkmirror 下?
    strawberrydafu
        2
    strawberrydafu   99 天前
    @winterbells 研究是要对国内应用进行检测。检测的环境需要通过修改安卓系统来进行构建(获取部分库的调用信息)。因此需要跑的是国内的应用,但很多国内应用都没办法在 apkmirror 里找到。
    目前来说最方便的方法就是从部分应用商店的网页爬,这时没办法选择架构,默认下载下来的版本就是对应 arm 架构的。如果能下载到 x86 架构的应用,这个问题也能绕过去。(我试着联系过几家国内的应用商店,不过都石沉大海了
    vk42
        3
    vk42   99 天前
    基本无解,找老板要钱买个性能好点的电脑吧……
    nicocho
        4
    nicocho   99 天前
    现在 Android 应用开发给 Apk 瘦身, 第一条就是条件允许的前提下,只保留 ARM-V7 之类动态库。
    因为市面上 X86 的 Android 设备市场占有率基本可以忽略。
    0o0O0o0O0o
        5
    0o0O0o0O0o   99 天前 via iPhone
    因为就是不支持,常用模拟器已经一些极少数的 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
        6
    trgl   99 天前
    退而求其次,弄个树莓派?
    nieyujiang
        7
    nieyujiang   99 天前
    现在市面上还有 x86 的安卓手机么......
    tomato1111
        8
    tomato1111   99 天前 via Android
    arm 转 x86 的安卓虚拟机效率极底。。。你那个黑屏很有可能只是系统还在启动。。。不是开玩笑。。。。 安卓官方这些模拟器,尤其是转译的没有任何实用价值。。。建议还是用第三方游戏模拟器的,比如 mumu,夜神,蓝叠之类的,他们兼容 arm 而且效率也可以
    aneostart173
        9
    aneostart173   99 天前
    qemu 模拟 arm 啊。
    NSAgold
        10
    NSAgold   99 天前
    houdini 二进制转换库
    当初 intel 的 atom 平板用的这个来运行 arm 的应用
    ch2
        11
    ch2   99 天前
    用 houdini 就行了,x86 转译 arm 效果还是不错的,只是有的 app 会检测架构是不是 x86,不是 arm 就不提供正常功能
    imcczy
        12
    imcczy   99 天前
    1. 就是架构的问题
    2. 这个情况太多,别人根本没法帮你下结论

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

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

    官方 emulator 就是 qemu 呀

    成熟商用方案目前是没有的,尤其是有特殊需求的,得自己做。华为一直说要对外商用。
    华为这套基础软硬件我们用着还行,当然前后做了很多定制的优化,以及外围服务等。
    供参考: https://support.huaweicloud.com/kunpengcps/kunpengcps.html
    PS:我也见过把几十块 rk3399 板集成在一起的" 服务器"...
    strawberrydafu
        17
    strawberrydafu   99 天前
    谢谢各位回复。
    我最开始是比较想知道如何编译出 android studio 中提供的镜像( android9 & 11 兼容 arm ),不过看起来 houdini 和 anbox 也满足需求,我这两天先尝试一下。
    项目需要修改密码学库代码( JCE & JCA ),还不太清楚 Anbox 是否能够容易地进行相应修改
    strawberrydafu
        18
    strawberrydafu   99 天前
    另外服务器相关的方案不太清楚开销是否能承受(项目要跑大量应用),直觉上讲优先级可能比较低
    3dwelcome
        19
    3dwelcome   99 天前
    国内的 PC 模拟器基本上都是 houdini 技术,又不可能自己来写 arm -> x86 转译器。
    ryh
        20
    ryh   99 天前
    买个 arm64 的 chromebook 来测试? 必须使用 x86 吗?
    BrokenVns
        21
    BrokenVns   99 天前
    能申请经费的话,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
        22
    MiketsuSmasher   98 天前
    如果只是调试,可以考虑用 BlissOS-x86,最新版本的安卓 9 镜像支持绝大多数 arm 应用,虽然不知道他们的 houdini 是从哪里来的
    Rheinmetal
        23
    Rheinmetal   98 天前
    小黄鱼捡工作室淘汰手机 然后刷机 这个方案省事一点 吧
    zhanlanhuizhang
        24
    zhanlanhuizhang   94 天前
    你直接买个小米手机,刷个自己编译的系统。不然使用虚拟机就只有 x86,x86_64 。现在好像没有看懂 arm 的虚拟机。
    baymaxx
        25
    baymaxx   85 天前
    @BrokenVns 我想问一下,这个 cuttlefish 其他版本你能跑起来吗,我目前只能跑起来最新版本的也就是 Android T,我想在 https://ci.android.com/ 这个上面找到 Android 11 和 Android 10 的镜像发现跑不起来。。。
    baymaxx
        26
    baymaxx   81 天前
    @BrokenVns cuttlefish x86 的镜像能跑 arm 的应用吗?
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1429 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 17:41 · PVG 01:41 · LAX 10:41 · JFK 13:41
    ♥ Do have faith in what you're doing.