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.
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
ysystem_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
- HIDL (la HAL de transferencia solo está disponible para los módulos
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 /system
partició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
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
.
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
.
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.
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.
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.