Diese Frage kommt von Wie kann ich feststellen, ob meine installierte Android-Version, nicht die CPU, eine 64-Bit- oder eine 32-Bit-Version ist?
Auf Desktop-Computern ist es möglich, ein 32-Bit- Betriebssystem auf einem 64-Bit- Hardwaregerät zu installieren, dh Sie können Ubuntu Linux 32-Bit auf einem AMD FX(tm)-9370 Achtkernprozessor (64-Bit) installieren.
Tritt der gleiche Fall für Android auf? Gibt es eine 32-Bit- und eine 64-Bit-Version für dasselbe 64-Bit-Gerät?
Einige Beispiellinks (wie ROM-Downloads in 32 und 64 Bit für dasselbe Android-Gerät) wären willkommen.
Es wird nicht deutlich erwähnt, aber ich nehme an, Sie sprechen von ARM-Architektur. „32-Bit-Android-Betriebssystem“ bezeichnet einen 32-Bit-Kernel und die Sammlung von ELF-Binärdateien und -Bibliotheken, die für die Ausführung auf einem 32-Bit-Prozessor kompiliert sind. Dieser Middleware-Stack enthält insbesondere app_process
Binärdateien, die mit Namen ausgeführt werden zygote
und das vollständige Anwendungsframework von Android hosten. Es forkt Java Virtual Machines (für jede App), in denen Dalvik EXecutable ( .dex
)-Code läuft, der weder 32-Bit noch 64-Bit ist. Aber die JVMs sind native Prozesse; entweder 32 oder 64 Bit, abhängig von den JNI-Bibliotheken, die die App enthält.
Wir können 32-Bit-Betriebssysteme auf 64-Bit-Geräten ausführen, wenn 64-Bit:
Der Prozessor unterstützt die Ausführung von 32-Bit-Code, was normalerweise der Fall ist, da Abwärtskompatibilität erwünscht ist, aber nicht immer.
Der Kernel unterstützt die Ausführung von 32-Bit-Code, da wir – die Prozesse auf Android – im Gegensatz zu Bare-Metal-Hypervisoren nicht direkt mit der Hardware zu tun haben.
Die Unterstützung aller 64-Bit-Prozessoren für die 32-Bit-Ausführung ist nicht universell. Zum Beispiel enthalten Samsumg Exynos 9 Series 982x SoCs Cortex-A55 und A75, die (basieren auf ARMv8.x und sie) Unterstützung für aarch64
und haben aarch32
. Auf der anderen Seite enthalten Qualcomms Centriq 2400 - SoCs und Caviums Thunder X2 - SoCs ebenfalls ARMv8.x-Prozessoren, jedoch ohne aarch32
Unterstützung.
Um die Gerätearchitektur zu finden, können wir lesen, /proc/cpuinfo
welche Informationen aus dem Haupt-ID-Register des Prozessors verfügbar sind.
~$ cat /proc/cpuinfo
...
CPU implementer : 0x41
CPU architecture: 8
...
CPU part : 0xd03
...
Hardware : Qualcomm Technologies, Inc MSM8953
Aber es gibt keine direkten Informationen wie lm
ein Flag, um die 32/64-Bit-Unterstützung zu bestätigen. Wir brauchen also technische Details der Hardware. Gibt gemäß den Anforderungen von Google an, CPU architecture: 8
dass es sich um ein ARMv8
Gerät handelt. Siehe auch diesen Commit . Und hier ist die Hex-to-Mensch-lesbare Dekodierungskarte, die der lscpu
Befehl verwendet.
~$ lscpu | grep -E 'Vendor |Model '
Vendor ID: ARM
Model name: Cortex-A53
Andere Möglichkeiten, SoC-Informationen zu erhalten:
~$ cat /sys/firmware/devicetree/base/model
Qualcomm Technologies, Inc. MSM8953 + PMI8950 QRD SKU3
~$ cat /sys/devices/soc0/{vendor,family,machine}
Qualcomm
Snapdragon
MSM8953
Aus den technischen Spezifikationen von Qualcomm Snapdragon 625 ( MSM 8953 ) und Cortex-53 geht hervor, dass es auf der ARMv8-Architektur basiert, die beide Befehlssätze verarbeiten kann: aarch64
und aarch32
.
Als dem Linux-Kernel arm64
Unterstützung hinzugefügt wurde , war auch der 32-Bit-Kompatibilitätsmodus enthalten. Wenn der Kernel mit gebaut IKCONFIG_PROC
wurde, bestätigen Sie mit:
~# zcat /proc/config.gz | grep -E 'CONFIG_ARM64=|CONFIG_COMPAT=|BINFMT'
CONFIG_ARM64=y
CONFIG_COMPAT=y
CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_BINFMT_SCRIPT=y
Die 64-Bit-ELF-Dateien werden also nativ mit binfmt_elf ausgeführt, während 32-Bit-ELF-Dateien mit compat_binfmt_elf ausgeführt werden . Siehe Details in dieser Antwort .
Wird normalerweise uname -m
verwendet, um die Architektur des vom Kernel unterstützten Geräts zu finden. Es zeigt die Persönlichkeit ( Ausführungsdomäne ) des Prozesses, der standardmäßig auf die primäre Architektur des Kernels ( PER_LINUX
) zurückgreift. Der Linux-Kernel unterstützt jedoch das Ändern von Persoanlity , sodass dieser Ansatz verwirrend sein kann:
~$ uname -m
aarch64
~$ setarch linux32 uname -m
armv8l
Im letzteren Befehl uname
wird unter einer 32-Bit- kompatiblen Persönlichkeit ausgeführt . Dasselbe würde passieren, wenn Sie eine App wie diese verwenden , die mit LINUX32
Personality ausgeführt wird, unabhängig davon, ob Kernel und uname
Binärdateien 64-Bit sind. Einzelheiten finden Sie unter this und this . lscpu
bestätigt auch die CPU-Betriebsmodi unter Verwendung desselben Phänomens.
Jetzt kommt init
der allererste Prozess, der vom Kernel ausgeführt wird, in den Userspace. Lassen Sie uns seine Bitness überprüfen. Wenn das 5. Byte 1 ist, ist es eine 32-Bit-ELF-Datei, wenn es 2 ist, ist die Binärdatei 64-Bit:
~# hexdump -n5 /proc/1/exe
0000000 457f 464c 0002
Oder verwenden Sie den file
Befehl:
~# file /proc/1/exe
/proc/1/exe: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked ...
Überprüfen Sie auf ähnliche Weise die Bitanzahl anderer wichtiger Betriebssystem-Binärdateien/Bibliotheken:
~$ file /system/lib*/libc.so
/system/lib/libc.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked ...
/system/lib64/libc.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked ...
~$ file /system/bin/linker*
/system/bin/linker: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked ...
/system/bin/linker64: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked ...
Das Betriebssystem verwaltet sowohl 64-Bit- als auch 32-Bit-Bibliotheken und dynamische Linker, da Apps beide Arten von Binärcode enthalten können (obwohl der Hauptteil Java/Dalvik-Bytecode sein muss). Beispielsweise ist das dnsmasq
Programm, das als DHCP-Server am Hotspot dient, eine 64-Bit-Binärdatei, während Google Play Services eine 32-Bit-Bibliothek verwendet:
~# readelf -a /system/bin/dnsmasq
Class: ELF64
Type: DYN (Shared object file)
Machine: AArch64
[Requesting program interpreter: /system/bin/linker64]
0x0000000000000001 (NEEDED) Shared library: [libc.so]
~# readelf -a /data/data/com.google.android.gms/app_vision/ocr/libs/armeabi-v7a/libocr.so
Class: ELF32
Type: DYN (Shared object file)
Machine: ARM
[Requesting program interpreter: /system/bin/linker]
0x00000001 (NEEDED) Shared library: [libc.so]
Ebenso ist es nicht ungewöhnlich, 32-Bit-Binär-Blobs von OEMs/SoC-Anbietern auf 64-Bit-ROMs zu haben. Sogar einige grundlegende Komponenten von AOSP werden von 64-Bit nicht unterstützt. Nehmen Sie ein Beispiel für audioserver
.
So sehen Sie alle Prozesse, die im 32-Bit-Modus ausgeführt werden:
~# for p in $(ps -p 2 --ppid 2 --deselect -o pid=); do grep -qE '^.{8}[^-]' /proc/$p/maps || echo $p; done | xargs ps f -o pid,cmd -p
PID CMD
3359 /system/bin/mediaserver
3358 /system/bin/cameraserver
3357 /system/bin/audioserver
3356 zygote
5081 \_ webview_zygote
20824 | \_ com.android.webview:sandboxed_process0
18609 \_ it.colucciweb.vpnclient
3354 /vendor/bin/hw/android.hardware.audio@2.0-service
2665 /vendor/bin/hw/android.hardware.camera.provider@2.4-service
2335 /vendor/bin/mm-qcamera-daemon
2278 /vendor/bin/wifidisplayhalservice
2277 media.codec hw/android.hardware.media.omx@1.0-service
2244 /system/bin/drmserver
777 /vendor/bin/hw/android.hardware.drm@1.1-service.widevine
773 /vendor/bin/hw/android.hardware.cas@1.0-service
Von diesen ist nur eine eine VPN-App, der Rest sind Betriebssystemprozesse.
Es ist also klar, dass, selbst wenn das Kernbetriebssystem 64-Bit ist, möglicherweise eine große Anzahl von Prozessen als 32-Bit ausgeführt werden, obwohl jeder Prozess und seine verknüpften Bibliotheken homogen sein müssen; entweder 32 oder 64 Bit. Und es gibt keine Einschränkung, wenn das Betriebssystem überhaupt keinen 64-Bit-Code enthält, aber Sie werden nicht viele Instanzen finden, da OEMs 64-Bit-Geräte mit 64-Bit-Binärcode ausliefern. Es geht mehr ums Geschäft als um Leistung; Dafür zahlt ein Benutzer. Es gibt jedoch Ausnahmen, bei denen das Geschäft nicht so sehr involviert ist: Raspberry Pi 3 hat eine 64-Bit-CPU, aber ein 32-Bit-Raspbian-Betriebssystem . Beispiele für Android-Telefone aus der Vergangenheit sind Galaxy E5, LG G Stylo, Moto G5 Plus, Lenovo A6000 Plus und MT6735-Geräte. Aber jetzt bewegt sich Android in Richtung 64-Bit und einige Geräte werden möglicherweise fallen gelassen32-Bit-Unterstützung schrittweise.
Tritt der gleiche Fall für Android auf? Gibt es eine 32-Bit- und eine 64-Bit-Version für dasselbe 64-Bit-Gerät?
Ja, nehmen Sie das Beispiel Moto G4 Plus .
VERWANDT: Android-Apps für „armeabi-v7a“- und „x86“-Architektur: SoC vs. Prozessor vs. ABI
Antwort ist ja. Sie können 32-Bit-Android auf 64-Bit-Chipsätzen ohne große Probleme ausführen. Aber es sollte eigentlich egal sein, auf welcher Version Sie sich befinden, da derzeit 90% aller verfügbaren Apps 32-Bit sind und keine 64-Bit-Hardware verwenden.
Ja, du kannst. Tatsächlich haben einige frühe Geräte genau das getan. Es ähnelt dem, was wir auf der Desktop-Computing-Seite haben. Moto E2 ist ein Beispiel für einen 64-Bit-Prozessor, auf dem ein 32-Bit-Betriebssystem ausgeführt wird.
Sopalajo de Arrierez
Dan Hulme