V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Kasumi20
V2EX  ›  程序员

x86 架构的处理器可以运行 armeabi-v7a 指令吗?

  •  
  •   Kasumi20 ·
    develon2015 · 2022-07-12 11:54:10 +08:00 · 2075 次点击
    这是一个创建于 890 天前的主题,其中的信息可能已经有所发展或是发生改变。

    发现微信安卓客户端只发布 arm32 和 64 位的,用一个 x86 的模拟器居然可以运行,why?

    11 条回复    2022-07-15 13:09:49 +08:00
    Kasumi20
        1
    Kasumi20  
    OP
       2022-07-12 11:58:42 +08:00
    我去,居然是这样的
    Kasumi20
        2
    Kasumi20  
    OP
       2022-07-12 11:58:46 +08:00
    Android CPU 架构在当前市场的占有率
    Android 目前支持 7 种 ABIs:mips, mips64, X86, X86–64, arm64-v8a, armeabi, armeabi-v7a



    arm64-v8a: 第 8 代、64 位 ARM 处理器,目前主流版本。

    armeabi-v7a: 第 7 代及以上的 ARM 处理器,2011 年 15 月以后的生产的大部分 Android 设备,现在以 arm64-v8a 为多。

    armeabi: 第 5 代、第 6 代的 ARM 处理器,早期的手机用的比较多,可以兼容所有 ARM 设备,速度比较慢。

    x86 / x86_64: 平板、模拟器用得比较多,x86 架构的手机都会包含由 Intel 提供的称为 Houdini 的指令集动态转码工具,实现对 arm .so 的兼容,而且目前 x86 市场占有率很低,可能只有 1%,所以 x86 相关的两个 so 文件是可以忽略的。

    mips / mips64: NDK 以前支持 ARMv5 (armeabi) 以及 32 位和 64 位 MIPS ,但 NDK r17 已不再支持,极少用于手机,可以忽略。



    目前手机市场上,x86 / x86_64/armeabi/mips / mips6 的架构,基本可以不不考虑了,它们的占有量应很少很少了,arm64-v8a 作为最新一代架构,应该是目前的主流,armeabi-v7a 只存在少部分老旧手机。
    yolee599
        3
    yolee599  
       2022-07-12 12:28:11 +08:00 via Android
    你确定你的模拟器是原生 x86 镜像的?而不是在运行在 x86 平台上的 arm 镜像?
    Kasumi20
        4
    Kasumi20  
    OP
       2022-07-12 12:39:01 +08:00
    @yolee599 那肯定啊,cpuinfo 查过,可执行文件拉下来也是 Intel 80386 可执行文件
    ysc3839
        5
    ysc3839  
       2022-07-12 13:06:41 +08:00 via Android
    在系统中模拟执行的,不需要整个系统都模拟
    kuro1
        6
    kuro1  
       2022-07-12 13:37:57 +08:00
    Android 11 ( API 30 ) x86 系统镜像文件(中)支持 ArmABI
    kuro1
        7
    kuro1  
       2022-07-12 13:40:15 +08:00
    过去,开发者需要通过模拟器镜系统映像搭建一个完整的 ARM 环境,才能绕过这个限制并在 x86 机器上执行 ARM 应用。但是,把整个系统的 ARM 指令都转换成 x86 指令会造成过高的性能负荷,因此与基于 x86 的系统映像相比,完整的 ARM 系统映像在 x86 宿主机上的运行速度会慢很多,而且它还无法使用 x86 处理器提供的硬件加速和 CPU 虚拟化技术。

    全新的 Android 11 系统映像与 ARM 兼容,它不仅允许整个系统在本机运行 x86 指令,而且还可以照常使用虚拟化技术。当应用的某个进程需要使用 ARM 二进制代码时,代码仅会在该进程内被转换成 x86 指令,其余进程将继续在 x86 环境内执行,包括 Android 运行时 (ART) 以及其它性能关键库,例如 libGLES 和 libvulkan 。除此以外,指令转换器也不会执行低层的硬件特定库,从而避免高成本的内存访问检测和相应的性能影响。在 ARM 公司的协作下,新的模拟器系统映像在本地和持续集成框架内均可运行。
    0o0O0o0O0o
        8
    0o0O0o0O0o  
       2022-07-12 13:44:11 +08:00 via iPhone
    libhoudini
    David1119
        9
    David1119  
       2022-07-12 18:18:28 +08:00
    flyqie
        10
    flyqie  
       2022-07-13 06:22:47 +08:00 via Android
    是的,目前见到的多数模拟器都是直接用的 libhoudini 这种成熟的方案。

    没记错的话类似方案 google 好像也搞了一套扔在开发者工具,不过没有多少人会拿来用在正式产品上。

    #3 说的 x86 跑 arm 镜像,基本不可能。首先性能堪忧,其次目前大部分模拟器都是用的 virtualbox(virtualbox 貌似不支持 x86 模拟 arm)。

    #6 说的 android11 模拟器镜像感觉很可能就是加了上文说的方案(时间线搞不太清,不是专职 android)

    #9 说的 unicorn ,这个太底层了,通过它来直接开发,成本较高(有些 lib 还是得调 x86 的,全 qemu 模拟那性能没法看了)。
    rev1si0n
        11
    rev1si0n  
       2022-07-15 13:09:49 +08:00
    用的 Intel 的 houdin 转译的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1239 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:48 · PVG 01:48 · LAX 09:48 · JFK 12:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.