@
Pzdmultiverse #17
安卓当年本来就有对应很多 CPU 架构的版本。涉及到很多底层的东西,不是换个驱动重新编译就可以解决的。你要是有兴趣的话,可以试着编译一下 OpenWRT,之后在 MIPS, X86, ARM 架构的设备上面跑一下,东西也都很便宜。买有官方支持的设备就行了,最好是不用改造的那种
把 Android 移植到 X86 上,得到的是可以运行 Android X86 版本软件的 Android X86 版本系统。比如 Linux 就可以移植到很多不同的 CPU 上,移植过后软件通常是要重新编译才可以用的,当然如果涉及到了内联汇编或者是对寄存器操作的那种,重新编译也没用,得重新写
但是当时 Android 下的软件大部分都是跑在 Dalvik VM 上的,本身被编译成了与 CPU 无关的字节码,所以移植了 Dalvik VM 就可以了。不过,很多软件都通过 Android NDK
调用了一些.so 的二进制文件,这个是和架构有关的,是原生代码而不是需要虚拟机进行翻译的字节码。特别是游戏引擎由于效率的原因一般是用 Android NDK 来调用原生代码
安卓的软件基本上都是跑在用户态的,用户态提供二进制翻译是有很多办法的,Intel 在那个时候做了 Houdini,可以解决大部分时候的问题。不过 Android X86 版本的 SDK 和 NDK 早就有了吧,感觉要比 Houdini 早出一些
异构虚拟化的性能损失非常大,以前没有普及 llvm 甚至 jit 都不普及的时候是非常慢的,这点和通过处理器自己的硬件虚拟化特性来运行同构的虚拟机是不一样的
至于指令集不一样无法运行,我以前遇到过不少。在很多年以前 ARM 架构还不像这么普及,还有不少 MIPS 架构的产品。哪怕 ARM 本身,也存在着互不兼容的 ARM9 ARM11 ARMv6 ARMv7,还存在着是否有硬件 FPU 的区别。在安装 APK 的时候,如果软件使用了 NDK,会检查是否有对应架构的二进制文件,没有的话会拒绝安装。哪怕是现在,也有 ARMv7 和 ARMv8 这 2 种,不过 ARMv8 一般是 64 位的(也有 32 位的 Cortex A32 架构以及许多采用了 Cortex A53 甚至更好的架构的产品中使用了 32 位 Android 所以无法支持 64 位 ARMv8 软件的情况)。大部分的 ARMv8 CPU 是支持 ARMv7 的,安卓系统也是支持的,所以软件只用做 ARMv7 的就可以跑了,但是如果是 ARMv8 的软件,装在 ARMv7 的设备上是不能跑的,一般连安装都不行