В Android 10 и более поздних версиях есть несколько обновляемых медиакомпонентов, которые позволяют обновлять компоненты фреймворка через инфраструктуру Google Play Store или через предоставляемый партнёрами механизм беспроводного обновления (OTA). Медиакомпоненты объединены в модули, что позволяет устанавливать обновления безопасности и функций без необходимости полного обновления образа системы.
Обновляемые медиа-компоненты существуют в следующих модулях.
Медиа. Этот модуль включает в себя экстракторы медиаданных , API
MediaSession2
и APIMediaParser
.Медиакодеки . Этот модуль включает обновляемые программные компоненты Codec2.
MediaProvider . Этот модуль оптимизирует индексированные метаданные (аудио, видео и изображения с SD-карт и USB-устройств) и делает эти данные доступными для приложений через общедоступные API MediaStore .
Подробную информацию о добавлении пользовательских экстракторов и декодеров см. в разделе Настройка компонентов мультимедиа .
Медиа-экстракторы
В Android 9 и более ранних версиях экстракторы скомпилированы в один файл libstagefright.so
. В Android 10 и более поздних версиях экстракторы медиафайлов являются отдельными компонентами. Каждый экстрактор имеет свой собственный .so
-файл с точкой входа, предоставляющей функцию сниффера для определения возможности обработки данного медиафайла, а также фабричную функцию, создающую экземпляр экстрактора для данного медиафайла. Каждому экстрактору присваивается имя (для облегчения отладки) и указывается его версия, указывающая, какой экстрактор является самым новым.
Медиа-фреймворк автоматически загружает все доступные .so
-файлы экстракторов, поэтому вы можете создавать собственные экстракторы, добавляя новый .so
файл без необходимости вносить изменения libstagefright
или другие библиотеки медиа-фреймворка. Вы также можете настроить пользовательский экстрактор как предпочтительный вместо экстрактора Google.
API MediaSession2
API MediaSession2 позволяет медиаприложениям предоставлять доступ к элементам управления передачей и данным воспроизведения другим процессам, таким как фреймворк Android и другие приложения. Этот компонент не подлежит настройке.
API MediaParser
API MediaParser позволяет ExoPlayer эффективно использовать парсеры медиаконтейнеров фреймворка для извлечения образцов медиаконтента из медиаконтейнеров. MediaParser включает следующие изменения в границах исходного кода:
frameworks/base/apex/media/framework/java/android/media/MediaParser.java
. API и тонкослойная реализация.external/exoplayer/
. Дословные исходные тексты Exoplayer, на которых построен MediaParser.
API MediaParser не поддается настройке. Для тестирования MediaParser используйте тесты из cts/tests/tests/mediaparser/
.
Медиа-кодеки
Модуль Media Codecs включает обновляемые программные компоненты Codec2. Поддержка настройки различается в зависимости от версии:
В Android 11 и выше (в частности, Google Play System Update v292100200 ) вы можете настроить параметры распределения памяти ION (подробности см. ниже).
В Android 9 и ниже API кодека OMX не обновляется, но вы по-прежнему можете использовать его в разделе поставщика.
Распределение памяти ION
В Android 11 и выше и обновлении системы Google Play версии 292100200 и выше вы можете настроить следующие параметры распределения памяти ION.
Параметр | Значение по умолчанию | Описание |
---|---|---|
heapMask | 0xFFFFFFFF | Разрешены все типы куч. |
allocFlags | 0 | Флаги не установлены. |
minAlignment | 0 | Нет выравнивания. |
Чтобы переопределить параметры:
Зарегистрируйте службу
android.hardware.media.c2
по умолчанию и укажите пользовательские параметры использования ION.Чтобы создать новую службу, скопируйте файл frameworks/av/media/codec2/hidl/services/vendor.cpp в свой репозиторий, а затем измените
StoreImpl::Interface::SetIonUsage()
по мере необходимости.Чтобы повторно использовать процесс
media.codec
(OMX), скопируйте и зарегистрируйте классStoreImpl
из frameworks/av/media/codec2/hidl/services/vendor.cpp в существующий файлmediacodec
( frameworks/av/services/mediacodec/main_codecservice.cpp ).
Добавьте следующий код в
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>
Формат и зависимости
Модуль Media ( com.android.media
) и модуль Media Codec ( com.android.media.swcodec
) представлены в формате APEX . Включенные медиакомпоненты используют только API NDK.
Обновления
Во время обновления компоненты фреймворка на устройстве загружают пакет APEX, содержащий Java и собственный код.
Рисунок 1. Процесс обновления медиа-компонента
После того, как фреймворк установит пакет APEX, устройство перезагружается и монтирует образ диска, а системные процессы мультимедиа ( media.extractor
и media.codec
) загружают обновленные модули из точки монтирования.