标题几乎是不言而喻的:Android是32位还是64位操作系统?我认为这是一个或另一个,而不是两者兼而有之,因为这将迫使32位和64位二进制文​​件都托管在Google Play上。我知道这是一个简单的问题,并且其他人也一直在问这个问题,但是对于我的一生,我一直无法在网络上找到答案,而且此SE肯定没有一个答案。

#1 楼

在常见的ARM芯片组领域中,整个Android堆栈(来自基于Linux的几乎相同的内核)实际上是32位的,通常是从32位/ 64位主机环境(即主机环境)交叉编译的通常是Linux的发行版之一。 Google推荐的用于构建和交叉编译Android的发行版是Ubuntu。

Android运行时库(媒体,图形,文件系统,仅举几例)也是32位的,但是正如我们到达dalvikvm的层时,此时的位数变得无关紧要,来自Google Play商店的apk是本机字节码(生成的Java代码的“副产品”编译成可移植字节码)以DalvikVM(虚拟机)为目标,DalvikVM(虚拟机)依次翻译和翻译以原始ARM指令集为目标的字节码。

Froyo是最后一个在32位托管环境下进行交叉编译的Android。目标是ARM芯片组。

Gingerbread是“未来” Android的第一个,大约在三年前,它提出了使用内置64位托管环境的要求。有很多技巧可以使Gingerbread在32位托管环境下构建。

ICS和JB以及更高版本现在肯定需要64位环境才能加快编译速度并减少构建的周转时间。

总而言之,您在Play商店中看到的内容与使用32位还是64位无关,因此无关紧要。

旁注:典型的16GB RAM /四元组核心/ 64位Linux发行版,从头开始构建ICS所花费的时间最多为30分钟,如果这是32位Linux发行版,则需要更长的时间,实际上,这可能会导致CPU崩溃,原因很简单,即处理量不足搅动和编写出交叉编译的代码的能力,这是一个非常苛刻且费力的过程!提取在/system/bin/system/xbin中找到的任何本机ARM二进制文件,例如/system/bin/dalvikvm,这是负责Java和APK上层的Dalvik VM二进制文件。

现在,通过发出来检查二进制文件该命令:file dalvikvm给出了文件类型的摘要,预期输出为:dalvikvm:ELF 32位LSB可执行文件,ARM,版本1(SYSV ),
动态链接(使用共享库),已剥离


注意对32位ELF的引用,并且已交叉编译到ARM并且是二进制可执行文件。 br />
继续,让我们检查在/system/lib中找到的本机共享库,例如/system/lib/libandroid_runtime.so,现在发布file libandroid_runtime.so,预期输出将是这样的:


libandroid_runtime.so:ELF 32位LSB共享对象,ARM,版本1
(SYSV),动态链接,已剥离


再次,请注意,其32位ELF,交叉编译到ARM并是一个共享库。

关键o主机的交叉编译可在AOSP源码中找到,即Gingerbread构建最初要求在64位主机系统上构建,这里是新闻组链接,指的是如何修补脚本以使其在32位主机上构建在AOSP的Gerrit审查中找到了针对build/core.mkbuild/main.mk(组合)的两个补丁。在32位平台上编译ICS的过程,该过程耗时3天(这是Zte Blade的ICS端口)。现在,要求提高了,您确实需要64位主机才能从ICS向上交叉编译AOSP :)

评论


那么,您是说在32位Android操作系统上编译和运行操作系统所需的时间要比64位操作系统慢?对于Kitkat或L等现代Android操作系统,是否都必须全为64位?

– David Dimalanta
2014年9月18日在8:00

现在有运行64位Android的64位ARM设备。

–马修·雷德(Matthew Read)
16 Mar 10 '16 at 5:20

我之所以投票,是因为大多数答案是关于用来编译Android的环境,这与问题完全无关。

–丹·赫尔姆
16年6月12日在8:29

@DanHulme这个答案发布于4年前...是的,从那时起,情况发生了很大变化。 :)

– t0mm13b
16年6月12日在10:11



是的,的确如此,我将就今天的情况发布一个新的答案,但是编译环境一直是一个麻烦。

–丹·赫尔姆
16年6月12日在17:27

#2 楼

最初,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位进行编译。

#3 楼

目前所有ARM芯片均为32位。因此,Android当前在32位环境中执行所有代码。

64位处理器将于2014年推出。

评论


Forsyth说,这并不是可靠的消息来源,因为这是在谈论服务器,引用“智能手机还有点距离”。我们在Android /智能手机/平板电脑的背景下谈论ARM。

– t0mm13b
13年1月4日在16:49

#4 楼


Android是32位还是64位操作系统?我认为这是一个或另一个,而不是两者兼而有之,因为这将迫使32位和64位二进制文​​件都托管在Google Play上。


实际上都没有。 Android是基于Dalvik VM的操作系统,而Google Play托管Dalvik应用程序。不论物理计算机的位数如何,Dalvik VM本身都像Java VM一样始终为32位。

您怀疑,本机二进制文件附带的应用程序和NDK应用程序必须随每个二进制文件编译的二进制文件一起提供旨在运行的体系结构。 Android上最常见的架构是ARM 32位。但是,有些设备也可以在x86和MIPS上运行。

#5 楼

我只是在猜测,但我认为这也可以解释它很简单。这取决于您使用的设备,有四种操作系统,分别是ARM,ARM 64,X84和X84_64。 ARM是流行的32位平台,ARM 64也是流行的但64位平台,X84是罕见的平台,在Zenfones上使用,与X84_64罕见的平台,在Android仿真器上使用一样。我在Open Gapps上获得了此操作系统信息