Android #
Android es un sistema operativo, con soporte para ARM y x86, que utiliza el kernel Linux, librerías en Rust/C y la JVM (Java Virtual Machine) para hacer funcionar todo el sistema operativo.
Android fue desarrollado originalmente por Google, ahora siendo desarrollado por la Open Handset Alliance que la conforman; HTC, Sony, Dell, Intel, Motorola, Qualcomm, Texas Instruments, Google, Samsung, LG, T-Mobile, Nvidia, entre muchos otros.
Licenciamiento #
Android está licenciado en “Apache License”, una licencia de fuente abierta (“open source”). Por lo que es normal encontrar en diversos lugares (Github, Gitlab, XDA Developers, etc) versionados (llamados ROMs) de distintas fuentes.
Distribuciones #
Una distribución es todo sistema empaquetado y distribuido (de ahí el nombre) de diferentes formas, cada una con sus propias características. Generalmente se suelen encontrar diferencias pequeñas, aunque es normal (pero menos común) encontrar distribuciones con modificaciones tan profundas que a primera imagen parecen sistemas diferentes.
Acá un listado de distribuciones de Android, cada una con sus características;
-
AOSP (Android Open Source Project)
Es la distribución original de Android, la creada por el consorcio “Open Handset Alliance” y sin productos internos de compañia alguna.
Así mismo, esta distribución es la considerada la “versión pura” debido a que no tiene; personalizaciones, productos internos de compañias, modificaciones internas, etc.
Se debe tener en cuenta que el kernel de esta distribución no tiene driver alguno, por lo que para ser compatible con un dispositivo se debe encontrar una modificación adaptada a ese dispositivo.
Su código se encuentra en este repositorio;
-
Lineage OS
Anteriormente conocido como “CyanogenMod”.
Distribución nacida en el 2016 cuando “CyanogenMod” finalizó como proyecto. A diferencia del primero, este proyecto es comunitario de forma completa, por lo que no lo domina ninguna compañía.
Se basa en AOSP para aplicar modficaciones que le dan muchísima más personalización y poder de control al usuario propietario del dispositivo (overclocking, control de root, etc) sin incluir bloatware (software basura; publicidad, etc) que viene con teléfonos con distribuciones modificadas por compañías.
Así mismo aplica modificaciones en el código de AOSP, en donde generalmente se encargan de hacer modificaciones de performance (optimizaciones a todo nivel) como AudioFX, etc.
Su código se encuentra en estos repositorios;
-
Android x86
Es una distribución de AOSP, pero se enfoca en dar soporte para la arquitectura x86_64.
Hay que tener en consideración que no todas las apps de la Play Store tienen soporte para x86, ya que la mayoría están para ARM64. Por lo que puede ser que algunas aplicaciones no se encuentren disponibles.
Su código se encuentra en este repositorio;
Arquitectura interna #
Todas las distribuciones de Android siguen la misma arquitectura (para mantener la compatibilidad de aplicaciones).
-
Bootloader
Los dispositivos ARM tienen una característica; dependen de una implementación externa para tener un bootloader funcional.
De esta manera nos podemos encontrar diferentes bootloaders dependiendo del fabricante, cada uno tiene su propia implementación. Sumale que al ser propietarios, la mayoría son de código cerrado, sin documentaciones y de extrema dificultad para acceder (es parte del firmware embebido).
El bootloader es el encargado de (en este orden); ver e inicializar la memoria, verificar que los certificados del sistema operativo Android sean del fabricante (que está intrinsicamente relacionado al uso de UEFI y el bloqueo OEM), verificar las particiones “boot”, “dtbo”, “init_boot” y “recovery”, verificar si existen actualizaciones aplicar en el sistema o si al fallar el sistema (o si el usuario mantiene los botones correctos) debe iniciar el modo recovery.
Por último, carga las imágenes de inicio; “boot.img”, “vendor_boot.img”, “init_boot.img” y otras imágenes propietarias del fabricante. Al igual que que u-boot, grub, lilo y demás cargadores carga el kernel y el “initramfs” en memoria.
A partir de Android 12 el bootloader soporta pasar configuraciones al kernel para modificar el inicio por defecto.
En el archivo; system/core/mkbootimg/bootimg.h está la configuración de inicio.
En sistemas Android hablamos del modo “fasboot” cuando podemos interactuar con el bootloader. Sus estados son “LOCKED” ó “UNLOCKED”, dependiendo uno u otro va impedir la instalación de otro SO o no (respectivamente). Por defecto en encuentra en modo “LOCKED”, permitiendo cargar una distribución Android firmada digitalmente por el fabricante. Ese certificado digital es lo que se conoce como “Root of Trust”, y en el dispositivo solamente se encuentra la parte pública de esa llave, el fabricante se queda con la privada. Algunos dispositivos permiten que el usuario indique su propia llave, pero no es la norma.
-
Kernel
Utilizan el kernel Linux con algunas modificaciones para alivianar el mismo.
Seguridad interna #
Correr una distribución Linux dentro sin root #
Acá describo los pasos necesarios para poder ejecutar una distribución Linux dentro de Android sin necesidad de root. Yo elegí la distribución Alpine pero ustedes pueden usar la que quieran, dentro del catálogo disponible claro.
-
Instalar Fdroid
Fdroid es una tienda de aplicaciones opensource (tanto las apps que almacena como la tienda en sí misma) con repositorio de código en;
Para instalarlo van al siguiente enlace y instalan el archivo “apk”; https://f-droid.org/F-Droid.apk
-
Instalar Termux
Desde FDroid instalen Termux, un emulador de terminar con algunas utilidades de sistemas GNU/Linux. No recomiendo la versión que está en la Play Store, ya que esta tiene un teclado mucho peor, la versión proveniente de FDroid tiene un teclado con las teclas de; “tab”, “ctrl”, flechas de dirección (arriba, abajo, izquierda, derecha), “home”, “end”, “/”, “ESC”, “pgup” y “pgdown”
-
Instalar Andronix
Desde la Play Store instalen “Andronix - Linux on Android”