O Android 10 ou versões mais recentes incluem vários componentes de mídia atualizáveis que permitem atualizar componentes de framework pela infraestrutura da Google Play Store ou por um mecanismo over the air (OTA) fornecido por um parceiro. Os componentes de mídia são empacotados em módulos que permitem fornecer atualizações de segurança e de recursos sem exigir uma atualização completa da imagem do sistema.
Os componentes de mídia atualizáveis estão nos seguintes módulos.
Media. Esse módulo inclui extratores de mídia, APIs
MediaSession2
e APIsMediaParser
.Codecs de mídia. Esse módulo inclui componentes atualizáveis do software Codec2.
MediaProvider. Esse módulo otimiza metadados indexados (áudio, vídeo e imagens de cartões SD e dispositivos USB) e disponibiliza esses dados para apps pelas APIs públicas do MediaStore.
Para detalhes sobre como adicionar extratores e decodificadores personalizados, consulte 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 mais recente,
os extratores de mídia são componentes separados. Cada extrator tem um arquivo .so
com um ponto de entrada que fornece uma função sniffer para determinar se o
extrator pode processar o arquivo de mídia especificado e uma função factory que cria
uma instância do extrator para o arquivo de mídia especificado. Cada extrator recebe um nome (para ajudar na depuração) e uma versão para indicar qual é o mais recente.
O framework de mídia carrega automaticamente todos os arquivos .so
extratores disponíveis. Assim, você pode criar seus próprios extratores adicionando um novo arquivo .so
sem precisar modificar libstagefright
ou outras bibliotecas do framework de mídia. Você também pode garantir que um extrator personalizado seja preferido em vez do fornecido pelo Google.
API MediaSession2
A API MediaSession2 permite que apps de mídia exponham os controles de transporte e informações de reprodução para outros processos, como o framework Android e outros apps. Esse componente não pode ser personalizado.
API MediaParser
A API MediaParser permite que o ExoPlayer use de maneira eficiente os analisadores de contêiner de mídia do framework para extrair amostras de mídia de 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 de API e camada fina.external/exoplayer/
. Fontes textuais do Exoplayer em que o MediaParser é criado.
A API MediaParser não pode ser personalizada. Para testar o MediaParser, use os testes em
cts/tests/tests/mediaparser/
.
Codecs de mídia
O módulo Media Codecs inclui componentes de software Codec2 atualizáveis. O suporte para personalização varia entre as versões:
No Android 11 ou versões mais recentes (especificamente Atualização do sistema do Google Play v292100200), é possível personalizar os parâmetros para alocação de memória ION (confira abaixo os detalhes).
No Android 9 ou em 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 ION
No Android 11 ou mais recente e na Atualização do sistema do Google Play v292100200 ou mais recente, é possível personalizar os seguintes parâmetros para alocação de memória 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 |
Nenhum alinhamento. |
Para substituir os parâmetros:
Registre um serviço
android.hardware.media.c2
padrão e forneça parâmetros de uso do ION personalizados.Para criar um novo serviço, copie o arquivo frameworks/av/media/codec2/hidl/services/vendor.cpp para seu repositório e modifique
StoreImpl::Interface::SetIonUsage()
conforme necessário.Para reutilizar o processo (OMX)
media.codec
, copie e registre a classeStoreImpl
de frameworks/av/media/codec2/hidl/services/vendor.cpp para o arquivomediacodec
atual (frameworks/av/services/mediacodec/main_codecservice.cpp).
Adicione o seguinte código ao 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 e dependências
Os módulos Media (com.android.media
) e Media Codec (com.android.media.swcodec
) estão no formato APEX. Os componentes de mídia incluídos dependem apenas das APIs do 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. O fluxo de atualização do componente de mídia
Depois que o framework instala o pacote APEX, o dispositivo é reinicializado e monta a
imagem de disco. Os processos do sistema de mídia (media.extractor
e media.codec
) carregam
os módulos atualizados do ponto de montagem.