Answers:
在常见的ARM芯片组领域中,整个Android堆栈(来自基于Linux的几乎相同的内核)实际上是32位的,通常是从32位/ 64位主机环境(即主机环境)交叉编译的通常是Linux的发行版之一。Google推荐的用于构建和交叉编译Android的发行版是Ubuntu。
Android运行时库(媒体,图形,文件系统,仅举几例)也是32位的,但是当我们到达dalvikvm的层时,此时的位数变得无关紧要, Google Play商店中的本地字节码(生成的Java代码的“副产品”,被编译为可移植字节码)针对DalvikVM(虚拟机),DalvikVM(虚拟机)依次解释和转换以原始ARM指令集为目标的字节码。
Froyo是最后一个在32位托管环境下启用编译的Android,在该环境中,它针对ARM芯片集进行了交叉编译。
Gingerbread是“未来” Android的第一个,大约在三年前,当时提出了使用构建它的64位托管环境的要求。有很多技巧可以使Gingerbread在32位托管环境下构建。
ICS和JB以及更高版本现在肯定需要64位环境才能加快编译速度并减少构建的周转时间。
综上所述,在Play商店中看到的内容与使用32位还是64位无关,因此无关紧要。
旁注:典型的16GB RAM / Quad core / 64bit Linux发行版,从头开始构建ICS所花费的时间最多为30分钟,如果这是32bit Linux发行版,则需要更长的时间,实际上,这可能会导致CPU崩溃简而言之,没有足够的处理能力来搅动和处理交叉编译的代码,这是一个非常艰巨且费力的过程!
拉入在/system/bin
或中找到的任何本机ARM二进制文件/system/xbin
,例如/system/bin/dalvikvm
Dalvik VM二进制文件,负责Java和APK的上层。
现在,通过发出以下命令检查二进制文件:file dalvikvm
它给出了文件类型的摘要,预期的输出为:
dalvikvm:ELF 32位LSB可执行文件,ARM,版本1(SYSV),动态链接(使用共享库),已剥离
注意,对32位ELF的引用是交叉编译到ARM的,并且是二进制可执行文件。
继续,让我们检查在中找到的本机共享库/system/lib
,例如/system/lib/libandroid_runtime.so
,now issue file libandroid_runtime.so
,预期输出为:
libandroid_runtime.so:ELF 32位LSB共享库,ARM,版本1(SYSV),已动态链接,已剥离
再次注意,它的32位ELF被交叉编译到ARM,并且是一个共享库。
主机交叉编译的关键可以在AOSP源代码中找到,即Gingerbread构建最初要求在64位主机系统上进行构建,这里是新闻组的链接,指的是如何修补脚本以使其得以构建。 32位主机具有两个修补程序,在此处找到,用于AOSP的Gerrit审查build/core.mk
和build/main.mk
(合并)。
随后的结果是,此补丁进入了ICS的构建脚本,在该脚本中,我确实有幸在32位平台上编译了ICS,该平台花了3天的时间进行构建(这是Zte Blade的ICS移植)。现在,要求斜坡上升,你就一定需要64位主机,以便从ICS建设AOSP向上的交叉编译:)
最初,Android仅用于32位处理器;特别是32位ARM处理器。后来,英特尔和MIPS也投入了很多资金来使Android也支持其架构:但仍然只有32位处理器。他们能够做到这一点而没有(很多)兼容性问题,因为大多数应用程序都不是二进制文件。它们以Java语言编写,而是以字节码形式交付,运行应用程序时,手机上的虚拟机将编译为手机的体系结构。一些应用程序包括本机组件,以二进制形式提供。这样做是为了使某些类型的应用程序(尤其是游戏)更快,或者使该应用程序访问Java中不可用的C库。这些应用程序可以为本地代码部分包含多个二进制文件,以允许它们在不同的体系结构上运行。即便如此,大多数应用程序仅使用Java,因此它们可以在任何体系结构上运行。
在编写此问题(以及其他大多数答案)时,以上内容都是正确的,但不再适用。Lollipop引入了对新的64位ARM处理器(ARMv8)以及Intel和AMD的x86_64处理器,这意味着Android现在支持32位和64位处理器。Nexus 9是第一款旗舰64位Android设备。除了提供对新指令集扩展的访问权限之外,64位支持还意味着应用程序可以使用超过4 GB的RAM。大多数应用程序并不需要那么多,但是高端游戏和照片/视频创建软件肯定可以利用它:将Android推向控制台质量游戏(包括VR游戏)和内容创作平台。无需更新Java应用程序即可利用此优势,因为虚拟机始终将其编译为手机的体系结构,但是具有本机代码的应用程序将进行编译。
因为ARMv8向后兼容32位代码(x86_64仍可以运行x86代码的方式相同),所以即使包含32位处理器的本机代码的应用程序仍可以在64位Android上运行。因此,只有包含本地代码并且想要利用更高的RAM限制或体系结构的新功能的应用程序才需要针对64位进行编译。
当前所有ARM芯片均为32位。因此,Android当前在32位环境中执行所有代码。
64位处理器定于2014年推出。