Android 10 y versiones posteriores incluyen varios componentes de medios actualizables que permiten actualizar los componentes del framework a través de la infraestructura de Google Play Store o de un mecanismo inalámbrico (OTA) proporcionado por un socio. Los componentes de medios se empaquetan en módulos que permiten proporcionar actualizaciones de seguridad y de funciones sin requerir una actualización completa de la imagen del sistema.
Los componentes de medios con capacidad de actualización existen en los siguientes módulos.
Medios: Este módulo incluye extractores de medios, APIs de
MediaSession2
y APIs deMediaParser
.Códecs de medios. Este módulo incluye componentes de Codec2 que se pueden actualizar.
MediaProvider. Este módulo optimiza los metadatos indexados (audio, video e imágenes de tarjetas SD y dispositivos USB) y pone esos datos a disposición de las apps a través de las APIs públicas de MediaStore.
Para obtener detalles sobre cómo agregar extractores y decodificadores personalizados, consulta Cómo personalizar componentes de medios.
Extractores de medios
En Android 9 y versiones anteriores, los extractores se compilan en un solo archivo libstagefright.so
. En Android 10 y versiones posteriores, los extractores de medios son componentes separados. Cada extractor tiene su propio archivo .so
con un punto de entrada que proporciona una función de sniffer para determinar si el extractor puede controlar el archivo multimedia determinado y una función de factory que crea una instancia del extractor para el archivo multimedia determinado. Cada extractor tiene un nombre (para ayudar en la depuración) y una versión para indicar cuál es el más reciente.
El framework de medios carga automáticamente todos los archivos .so
del extractor disponibles, por lo que puedes crear tus propios extractores agregando un nuevo archivo .so
sin necesidad de modificar libstagefright
ni otras bibliotecas del framework de medios. También puedes asegurarte de que se prefiera un extractor personalizado por sobre el extractor proporcionado por Google.
API de MediaSession2
La API de MediaSession2 permite que las apps de música expongan sus controles de transporte y su información de reproducción a otros procesos, como el framework de Android y otras apps. Este componente no se puede personalizar.
API de MediaParser
La API de MediaParser permite que ExoPlayer use de manera eficiente los analizadores de contenedores multimedia del framework para extraer muestras de contenido multimedia de los contenedores multimedia. MediaParser incluye los siguientes cambios en los límites del código fuente:
frameworks/base/apex/media/framework/java/android/media/MediaParser.java
. Implementación de la API y la capa delgada.external/exoplayer/
. Fuentes textuales de ExoPlayer sobre las que se compila MediaParser.
La API de MediaParser no se puede personalizar. Para probar MediaParser, usa las pruebas en cts/tests/tests/mediaparser/
.
Códecs de archivos multimedia
El módulo Media Codecs incluye componentes de Codec2 de software actualizables. La compatibilidad con la personalización varía entre las versiones:
En Android 11 o versiones posteriores (específicamente, la actualización del sistema de Google Play v292100200), puedes personalizar los parámetros para la asignación de memoria ION (consulta los detalles a continuación).
En Android 9 y versiones anteriores, la API del códec OMX no se puede actualizar, pero puedes usarla en la partición del proveedor.
Asignación de memoria de ION
En Android 11 o versiones posteriores y en la actualización del sistema de Google Play v292100200 o versiones posteriores, puedes personalizar los siguientes parámetros para la asignación de memoria de ION.
Parámetro | Valor predeterminado | Descripción |
---|---|---|
heapMask |
0xFFFFFFFF |
Se permiten todos los tipos de montón. |
allocFlags |
0 |
No se establecieron marcas. |
minAlignment |
0 |
No hay alineación. |
Para anular los parámetros, haz lo siguiente:
Registra un servicio
android.hardware.media.c2
predeterminado y proporciona parámetros de uso de ION personalizados.Para crear un servicio nuevo, copia el archivo frameworks/av/media/codec2/hidl/services/vendor.cpp en tu repositorio y, luego, modifica
StoreImpl::Interface::SetIonUsage()
según sea necesario.Para reutilizar el proceso (OMX)
media.codec
, copia y registra la claseStoreImpl
de frameworks/av/media/codec2/hidl/services/vendor.cpp en el archivomediacodec
existente (frameworks/av/services/mediacodec/main_codecservice.cpp).
Agrega el siguiente código al dispositivo
manifest.xml
.<hal format="hidl"> <name>android.hardware.media.c2</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IComponentStore</name> <instance>default</instance> </interface> </hal>
Formato y dependencias
Los módulos Media (com.android.media
) y Media Codec (com.android.media.swcodec
) están en formato APEX. Los componentes de medios incluidos solo dependen de las APIs del NDK.
Actualizaciones
Durante una actualización, los componentes del framework en el dispositivo cargan un paquete APEX que contiene código nativo y Java.
Figura 1: Flujo de actualización del componente de medios
Después de que el framework instala el paquete APEX, el dispositivo se reinicia y se activa la imagen de disco, y los procesos del sistema de medios (media.extractor
y media.codec
) cargan los módulos actualizados desde el punto de activación.