O Android 10 ou superior inclui vários componentes de mídia atualizáveis que permitem a atualização de componentes da estrutura por meio da infraestrutura da Google Play Store ou por meio de um mecanismo over-the-air (OTA) fornecido por parceiros. Os componentes de mídia são agrupados 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.
Meios de comunicação. Este módulo inclui extratores de mídia , APIs
MediaSession2
e APIsMediaParser
.Codecs de mídia . Este módulo inclui componentes de software Codec2 atualizáveis.
MediaProvider . Este módulo otimiza metadados indexados (áudio, vídeo e imagens de cartões SD e dispositivos USB) e disponibiliza esses dados para aplicativos por meio das APIs públicas do MediaStore .
Para obter detalhes sobre como adicionar extratores e decodificadores personalizados, consulte Personalização de 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 superior, os extratores de mídia são componentes separados. Cada extrator tem seu próprio arquivo .so
com um ponto de entrada que fornece uma função sniffer para determinar se o extrator pode manipular o arquivo de mídia fornecido e uma função de fábrica que cria uma instância do extrator para o arquivo de mídia fornecido. Cada extrator é nomeado (para ajudar na depuração) e versionado para indicar qual extrator é o mais novo.
A estrutura de mídia carrega automaticamente todos os arquivos .so
de extração disponíveis, para que você possa criar seus próprios extratores adicionando um novo arquivo .so
sem precisar modificar libstagefright
ou outras bibliotecas de estrutura de mídia. Você também pode garantir que um extrator personalizado seja preferido ao extrator fornecido pelo Google.
API MediaSession2
A API MediaSession2 permite que aplicativos de mídia exponham seus controles de transporte e informações de reprodução a outros processos, como a estrutura Android e outros aplicativos. Este componente não pode ser personalizado.
API MediaParser
A API MediaParser permite que o ExoPlayer faça uso eficiente de analisadores de contêineres de mídia para extrair amostras de mídia de contêineres de mídia. MediaParser inclui as seguintes alterações 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 literais do Exoplayer nas quais o MediaParser é construído.
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 difere entre as versões:
No Android 11 ou superior (especificamente Google Play System Update v292100200 ), você pode personalizar os parâmetros para alocação de memória ION (veja detalhes abaixo).
No Android 9 ou inferior, a API do codec OMX não é atualizável, mas você ainda pode usá-la na partição do fornecedor.
Alocação de memória ION
No Android 11 ou superior e na atualização do sistema Google Play v292100200 ou superior, você pode 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 | Nenhum sinalizador definido. |
minAlignment | 0 | Sem alinhamento. |
Para substituir 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 seu 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
existente ( 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
O módulo Media ( 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 de APIs NDK.
Atualizações
Durante uma atualização, os componentes da estrutura no dispositivo carregam um pacote APEX que contém Java e código nativo.
Figura 1. Fluxo de atualização do componente de mídia
Depois que a estrutura 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
) carregam os módulos atualizados do ponto de montagem.