Imagen del sistema compartido de Android

En esta página, se presentan varios mecanismos que los OEM de dispositivos Android pueden usar para tener su propia imagen de sistema compartido (SSI) en todas las líneas de productos. También propone procedimiento para basar un SSI de OEM en una imagen genérica del sistema compilada por AOSP (GSI).

Segundo plano

Con Project Treble, haz lo siguiente: El Android monolítico se dividió en dos partes: la específica de hardware (el implementación del proveedor) y la parte genérica del SO (el framework del SO Android). El para cada uno se instala en una partición independiente: la partición del proveedor para el software específico de hardware y la partición del sistema para el SO genérico software. Una interfaz con control de versiones, llamada interfaz del proveedor (VINTF), se define y aplica en las dos particiones. Si usas esta partición puedes modificar la partición del sistema sin modificar el proveedor y viceversa.

Motivación

El código del marco de trabajo publicado en el AOSP cumple con los estándares de la Treble. y ha mantenido la retrocompatibilidad con los proveedores de Google Cloud. Por ejemplo, una imagen genérica del sistema compilada a partir del AOSP de Android 10 se pueden ejecutar en cualquier dispositivo compatible con Treble que se ejecute en Android 8 o mayores. La versión de Android que se incluye en los dispositivos de consumidores se modifica por Proveedores de SoC y OEMs. (Consulta La vida de un Android Lanzamiento). Estos cambios y extensiones que se hicieron al framework no se escribieron manteniendo la retrocompatibilidad, lo que se tradujo en una mayor complejidad y un costo más alto en una actualización del SO. Las modificaciones y los cambios específicos del dispositivo se agregan a el costo y la complejidad de actualizar una versión del SO Android.

Antes de Android 11, no había una arquitectura clara que permitiera a los socios compilar extensiones modulares para el framework del SO Android. En este documento, se describe el pasos que los proveedores de SoC y los OEM pueden seguir para crear un SSI. Esto significa que una imagen, compilada a partir de fuentes del framework del SO Android para reutilizarla en varios dispositivos para mantener la retrocompatibilidad con las implementaciones de proveedores lo que supone una reducción significativa en la complejidad y el costo del SO Android actualizaciones. Si quieres conocer los pasos específicos que debes seguir para crear un SSI, consulta el artículo para la sección de SSI basada en GSI y ten en cuenta que no tienes que usar las cuatro pasos. Los pasos que elijas (solo el Paso 1, por ejemplo) dependerán de tu para implementarlos.

Descripción general de SSI

Con SSI, se colocan componentes de software específicos del producto y extensiones del OEM una nueva partición /product Los componentes en la partición /product usan un interfaz estable y bien definida para interactuar con componentes en /system por cada partición. Los OEM pueden crear un SSI o tener una pequeña cantidad de Son los ISIS para usarlos en múltiples SKU de dispositivos. Cuando una versión nueva del SO Android , los OEM invierten solo una vez para actualizar sus SSI a la información más reciente Versión de Android Pueden reutilizar los SSI para actualizar varios dispositivos sin actualizando la partición /product.

Ten en cuenta que los OEM y los proveedores de SoC crean SSI que incluyen todas las funciones y modificaciones personalizadas que un OEM necesita. Los mecanismos y las mejores las prácticas proporcionadas en esta página están destinadas a que los OEM las usen para alcanzar estas claves objetivos:

  • Volver a usar el SSI en SKU de varios dispositivos
  • Actualiza el sistema Android con las extensiones modulares para realizar actualizaciones del SO y fácil de usar.

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

Particiones en torno a SSI

En la Figura 1, se muestran particiones relacionadas con SSI y las interfaces con control de versiones de la particiones y políticas en las interfaces. En esta sección, se explica cada uno las particiones y las interfaces.

Interfaces y particiones en el diagrama de bloques de SSI

Figura 1: Interfaces y particiones en torno a 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 puede actualizarse de forma independiente.

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

  • SSI: El SSI es la imagen común para un OEM y puede existir. en varios dispositivos. No tiene atributos de hardware componentes específicos del producto. Por definición, todos los elementos de un SSI se comparten todos los dispositivos que usan ese SSI. El SSI se compone de un solo /system o las particiones /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 de proveedores del OEM y SoC, y con acoplamiento alto con componentes del AOSP. Por ejemplo, un Biblioteca del framework de Java del OEM que proporciona APIs personalizadas para las propias apps del OEM. se ajusta mejor a /system_ext que a /system por cada partición. El contenido de las particiones /system y /system_ext es compilada a partir de fuentes de Android modificadas por el OEM.

    • La partición /system_ext es opcional, pero conviene usarla para funciones y extensiones personalizadas que estén estrechamente relacionadas con el AOSP. basados en la API. Esta distinción te ayuda a identificar los cambios que necesitas para mover esos componentes de la partición /system_ext a la /product partición durante un período.

  • Producto: Es un conjunto de componentes específicos de un producto o dispositivo que representan las personalizaciones y extensiones del OEM del SO Android. Coloca valores específicos de SoC componentes en la partición /vendor. Los proveedores de SoC también pueden usar /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 de OEM (enviar con el producto es opcional), el proveedor de SoC puede colocar de la imagen del producto. La ubicación de un componente no está determinada por su propiedad, esta depende de su propósito.

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

  • ODM: Es un conjunto de componentes específicos de la placa que no proporciona el SoC Por lo general, el proveedor del SoC es propietario de la imagen del proveedor, mientras que el fabricante del dispositivo es propietario. la imagen ODM. Cuando no hay una partición /odm separada, tanto el proveedor de SoC y las imágenes ODM se combinan en la partición /vendor.

Interfaces entre imágenes

En torno a SSI, existen dos interfaces principales para imágenes de proveedores y productos:

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

    • HIDL (la HAL de transferencia solo está disponible para los módulos system y system_ext)
    • AIDL estable
    • Configuraciones
      • API de propiedades del sistema
      • API de esquema del archivo de configuración
    • VNDK
    • APIs del SDK de Android
    • Biblioteca del 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 separa los componentes del producto de los componentes del sistema en un SSI. La interfaz del producto requiere el mismo interfaces estables como VINTF. Sin embargo, solo se admiten las APIs del VNDK y el SDK de Android se aplica a los dispositivos que se lanzan con Android 11 (y versiones posteriores).

Habilita SSI en Android 11

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

La partición /system_ext

La partición /system_ext se introdujo en Android 11 como una opción por cada partición. (Es el lugar para los componentes que no son del AOSP que tienen una relación estrecha con los componentes definidos por AOSP en la partición /system). El /system_ext Se supone que la partición es la extensión específica del OEM a /system partición, sin una interfaz definida entre las dos particiones. Componentes en la partición /system_ext puede realizar llamadas a la API privada en /system la partición, y los componentes en la /systempartición pueden hacer llamadas a la API privada en la partición /system_ext.

Como las dos particiones están estrechamente acopladas, ambas se actualizan cuando se lanza una nueva versión de Android. Una partición /system_ext 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 a la partición /system_ext, agrega system_ext_specific: true al archivo Android.bp. Para dispositivos que no tienen un /system_ext instale esos módulos en el subdirectorio ./system_ext del /system.

Historial

Este es un poco de historia sobre la partición /system_ext. El objetivo de diseño era colocar todos los componentes específicos del OEM, independientemente de si son comunes, en la /product. Sin embargo, moverlos todos a la vez no era factible, en especial cuando algunos componentes tenían un acoplamiento alto con /system por cada partición. Para mover un componente con acoplamiento alto a la partición /product, el se debe extender la interfaz del producto. A menudo, esto requería que el propio componente refactorizarse en gran medida, lo que consume mucho tiempo y esfuerzo. El La partición /system_ext comenzó como un lugar para alojar de forma temporal esos componentes. que no están listas para moverse a la partición /product. El objetivo del SSI fue eliminar, con el tiempo, la partición /system_ext.

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

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

Android 9 introdujo una partición /product que está acoplado a la partición /system. Los módulos de la La partición /product usa los recursos del sistema sin ninguna restricción y viceversa. viceversa. Para que la 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 tenemos que cumplir con las restricciones sobre el uso de los componentes del sistema que la /product en Android 9. A partir de Android 10, /product la partición debe desagruparse de la partición /system y debe usar una interfaces de las particiones /system y /system_ext.

El propósito principal de la partición /system_ext es extender las funciones del sistema. en lugar de instalar módulos de productos empaquetados, como se describe en el sección /system_ext partition. Para hacerlo, desagrupar los módulos específicos del producto y moverlos a la partición /product Si desagrupas los módulos específicos de cada producto, /system_ext será común en dispositivos. (Para obtener más información, consulta Haz que la partición /system_ext sea común).

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

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

  • Interfaces nativas: Los módulos nativos en la partición /product deben desagruparse de las demás particiones. Las únicas dependencias permitidas del Los módulos de producto son algunas bibliotecas de VNDK (incluido LLNDK) de /system. por cada partición. Las bibliotecas JNI de las que dependen las apps de productos deben ser bibliotecas de NDK.
  • Interfaces Java: Los módulos de Java (app) en la partición /product no pueden hacerlo. usan APIs ocultas porque son inestables. Estos módulos solo deben usar Las APIs y las APIs del sistema de la partición /system y las bibliotecas del SDK de Java en la partición /system o /system_ext. Puedes definir bibliotecas del SDK de Java para APIs personalizadas.

Pasos sugeridos para SSI basados en GSI

Particiones sugeridas para SSI basadas en GSI

Figura 2: Particiones sugeridas para SSI basadas en GSI

Una imagen genérica del sistema (GSI) es la imagen del sistema que se compiló directamente a partir de AOSP. Se usa para las pruebas de cumplimiento de Treble (por ejemplo, CTS en GSI) y como una plataforma de referencia que los desarrolladores de apps 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 usar GSI para crear sus SSI. Como se explica en Imágenes y particiones, SSI consiste en la imagen del sistema para los componentes definidos por el AOSP. y la imagen system_ext para los componentes definidos por el OEM. Cuando la GSI se usa como la imagen system, el OEM puede enfocarse en la imagen system_ext para la actualización.

En esta sección, se proporciona una guía para los OEM que deseen modularizar sus personalizadas en las particiones /system_ext y /product mientras usas un imagen del sistema del AOSP o cercana a AOSP. Si los OEM compilan la imagen del sistema a partir del AOSP pueden reemplazar la imagen del sistema que compilen con la GSI que brinda el AOSP. Sin embargo, los OEM no necesitan llegar al paso final (usar GSI como lo es) de una sola vez.

Paso 1: Heredar genérico_system.mk para la imagen del sistema del OEM (GSI del OEM)

Heredando generic_system.mk (llamada mainline_system.mk en Android 11 y cuyo nombre se cambió a generic_system.mk in AOSP), la imagen del sistema (GSI de OEM) incluye todos los archivos que tiene la GSI del AOSP. Los OEM pueden modificar estos archivos para que la GSI del OEM contenga además de los archivos de GSI del AOSP. Sin embargo, los OEM no puede modificar el archivo generic_system.mk.

Hereda "generic_system.mk" para la imagen del sistema del OEM

Figura 3: Hereda genérica_system.mk para la imagen del sistema del OEM

Paso 2: Cómo hacer que la GSI del OEM tenga la misma lista de archivos con la GSI del AOSP

La GSI del OEM no puede tener archivos adicionales en esta etapa. La propiedad del OEM los archivos deben moverse a las particiones system_ext o product.

Cómo mover los archivos agregados fuera de la GSI de OEM

Figura 4: Cómo mover los archivos agregados fuera de la GSI de OEM

Paso 3: Define una lista de entidades permitidas para limitar los archivos modificados en la GSI del OEM

Para comprobar los archivos modificados, los OEM pueden usar el compare_images y compara la GSI del AOSP con la de OEM. Obtén la GSI del AOSP desde la Objetivo de almuerzo de AOSP generic_system_*.

Mediante la ejecución periódica de la herramienta compare_images con allowlist puedes supervisar las diferencias fuera de la lista permitida. Esto evita que requieran modificaciones adicionales a la GSI del OEM.

Define una lista de entidades permitidas para reducir la lista de archivos modificados en la GSI del OEM

Figura 5: Define una lista de entidades permitidas para reducir la lista de archivos modificados en la GSI del OEM

Paso 4: Cómo hacer que la GSI del OEM tenga los mismos objetos binarios que la GSI del AOSP

Limpiar la lista de entidades permitidas permite que los OEM usen la GSI de AOSP como imagen del sistema para sus propios productos. Para limpiar la lista de entidades permitidas, los OEM pueden abandonar sus cambios en la GSI del OEM u organizarlos en el AOSP para que la GSI incluye sus cambios.

Cómo hacer que la GSI de OEM tenga los mismos objetos binarios que la GSI del AOSP

Figura 6: Cómo hacer que la GSI del OEM tenga los mismos objetos binarios que la GSI del AOSP

Define SSI para OEM

Protege la partición /system en el tiempo de compilación

Para evitar cualquier cambio específico del producto en la partición /system y definir el GSI de OEM, los OEM pueden usar una macro de archivo makefile llamada require-artifacts-in-path para evitar cualquier declaración de módulos del sistema después de que se llama a la macro. Consulta Crear un archivo Make y habilitar la verificación de la ruta de acceso del artefacto ejemplo.

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

Aplicar las interfaces de producto

Para garantizar que la partición /product no esté agrupada, los OEM pueden asegurarse de que los dispositivos aplican las interfaces del producto estableciendo PRODUCT_PRODUCT_VNDK_VERSION:= current para módulos nativos y PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE:= true para módulos de Java. Estas variables se establecen automáticamente si los El PRODUCT_SHIPPING_API_LEVEL del dispositivo es mayor o igual que 30. Para información detallada, consulta Aplica la partición de producto Interfaces

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

La partición /system_ext puede diferir entre dispositivos, ya que puede tener módulos específicos del dispositivo, integrados en el sistema. Debido a que el SSI consta de /system y /system_ext, las diferencias en la partición /system_ext impedir que los OEM definan un SSI. Los OEMs pueden tener su propio SSI y compartirlo SSI entre varios dispositivos, quitando las diferencias y aplicando la Común de la partición /system_ext.

En esta sección, se proporcionan recomendaciones para hacer que la partición /system_ext sea común.

Cómo exponer las APIs ocultas en la partición del sistema

No se pueden instalar muchas apps de productos específicos en la partición de producto. porque usan APIs ocultas, que están prohibidas en la partición del producto. Para mover apps específicas del dispositivo a la partición de producto, quitar el uso de APIs ocultas.

La forma preferida de quitar las APIs ocultas de las apps es encontrar la APIs públicas o de sistema alternativas para reemplazarlas. Si no hay APIs para reemplazar las APIs ocultas, los OEM pueden contribuir a AOSP para definir el nuevo sistema las APIs para sus dispositivos.

Como alternativa, los OEM pueden definir APIs personalizadas creando su propio SDK de Java biblioteca en la partición /system_ext. Puede usar APIs ocultas en la partición del sistema, y puede proporcionar las APIs a las apps en la partición de producto o proveedor. Los OEM deben congelar las ofertas orientadas a productos, APIs para garantizar la retrocompatibilidad.

Incluye el superconjunto de todos los APK y omite las instalaciones de algunos paquetes para cada dispositivo.

Algunos paquetes que se incluyen con el sistema no son comunes en todos los dispositivos. Desagrupar estos módulos de APK para moverlos a la partición del producto o del proveedor puede ser difícil. Como solución provisional, los OEM pueden hacer que el SSI incluya todas y filtrar los no deseados usando una propiedad SKU (ro.boot.hardware.sku). Para usar el filtro, los OEM se superponen con el marco de trabajo. recursos config_disableApkUnlessMatchedSku_skus_list y config_disableApksUnlessMatchedSku_apk_list

Para obtener una configuración más precisa, declara un receptor de emisión que inhabilita paquetes innecesarios. El receptor de emisión llama setApplicationEnabledSetting inhabilitar el paquete cuando recibe el ACTION_BOOT_COMPLETED mensaje.

Define RRO en lugar de usar la superposición de recursos estáticos

Una superposición de recursos estáticos manipula los paquetes superpuestos. Sin embargo, puede un SSI, así que asegúrate de que las propiedades de RRO estén activadas y configuradas correctamente. Si configuras las propiedades de la siguiente manera, los OEM pueden generar superposiciones como RRO.

PRODUCT_ENFORCE_RRO_TARGETS := *
PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS := # leave it empty

Si se requiere una configuración detallada, define una RRO manualmente en lugar de dependen de uno generado automáticamente. Para obtener información detallada, consulta Tiempo de ejecución Superposiciones de recursos (RRO). Los OEM también pueden definir RRO condicionales que dependen de las propiedades del sistema usando android:requiredSystemPropertyName y android:requiredSystemPropertyValue.

Preguntas frecuentes

¿Puedo definir varios SSI?

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

¿Puedo modificar genérico_system.mk (mainline_system.mk) para una GSI de OEM?

No. Pero los OEMs pueden definir un nuevo archivo makefile para una GSI del OEM que herede el archivo makefile. generic_system.mk y usa el nuevo archivo makefile en su lugar. Para ver un ejemplo, consulta Aplica la partición de producto Interfaces

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

No. GSI tiene un conjunto mínimo de módulos de inicio y de prueba. Si crees que un no es esencial, informa un error para actualizar el archivo generic_system.mk en el AOSP.