Diferencias entre Sistemas Operativos Android y Linux
Android es un sistema operativo basado en Linux, sin embargo, ambos presentan diferencias significativas que resultan en una clara diferencia entre los dos sistemas operativos.
El kernel de Linux soporta varias arquitecturas, aunque, por contraposición, sólo 2 son soportadas completamente por Android: la arquitectura x86 y ARM. Mientras que la primera suele estar enfocada principalmente hacia ordenadores de escritorio de propósito general, portátiles y servidores, la segunda es ampliamente utilizada en dispositivos móviles.
Linux fue creado en 1991 por Linus Torvalds, con el motivo de buscar una alternativa al mal funcionamiento de los sistemas operativos MINIX en arquitecturas de 32 bits. Es por este motivo por el que actualmente gran parte del desarrollo de Kernel de Linux está enfocada hacia la familia x86. En comparación, los smartphones no tienen un claro líder del mercado, aunque todos los fabricantes utilizan principalmente la arquitectura ARM. La popularidad de esta arquitectura se debe principalmente a sus optimizaciones en consumo de batería, un factor determinante en este mercado.
Además, existen varias diferencias entre ambas arquitecturas. En lo referente al repertorio de instrucciones, mientras que la familia x86 es principalmente CISC, ARM utiliza un repertorio RISC. Adicionalmente, la familia ARM tiene un diseño enfocado hacia el bajo consumo de batería, consiguiendo resultados muy inferiores a los obtenidos por las arquitecturas x86.
Dejando de lado las arquitecturas, en lo referente al kernel también existen diferencias entre Linux y Android. Android está basado en Linux, pero no utiliza el kernel estándar de dicho sistema operativo. El kernel de Android incorpora varias mejoras, comúnmente conocidas como “Androidismos”, entre las que se pueden encontrar su manejador de batería, el low memory killer y el logger. Si bien Android introdujo estos cambios, muchos de ellos se han proporcionado para el uso de la comunidad de código abierto bajo una licencia GPL. Además, gran parte de ellos han sido introducidos en versiones posteriores de Linux de manera retroactiva.
Las librerías de ambos sistemas operativos también presentan diferencias y mejoras de una respecto a otra. En la mayoría de distribuciones Linux se utiliza la librería GNU C para proporcionar rutinas especificadas por la librería ISO C estándar para programas basados en lenguaje C. Sin embargo, durante el desarrollo de Android, muchos desarrolladores vieron el uso de esta librería inapropiado, que junto al hecho de que la licencia de la misma era del tipo LGPL, es decir, no se permite licenciar trabajos derivados de la misma, condujeron al equipo de desarrollo a crear su propia librería en C: Bionic.
Esta librería fue diseñada con el objetivo de conseguir rutas de ejecución más rápidas, evitar casos extremos y continuar siendo una implementación simple. Para ello, se utilizó parte de la librería estándar de C combinada con el código original de Android.
Una de las principales diferencias entre Bionic y la librería C utilizada en Linux reside en el soporte a threads. En la segunda, las funciones asociadas al manejo y uso de threads las proporcionar la biblioteca NPTL, con una implementación que consigue un alto rendimiento de los hilos en aplicaciones de servidor. Sin embargo, su huella en memoria y disco eran demasiado altos para ser prácticos en los dispositivos Android. Muchas funcionalidades como el proceso IPC o los mutex compartidos fueron desechadas debido a la anterior existencia de procesos similares en el sistema móvil, como es el caso del servicio “Intent” o al poco beneficio que suponían. De manera similar, el soporte a las excepciones de C++ también fue eliminado, con objetivo de reducir el tamaño del código y minimizar la complejidad. Otros aspectos modificados importantes residen en los permisos y seguridad. Dado que el sistema móvil fue ideado para ser utilizado por una única persona, se modificó la asignación de ids para contemplar un único identificador de usuario e identificador de grupo asociado a cada aplicación.
En resumen, los objetivos del equipo desarrollador de Android les condujeron a crear una implementación personalizada de la librería C, especialmente preparada para lidiar con capacidades de proceso y memoria limitadas. Además, se incluyeron cambios en seguridad para mejorar la integridad del sistema.
La librería C estándar no fue, sin embargo, la única implementación que desecharon. Con Java ocurrió algo similar. La mayoría de fabricantes solían utilizar una versión Java optimizada para sus dispositivos (Java 2 Micro Edition), pero para Android se decidió utilizar una máquina virtual propia: Dalvik Virtual Machine, una máquina más optimizada para su funcionamiento de dispositivos móviles con CPU lenta, memoria limitada y batería limitada.
La introducción de esta nueva máquina supuso que los desarrolladores de aplicaciones tuvieran que convertir su código para poder ser interpretado por dicha máquina virtual, en archivos Dex. Para ello, se incorporó la herramienta “DX”, que se encarga de convertir y reagrupar los archivos de clase de Java en un único archivo Dex con varios grupos de constantes.
En cuanto a sistema de archivos, se presentan varias modificaciones entre Linux y Android. Los discos duros son demasiado grandes y frágiles como para ser implementados en dispositivos móviles, por lo que en su lugar se utilizan almacenamientos flash, en concreto el sistema de archivos YAFFS, basado en NAND (escritura rápida-lectura lenta), y creado por Toby Churchill, como el primer sistema diseñado específicamente para memorias NAND flash. YAFFS puede ser considerado como una versión mejorada de los sistemas de ficheros flash, dado que supera a los sistemas previos en muchos aspectos.
Tradicionalmente, Linux no suele utilizar memorias flash, sino discos duros comúnmente usando la última versión del sistema de archivos ext (ext3). Entre Ext3 y YAFFS existen 3 diferencias principales:
- Acceso a los ficheros: los sistemas de ficheros de disco están diseñados para evitar las búsquedas en discos siempre que sea posible, dado su alto coste, mientras que los sistemas flash no tienen latencia y pueden realizar accesos aleatorios.
- Borrado de bloques: en memorias flash, el borrado de bloques es costoso y debe realizarse cuando el procesador esté ocioso.
- Los dispositivos flash tienen un tiempo de vida limitado.
Por último, las últimas diferencias entre ambos sistemas residen en la gestión de la energía. Tradicionalmente, Linux utiliza varias características propias para evitar un desperdicio de energía. Esta gestión es manejada en Linux por Advance Power Management o Advanced Configuration and Power Interface. Sin embargo, Android no utiliza ninguno de ambos servicios, sino que utiliza PowerManagement, que mediante el uso de WakeLocks maneja el encendido y apagado de perifericos como la pantalla. Si no existe un wakelock que bloquee el dispositivo periferico en cuestión, se apaga para reducir el consumo de energía. Además, el PowerManager también monitorea el estado de la batería y se coordina con la circuitería durante la carga y apaga el dispositivo cuando los niveles de energía son demasiado bajos.