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

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

  •  
  •   strawberrydafu · 2021-07-16 11:00:09 +08:00 · 13832 次点击
    这是一个创建于 1263 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    编译的安卓系统不支持 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  
       2021-07-16 11:45:18 +08:00
    没看懂,大部分的安卓应用不都是四种架构都有吗( x86 x8664 arm arm64-va8 )

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

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

    官方 emulator 就是 qemu 呀

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