发现微信安卓客户端只发布 arm32 和 64 位的,用一个 x86 的模拟器居然可以运行,why?
1
Kasumi20 OP 我去,居然是这样的
|
2
Kasumi20 OP 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 只存在少部分老旧手机。 |
3
yolee599 2022-07-12 12:28:11 +08:00 via Android
你确定你的模拟器是原生 x86 镜像的?而不是在运行在 x86 平台上的 arm 镜像?
|
5
ysc3839 2022-07-12 13:06:41 +08:00 via Android
在系统中模拟执行的,不需要整个系统都模拟
|
6
kuro1 2022-07-12 13:37:57 +08:00
Android 11 ( API 30 ) x86 系统镜像文件(中)支持 ArmABI
|
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 公司的协作下,新的模拟器系统映像在本地和持续集成框架内均可运行。 |
8
0o0O0o0O0o 2022-07-12 13:44:11 +08:00 via iPhone
libhoudini
|
9
David1119 2022-07-12 18:18:28 +08:00
|
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 模拟那性能没法看了)。 |
11
rev1si0n 2022-07-15 13:09:49 +08:00
用的 Intel 的 houdin 转译的
|