Imagen del sistema compartido de Android

Esta página presenta varios mecanismos que los OEM de dispositivos Android pueden utilizar para tener su propia imagen de sistema compartida (SSI) en todas las líneas de productos. También propone un procedimiento para basar un SSI propiedad de OEM en una imagen genérica del sistema (GSI) construida por AOSP.

Fondo

Con Project Treble , el Android monolítico se dividió en dos partes: la parte específica del hardware (la implementación del proveedor) y la parte genérica del sistema operativo (el marco del sistema operativo Android). El software de cada uno se instala en una partición separada: la partición del proveedor para el software específico del hardware y la partición del sistema para el software del sistema operativo genérico. Se define y aplica una interfaz versionada, denominada interfaz de proveedor ( VINTF ), en las dos particiones. Al utilizar este sistema de partición, puede modificar la partición del sistema sin modificar la partición del proveedor, y viceversa.

Motivación

El código del marco publicado en AOSP ha sido compatible con la arquitectura Treble y ha mantenido la compatibilidad con implementaciones de proveedores anteriores. Por ejemplo, una imagen genérica del sistema creada a partir de fuentes de Android 10 AOSP se puede ejecutar en cualquier dispositivo compatible con Treble que se ejecute en Android 8 o superior. Los proveedores de SoC y los OEM modifican la versión de Android que se envía en los dispositivos de consumo. (Consulte Vida útil de una versión de Android ). Estos cambios y extensiones que se realizaron en el marco no se escribieron para mantener la compatibilidad con versiones anteriores, lo que se tradujo en una mayor complejidad y un mayor costo en una actualización del sistema operativo. Los cambios y modificaciones específicos del dispositivo aumentan el costo y la complejidad de actualizar una versión del sistema operativo Android.

Antes de Android 11 no existía una arquitectura clara que permitiera a los socios crear extensiones modulares para el marco del sistema operativo Android. Este documento describe los pasos que los proveedores de SoC y los OEM pueden seguir para crear un SSI. Esto significa una imagen, creada a partir de las fuentes del marco del sistema operativo Android para su reutilización en múltiples dispositivos, para mantener la compatibilidad con las implementaciones de los proveedores y para proporcionar una reducción significativa en la complejidad y el costo de las actualizaciones del sistema operativo Android. Para conocer los pasos específicos que necesita para crear un SSI, consulte la sección Pasos sugeridos para SSI basado en GSI y tenga en cuenta que no es necesario seguir los cuatro pasos. Los pasos que elija (solo el Paso 1, por ejemplo) dependen de su implementación.

Descripción general de SSI

Con SSI, los componentes de software específicos del producto y las extensiones OEM se colocan en una nueva partición /product . Los componentes de la partición /product utilizan una interfaz estable y bien definida para interactuar con los componentes de la partición /system . Los OEM pueden optar por crear un SSI o tener una pequeña cantidad de SSI para usar en múltiples SKU de dispositivos. Cuando se lanza una nueva versión del sistema operativo Android, los OEM invierten solo una vez en actualizar sus SSI a la última versión de Android. Pueden reutilizar los SSI para actualizar varios dispositivos sin actualizar la partición /product .

Tenga en cuenta que los OEM y los proveedores de SoC crean SSI que incluyen todas las funciones personalizadas y modificaciones que necesita un OEM. Los mecanismos y las mejores prácticas proporcionados en esta página están destinados a que los utilicen los OEM para alcanzar estos objetivos clave:

  • Reutilice el SSI en varios SKU de dispositivos.
  • Actualice el sistema Android con las extensiones modulares para facilitar las actualizaciones del sistema operativo.

La idea central de separar componentes específicos del producto en la partición del producto es similar a la idea de Treble de separar componentes específicos de SoC en la partición del proveedor. Una interfaz de producto (similar a VINTF ) permite la comunicación entre SSI y la partición del producto. Tenga en cuenta que con respecto a SSI, el término "componentes" describe todos los recursos, binarios, textos, bibliotecas, etc. que se instalan en imágenes, que esencialmente se convierten en particiones.

Particiones alrededor de SSI

La Figura 1 muestra las particiones alrededor de SSI y las interfaces versionadas en las particiones y las políticas en las interfaces. Esta sección explica cada una de las particiones e interfaces en detalle.

Partitions and interfaces around SSI block diagram

Figura 1. Particiones e interfaces alrededor de SSI

Imágenes y particiones

La información de esta sección distingue entre los términos imagen y partición .

  • Una imagen es una pieza conceptual de software que se puede actualizar de forma independiente.
  • Una partición es una ubicación de almacenamiento físico que se puede actualizar de forma independiente.

Las secciones en la Figura 1 se definen de la siguiente manera:

  • SSI: SSI es la imagen común a un OEM y puede existir en varios dispositivos. No tiene componentes específicos de hardware o de producto. Todo lo que hay en un SSI determinado se comparte, por definición, entre todos los dispositivos que utilizan ese SSI. El SSI se compone de una única imagen /system o de una partición /system y /system_ext , como se ve en la Figura 1.

    • La partición /system contiene componentes basados ​​en AOSP, mientras que /system_ext , cuando se implementa, contiene extensiones y componentes de proveedores OEM y SoC que están estrechamente acoplados con los componentes de AOSP. Por ejemplo, una biblioteca de marco Java OEM que proporciona API personalizadas para las propias aplicaciones del OEM encaja mejor en la partición /system_ext que en la partición /system . El contenido de las particiones /system y /system_ext se crea a partir de fuentes de Android modificadas por OEM.

    • La partición /system_ext es opcional, pero es beneficioso usarla para cualquier característica y extensión personalizada que esté estrechamente acoplada con componentes basados ​​en AOSP. Esta distinción le ayuda a identificar los cambios que necesita realizar para mover dichos componentes de la partición /system_ext a la partición /product durante un período de tiempo.

  • Producto: una colección de componentes específicos de un producto o dispositivo que representan personalizaciones OEM y extensiones del sistema operativo Android. Coloque los componentes específicos de SoC en la partición /vendor . Los proveedores de SoC también pueden utilizar la partición /product para los componentes apropiados, como los independientes de SoC. Por ejemplo, si un proveedor de SoC proporciona un componente independiente de SoC a sus clientes OEM (que es opcional y se envía con el producto), el proveedor de SoC puede colocar ese componente en la imagen del producto. La ubicación de un componente no está determinada por su propiedad , sino dictada por su propósito .

  • Proveedor : una colección de componentes específicos de SoC.

  • ODM: una colección de componentes específicos de la placa que no proporciona el SoC. Normalmente, el proveedor de SoC es propietario de la imagen del proveedor, mientras que el fabricante del dispositivo es propietario de la imagen ODM. Cuando no hay una partición /odm separada, tanto el proveedor de SoC como las imágenes ODM se fusionan en la partición /vendor .

Interfaces entre imágenes

Existen dos interfaces principales para imágenes de proveedores y productos en torno a SSI:

  • Interfaz de proveedor (VINTF) : VINTF es la interfaz para los componentes que residen en el proveedor y las imágenes ODM. Los componentes de las imágenes del producto y del sistema solo pueden interactuar con las imágenes del proveedor y ODM a través de esta interfaz. Por ejemplo, la imagen de un proveedor no puede depender de una parte privada de la imagen del sistema y viceversa. Esto se definió originalmente en Project Treble, que dividía las imágenes en particiones de sistema y de proveedor. La interfaz se describe utilizando los siguientes mecanismos:

    • HIDL (HAL Passthrough solo está disponible para los módulos system y system_ext )
    • AIDL estable
    • Configuraciones
      • API de propiedades del sistema
      • API de esquema de archivo de configuración
    • VNDK
    • API del SDK de Android
    • Biblioteca SDK de Java
  • Interfaces del producto : La interfaz del producto es la interfaz entre SSI y la imagen del producto. La definición de una interfaz estable desacopla los componentes del producto de los componentes del sistema en un SSI. La interfaz del producto requiere las mismas interfaces estables que VINTF. Sin embargo, solo se aplican las API VNDK y Android SDK para dispositivos que se inician con Android 11 (y versiones posteriores).

Habilitar SSI en Android 11

Esta sección explica cómo utilizar las nuevas funciones implementadas para admitir SSI en Android 11.

La partición /system_ext

La partición /system_ext se introdujo en Android 11 como una partición opcional. (Es el lugar para los componentes que no son AOSP y que tienen un acoplamiento estrecho con los componentes definidos por AOSP en la partición /system ). Se supone que la partición /system_ext es la extensión específica de OEM para la partición /system , sin una interfaz definida en las dos particiones. Los componentes de la partición /system_ext pueden realizar llamadas API privadas a la partición /system , y los componentes de la partición /system pueden realizar llamadas API privadas a la partición /system_ext .

Debido a que las dos particiones están estrechamente acopladas, ambas particiones se actualizan juntas cuando se lanza una nueva versión de Android. Una partición /system_ext creada para la versión anterior de Android no necesita ser compatible con la partición /system en la próxima versión de Android.

Para instalar un módulo en la partición /system_ext , agregue system_ext_specific: true al archivo Android.bp . Para dispositivos que no tienen una partición /system_ext , instale dichos módulos en el subdirectorio ./system_ext en la partición /system .

Historia

Aquí hay algo de historia sobre la partición /system_ext . El objetivo del diseño era colocar todos los componentes específicos de OEM, independientemente de si son comunes, en la partición /product . Sin embargo, moverlos todos a la vez no era factible, especialmente cuando algunos componentes tenían un acoplamiento estrecho con la partición /system . Para mover un componente estrechamente acoplado a la partición /product , se debe extender la interfaz del producto. Esto a menudo requería que el componente en sí fuera refactorizado exhaustivamente, lo que consume mucho tiempo y esfuerzo. La partición /system_ext comenzó como un lugar para alojar temporalmente aquellos componentes que no están listos para ser movidos a la partición /product . El objetivo del SSI era eliminar eventualmente la partición /system_ext .

Sin embargo, la partición /system_ext es útil para mantener la partición /system lo más cerca posible de AOSP. Con SSI, la mayor parte del esfuerzo de actualización se dedica a los componentes de las particiones /system y /system_ext . Cuando la imagen del sistema se crea a partir de fuentes que son lo más similares posible a las de AOSP, puede centrar el esfuerzo de actualización en la imagen system_ext .

Desagregar componentes de las particiones /system y /system_ext en la partición /product

Android 9 introdujo una partición /product que se combina con la partición /system . Los módulos de la partición /product utilizan los recursos del sistema sin ninguna restricción y viceversa. Para que SSI sea posible en Android 10, los componentes del producto se dividen en las particiones /system_ext y /product . La partición /system_ext no tiene que cumplir con las restricciones sobre el uso de componentes del sistema que la partición /product cumplía en Android 9. A partir de Android 10, la partición /product debe separarse de la partición /system y debe usar interfaces estables de las particiones /system y /system_ext .

El propósito principal de la partición /system_ext es ampliar las funciones del sistema, en lugar de instalar módulos de productos incluidos, como se describe en la sección /system_ext partition . Para hacer esto, desagrupe los módulos específicos del producto y muévalos a la partición /product . La separación de los módulos específicos del producto hace que /system_ext sea común para los dispositivos. (Para obtener más detalles, consulte Cómo hacer que la partición /system_ext sea común ).

Para desagregar la partición /product de los componentes del sistema, la partición /product debe tener la misma política de aplicación que la partición /vendor que ya estaba desagregada con Project Treble.

A partir de Android 11, las interfaces nativas y Java para la partición /product se aplican como se describe a continuación. Para obtener más información, consulte Aplicación de interfaces de partición de productos .

  • Interfaces nativas : los módulos nativos en la partición /product deben separarse de las otras particiones. Las únicas dependencias permitidas de los módulos del producto son algunas bibliotecas VNDK (incluido LLNDK) de la partición /system . Las bibliotecas JNI de las que dependen las aplicaciones del producto deben ser bibliotecas NDK.
  • Interfaces Java : los módulos Java (aplicación) en la partición /product no pueden usar API ocultas porque son inestables. Estos módulos solo deben usar API públicas y API del sistema de la partición /system , y bibliotecas del SDK de Java en la partición /system o /system_ext . Puede definir bibliotecas de Java SDK para API personalizadas.

Pasos sugeridos para SSI basado en GSI

Suggested partitions for GSI-based SSI

Figura 2. Particiones sugeridas para SSI basado en GSI

Una imagen genérica del sistema (GSI) es la imagen del sistema que se crea directamente desde AOSP. Se utiliza para las pruebas de cumplimiento de Treble (por ejemplo, CTS-on-GSI) y como plataforma de referencia que los desarrolladores de aplicaciones pueden usar para probar la compatibilidad de sus aplicaciones cuando no tienen un dispositivo real que ejecute la versión requerida de Android.

Los OEM también pueden utilizar GSI para crear su SSI. Como se explica en Imágenes y particiones , SSI consta de la imagen del sistema para los componentes definidos por AOSP y la imagen system_ext para los componentes definidos por OEM. Cuando se utiliza GSI como imagen del system , el OEM puede centrarse en la imagen system_ext para la actualización.

Esta sección proporciona una guía para los OEM que desean modularizar sus personalizaciones en las particiones /system_ext y /product mientras utilizan una imagen del sistema AOSP o casi AOSP. Si los OEM crean la imagen del sistema a partir de fuentes de AOSP, pueden sustituir la imagen del sistema que crean con el GSI proporcionado por AOSP. Sin embargo, los OEM no necesitan llegar al paso final (usando GSI tal como está) de una vez.

Paso 1. Heredar generic_system.mk para la imagen del sistema OEM (OEM GSI)

Al heredar generic_system.mk (que se llamó mainline_system.mk en Android 11 y se renombró a generic_system.mk en AOSP), la imagen del sistema (OEM GSI) incluye todos los archivos que tiene AOSP GSI. Estos archivos pueden ser modificados por los OEM, de modo que el OEM GSI pueda contener los archivos propietarios del OEM además de los archivos AOSP GSI. Sin embargo, los OEM no pueden modificar el archivo generic_system.mk .

Inheriting `generic_system.mk` for OEM system image

Figura 3. Herencia de generic_system.mk para la imagen del sistema del OEM

Paso 2. Hacer que el GSI OEM tenga la misma lista de archivos que el GSI AOSP

El OEM GSI no puede tener archivos adicionales en esta etapa. Los archivos propietarios del OEM deben trasladarse a system_ext o a las particiones product .

Moving added files out of the OEM GSI

Figura 4. Mover archivos agregados fuera del GSI OEM

Paso 3. Definir una lista de permitidos para limitar los archivos modificados en OEM GSI

Para verificar los archivos modificados, los OEM pueden usar la herramienta compare_images y comparar el AOSP GSI con el OEM GSI. Obtenga el AOSP GSI del destino del almuerzo AOSP generic_system_* .

Al ejecutar la herramienta compare_images periódicamente con el parámetro allowlist , puede monitorear las diferencias fuera de la lista permitida. Esto evita la necesidad de modificaciones adicionales al OEM GSI.

Define an allowlist to reduce the list of modified files in OEM GSI

Figura 5. Defina una lista de permitidos para reducir la lista de archivos modificados en OEM GSI

Paso 4. Hacer que el GSI OEM tenga los mismos binarios que el GSI AOSP

La limpieza de la lista de permitidos permite a los OEM utilizar AOSP GSI como imagen del sistema para sus propios productos. Para limpiar la lista de permitidos, los OEM pueden abandonar sus cambios en OEM GSI o actualizar sus cambios a AOSP para que AOSP GSI incluya sus cambios.

Make OEM GSI have the same binaries as AOSP GSI

Figura 6. Hacer que el GSI OEM tenga los mismos binarios que el GSI AOSP

Definición de SSI para OEM

Proteja la partición /system en el momento de la compilación

Para evitar cambios específicos del producto en la partición /system y definir el GSI OEM, los OEM pueden usar una macro de archivo MAKE llamada require-artifacts-in-path para evitar cualquier declaración de módulos del sistema después de llamar a la macro. Consulte el ejemplo Crear archivo MAKE y habilitar verificación de ruta de artefacto .

Los OEM pueden definir una lista para permitir que módulos específicos del producto se instalen temporalmente en la partición /system . Sin embargo, la lista debe estar vacía para que el GSI OEM sea común a todos los productos del OEM. Este proceso es para definir el GSI OEM y puede ser independiente de los pasos para el GSI AOSP .

Aplicar interfaces de productos

Para garantizar que la partición /product esté desagregada, los OEM pueden asegurarse de que sus dispositivos apliquen las interfaces del producto configurando PRODUCT_PRODUCT_VNDK_VERSION:= current para módulos nativos y PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE:= true para módulos Java. Estas variables se configuran automáticamente si PRODUCT_SHIPPING_API_LEVEL del dispositivo es mayor o igual a 30 . Para obtener información detallada, consulte Aplicación de interfaces de partición de productos .

Hacer que la partición /system_ext sea común

La partición /system_ext puede diferir entre dispositivos, porque puede tener módulos incluidos en el sistema específicos del dispositivo. Debido a que SSI consta de particiones /system y /system_ext , las diferencias en la partición /system_ext impiden que los OEM definan un SSI. Los OEM pueden tener su propio SSI y compartir ese SSI entre múltiples dispositivos eliminando cualquier diferencia y haciendo que la partición /system_ext sea común.

Esta sección ofrece recomendaciones para hacer que la partición /system_ext sea común.

Exponer API ocultas en la partición del sistema

Muchas aplicaciones específicas de productos no se pueden instalar en la partición del producto porque utilizan API ocultas, que están prohibidas en la partición del producto. Para mover aplicaciones específicas del dispositivo a la partición del producto, elimine el uso de API ocultas.

La forma preferida de eliminar las API ocultas de las aplicaciones es encontrar API públicas o del sistema alternativas para reemplazarlas. Si no hay API para reemplazar las API ocultas, los OEM pueden contribuir a AOSP para definir las nuevas API del sistema para sus dispositivos.

Alternativamente, los OEM pueden definir API personalizadas creando su propia biblioteca Java SDK en la partición /system_ext . Puede utilizar API ocultas en la partición del sistema y puede proporcionar las API a las aplicaciones en la partición del producto o proveedor. Los OEM deben congelar las API orientadas al producto para lograr compatibilidad con versiones anteriores.

Incluya el superconjunto de todos los APK y omita la instalación de algunos paquetes para cada dispositivo

Ciertos paquetes incluidos con el sistema no son comunes en todos los dispositivos. Desagregar estos módulos APK para moverlos al producto o a la partición del proveedor puede resultar complicado. Como solución provisional, los OEM pueden hacer que el SSI incluya todos los módulos y luego filtrar los no deseados utilizando una propiedad SKU ( ro.boot.hardware.sku ). Para usar el filtro, los OEM superponen los recursos del marco config_disableApkUnlessMatchedSku_skus_list y config_disableApksUnlessMatchedSku_apk_list .

Para configuraciones más precisas, declare un receptor de transmisión que deshabilite los paquetes innecesarios. El receptor de transmisión llama setApplicationEnabledSetting para deshabilitar el paquete cuando recibe el mensaje ACTION_BOOT_COMPLETED .

Defina RRO en lugar de utilizar superposición de recursos estáticos

Una superposición de recursos estáticos manipula los paquetes superpuestos. Sin embargo, puede impedir la definición de un SSI, así que asegúrese de que las propiedades de RRO estén activadas y configuradas correctamente. Al configurar las propiedades de la siguiente manera, los OEM pueden tener todas las superposiciones generadas automáticamente como RRO.

PRODUCT_ENFORCE_RRO_TARGETS := *
PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS := # leave it empty

Si se requiere una configuración detallada, defina un RRO manualmente en lugar de confiar en uno generado automáticamente. Para obtener información detallada, consulte Superposiciones de recursos en tiempo de ejecución (RRO) . Los OEM también pueden definir RRO condicionales que dependen de las propiedades del sistema mediante el uso de los atributos android:requiredSystemPropertyName y android:requiredSystemPropertyValue .

Preguntas frecuentes (FAQ)

¿Puedo definir múltiples SSI?

Depende de los puntos en común y las características de los dispositivos (o grupo de dispositivos). Los OEM pueden intentar hacer que la partición system_ext sea común, como se describe en Cómo hacer que la partición system_ext sea común . Si un grupo de dispositivos tiene muchas diferencias, entonces es mejor definir varios SSI.

¿Puedo modificar generic_system.mk ( mainline_system.mk ) para un GSI OEM?

No. Pero los OEM pueden definir un nuevo archivo MAKE para un GSI OEM que hereda el archivo generic_system.mk y utilizar el nuevo archivo MAKE en su lugar. Para ver un ejemplo, consulte Aplicación de interfaces de partición de productos .

¿Puedo eliminar módulos de generic_system.mk que entren en conflicto con mi implementación?

No. GSI tiene un conjunto mínimo de módulos de arranque y comprobables. Si cree que un módulo no es esencial, presente un error para actualizar el archivo generic_system.mk en AOSP.