O Android 10 ou versões mais recentes incluem vários componentes de mídia atualizáveis que permitem a atualização de componentes do framework pela infraestrutura da Google Play Store ou por um mecanismo over the air (OTA) fornecido pelo parceiro. Os componentes de mídia são empacotados juntos em módulos que permitem fornecer atualizações de segurança e de recursos sem exigir uma atualização completa da imagem do sistema.
Existem componentes de mídia atualizáveis nos módulos a seguir.
Mídia. Este módulo inclui extratores de mídia, APIs
MediaSession2
e APIsMediaParser
.Codecs de mídia. Esse módulo inclui componentes de Codec2 de software atualizáveis.
MediaProvider (link em inglês). Esse módulo otimiza metadados indexados (áudio, vídeo e imagens de cartões SD e dispositivos USB) e disponibiliza esses dados para apps usando as APIs públicas da MediaStore.
Para saber como adicionar extratores e decodificadores personalizados, consulte Como personalizar componentes de mídia.
Extratores de mídia
No Android 9 e versões anteriores, os extratores são compilados em um único
arquivo libstagefright.so
. No Android 10 ou versões mais recentes,
os extratores de mídia são componentes separados. Cada extrator tem um arquivo .so
próprio
com um ponto de entrada que fornece uma função sniffer para determinar se o
extrator pode processar o arquivo de mídia fornecido e uma função factory que cria
uma instância do extrator para o arquivo de mídia fornecido. Cada extrator é nomeado
para ajudar na depuração e tem uma versão para indicar qual é o mais recente.
O framework de mídia carrega automaticamente todos os arquivos .so
do extrator disponíveis. Assim, você pode criar seus próprios extratores adicionando um novo arquivo .so
sem precisar modificar
libstagefright
ou outras bibliotecas de framework de mídia. Você também pode garantir que um extrator personalizado tenha preferência sobre o fornecido pelo Google.
API MediaSession2
A API MediaSession2 permite que apps de música exponham os controles de transporte e as informações de reprodução a outros processos, como o framework do Android e outros apps. Este componente não pode ser personalizado.
API MediaParser
A API MediaParser permite que o ExoPlayer use de maneira eficiente os analisadores de contêineres de mídia do framework para extrair amostras de mídia dos contêineres de mídia. O MediaParser inclui as seguintes mudanças nos limites do código-fonte:
frameworks/base/apex/media/framework/java/android/media/MediaParser.java
. Implementação da API e da camada fina.external/exoplayer/
. Origens literais do Exoplayer em que o MediaParser é criado.
Não é possível personalizar a API MediaParser. Para testar o MediaParser, use os testes em
cts/tests/tests/mediaparser/
.
Codecs de mídia
O módulo de codecs de mídia inclui componentes de codec2 de software atualizáveis. O suporte à personalização difere entre as versões:
No Android 11 ou versões mais recentes (especificamente na atualização do sistema do Google Play v292100200), é possível personalizar os parâmetros para a alocação de memória ION (consulte abaixo para saber mais).
No Android 9 ou versões anteriores, a API de codec OMX não pode ser atualizada, mas ainda é possível usá-la na partição do fornecedor.
Alocação de memória do ION
No Android 11 ou mais recente e na Atualização do sistema do Google Play v292100200 ou mais recente, é possível personalizar os parâmetros a seguir para a alocação de memória do ION.
Parâmetro | Valor padrão | Descrição |
---|---|---|
heapMask |
0xFFFFFFFF |
Todos os tipos de heap são permitidos. |
allocFlags |
0 |
Nenhuma flag definida. |
minAlignment |
0 |
Sem alinhamento. |
Para modificar os parâmetros:
Registre um serviço
android.hardware.media.c2
padrão e forneça parâmetros de uso de ION personalizados.Para criar um novo serviço, copie o arquivo frameworks/av/media/codec2/hidl/services/vendor.cpp para o repositório e modifique
StoreImpl::Interface::SetIonUsage()
conforme necessário.Para reutilizar o processo
media.codec
(OMX), copie e registre a classeStoreImpl
de frameworks/av/media/codec2/hidl/services/vendor.cpp para o arquivomediacodec
(frameworks/av/services/mediacodec/main_codecservice.cpp).
Adicione o seguinte código ao
manifest.xml
do dispositivo.<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 e dependências
O módulo de mídia (com.android.media
) e o módulo Media Codec
(com.android.media.swcodec
) estão no formato
APEX. Os componentes de mídia incluídos dependem apenas das APIs NDK.
Atualizações
Durante uma atualização, os componentes do framework no dispositivo carregam um pacote APEX que contém código Java e nativo.
Figura 1. Fluxo de atualização do componente de mídia
Depois que o framework instala o pacote APEX, o dispositivo é reinicializado e monta a
imagem do disco e os processos do sistema de mídia (media.extractor
e media.codec
) para carregar
os módulos atualizados do ponto de montagem.