¿Puede un dispositivo de hardware de 64 bits ejecutar una versión de Android de 32 bits?

Esta pregunta proviene de ¿Cómo puedo saber si mi versión de Android instalada, no la CPU, es de 64 bits o de 32 bits?

En las computadoras de escritorio es posible instalar un sistema operativo de 32 bits en un dispositivo de hardware de 64 bits , es decir, puede instalar Ubuntu Linux de 32 bits en un procesador AMD FX(tm)-9370 de ocho núcleos (64 bits).

¿Ocurre lo mismo con Android? ¿Hay una versión de 32 bits y otra de 64 bits para el mismo dispositivo de 64 bits?

Algunos enlaces de ejemplo (como descargas de ROM en 32 y 64 bits para el mismo dispositivo Android) serían bienvenidos.

Respuestas (3)

No se menciona claramente, pero supongo que estás hablando de la arquitectura ARM. “SO Android de 32 bits” significa un núcleo de 32 bits y la colección de archivos binarios y bibliotecas ELF que se compilan para ejecutarse en un procesador de 32 bits. Esta pila de middleware incluye particularmente app_processbinarios que se ejecutan con el nombre zygotey alojan el marco completo de la aplicación de Android. Bifurca Java Virtual Machines (para cada aplicación) en las que .dexse ejecuta el código Dalvik EXecutable ( ), que no es ni de 32 bits ni de 64 bits. Pero las JVM son procesos nativos; ya sea de 32 o de 64 bits, según las bibliotecas JNI que contenga la aplicación.

Podemos ejecutar un sistema operativo de 32 bits en un dispositivo de 64 bits si es de 64 bits:

  1. El procesador admite la ejecución de código de 32 bits, lo que suele ser el caso porque se desea la compatibilidad con versiones anteriores, pero no siempre.

  2. Kernel admite la ejecución de código de 32 bits porque, a diferencia de los hipervisores básicos, nosotros, los procesos en Android, no tratamos directamente con el hardware.

BITNESS DEL PROCESADOR

El soporte de todos los procesadores de 64 bits para la ejecución de 32 bits no es universal. Por ejemplo, los SoC Samsumg Exynos 9 Series 982x contienen Cortex-A55 y A75 que (se basan en ARMv8.x) son compatibles con aarch64y aarch32. Por otro lado, los SoC Centriq 2400 de Qualcomm y los SoC Thunder X2 de Cavium también incluyen procesadores ARMv8.x pero sin aarch32soporte.

Para encontrar la arquitectura del dispositivo, podemos leer /proc/cpuinfoqué expone la información del registro de ID principal del procesador.

~$ cat /proc/cpuinfo
...
CPU implementer : 0x41
CPU architecture: 8
...
CPU part        : 0xd03
...
Hardware        : Qualcomm Technologies, Inc MSM8953

Pero no hay información directa como lmbandera para confirmar el soporte de 32/64 bits. Entonces necesitamos obtener detalles técnicos del hardware. Según los requisitos de Google, CPU architecture: 8indica que es un ARMv8dispositivo. También vea este compromiso . Y aquí está el hexadecimal para el mapa de decodificación legible por humanos que lscpuusa el comando.

~$ lscpu | grep -E 'Vendor |Model '
Vendor ID:           ARM
Model name:          Cortex-A53

Otras formas posibles de obtener información de SoC:

~$ cat /sys/firmware/devicetree/base/model
Qualcomm Technologies, Inc. MSM8953 + PMI8950 QRD SKU3
~$ cat /sys/devices/soc0/{vendor,family,machine}
Qualcomm
Snapdragon
MSM8953

Es evidente a partir de las especificaciones técnicas de Qualcomm Snapdragon 625 ( MSM 8953 ) y Cortex-53 que se basa en la arquitectura ARMv8, que puede procesar conjuntos de instrucciones: aarch64y aarch32.

BITNESS DEL NÚCLEO

Cuando arm64se agregó soporte al kernel de Linux, también se incluyó el modo de compatibilidad de 32 bits. Si el kernel está construido con IKCONFIG_PROC, confirme con:

~# 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

Por lo tanto, los archivos ELF de 64 bits se ejecutan de forma nativa con binfmt_elf , mientras que los archivos ELF de 32 bits se ejecutan con compat_binfmt_elf . Ver detalles en esta respuesta .

Por lo general uname -m, se usa para encontrar la arquitectura del dispositivo compatible con el kernel. Muestra la personalidad ( dominio de ejecución ) del proceso que por defecto es la arquitectura primaria del kernel ( PER_LINUX). Pero el kernel de Linux admite el cambio de personalidad , por lo que este enfoque puede ser confuso:

~$ uname -m
aarch64
~$ setarch linux32 uname -m
armv8l

En último comando se ejecuta bajo personalidad compatibleuname de 32 bits . Lo mismo sucedería si usa alguna aplicación, como esta , que se ejecuta con personalidad, sin importar si el kernel y los binarios son de 64 bits. Para obtener más información, consulte this y this . también confirma los modos de operación de la CPU usando el mismo fenómeno.LINUX32unamelscpu

BITS DE CÓDIGO DE USUARIO

Ahora, llegando al espacio de usuario, inites el primer proceso ejecutado por kernel. Vamos a comprobar su bitness. Si el quinto byte es 1, es un archivo ELF de 32 bits, si es 2, el binario es de 64 bits:

~# hexdump -n5 /proc/1/exe
0000000 457f 464c 0002

O use fileel comando:

~# file /proc/1/exe
/proc/1/exe: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked ...

Del mismo modo, verifique el bitness de otros binarios/bibliotecas vitales del sistema operativo:

~$ 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 ...

El sistema operativo mantiene bibliotecas de 64 y 32 bits y un enlazador dinámico porque las aplicaciones pueden contener ambos tipos de código binario (aunque la mayor parte debe ser el código de bytes de Java/Dalvik). Por ejemplo, el dnsmasqprograma que sirve como servidor DHCP en el punto de acceso es un binario de 64 bits, mientras que Google Play Services usa una biblioteca de 32 bits:

~# 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]

Del mismo modo, no es raro tener blobs binarios de 32 bits de proveedores OEM/SoC en ROM de 64 bits. Incluso algunos componentes básicos de AOSP no son compatibles con 64 bits. Toma ejemplo de audioserver.
Para ver todos los procesos que se ejecutan en modo de 32 bits:

~# 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

De estos, solo uno es una aplicación VPN, el resto son procesos del sistema operativo.

CONCLUSIÓN

Por lo tanto, está claro que incluso si el sistema operativo central es de 64 bits, posiblemente haya una gran cantidad de procesos que se ejecutan como de 32 bits, aunque cada proceso y sus bibliotecas vinculadas deben ser homogéneos; ya sea de 32 o de 64 bits. Y no hay restricción si el sistema operativo no incluye ningún código de 64 bits, pero no encontrará muchos casos porque los OEM envían dispositivos de 64 bits con código binario de 64 bits. Se trata más de negocios que de rendimiento; eso es lo que paga un usuario. Sin embargo, existen excepciones donde el negocio no está tan involucrado: Raspberry Pi 3 tiene una CPU de 64 bits, pero un sistema operativo Raspbian de 32 bits . Los ejemplos de teléfonos Android del pasado incluyen dispositivos Galaxy E5, LG G Stylo, Moto G5 Plus, Lenovo A6000 Plus y MT6735. Pero ahora Android se está moviendo hacia los 64 bits y algunos dispositivos pueden dejar de funcionar .Soporte de 32 bits gradualmente.

¿Ocurre lo mismo con Android? ¿Hay una versión de 32 bits y otra de 64 bits para el mismo dispositivo de 64 bits?

Eso sí, toma ejemplo del Moto G4 Plus .


RELACIONADO: Aplicaciones Android para arquitectura “armeabi-v7a” y “x86”: SoC vs. Procesador vs. ABI

La respuesta es sí. Puede ejecutar Android de 32 bits en conjuntos de chips de 64 bits sin muchos problemas. Pero realmente no debería importar en qué versión estés, porque a partir de ahora el 90% de todas las aplicaciones disponibles son de 32 bits y no utilizarán el hardware de 64 bits.

Algunos enlaces de ejemplo serían bienvenidos.
Su afirmación de que el 90% de las aplicaciones son de 32 bits no tiene sentido, dado que la mayoría de las aplicaciones están escritas en Java y, por lo tanto, son independientes del ISA y el sistema operativo en el que las ejecute.

Sí tu puedes. De hecho, algunos de los primeros dispositivos hicieron exactamente eso. Es similar a lo que tenemos en el lado de la informática de escritorio. Moto E2 es un ejemplo de procesador de 64 bits que ejecuta un sistema operativo de 32 bits.

Algunos enlaces de ejemplo serían bienvenidos.