В Android 10 и более поздних версиях есть несколько обновляемых медиакомпонентов, которые позволяют обновлять компоненты фреймворка через инфраструктуру Google Play или с помощью беспроводного обновления, предоставленного партнером. Компоненты мультимедиа упакованы в модули, что позволяет обновлять систему безопасности и функции без обновления всего образа системы.
Обновляемые медиакомпоненты есть в следующих модулях:
Media. Этот модуль включает извлекатели медиаданных, API
MediaSession2и APIMediaParser.Медиакодеки. Этот модуль содержит обновляемые программные компоненты Codec2.
MediaProvider. Этот модуль оптимизирует индексированные метаданные (аудио, видео и изображения с SD-карт и USB-устройств) и делает их доступными для приложений через общедоступные API MediaStore.
Подробнее о том, как добавить специальные экстракторы и декодеры…
Извлечение медиаданных
В Android 9 и более ранних версиях извлекатели компилируются в один файл libstagefright.so. В Android 10 и более поздних версий извлекатели медиаконтента являются отдельными компонентами. У каждого экстрактора есть собственный файл .so с точкой входа, которая предоставляет функцию sniffer, чтобы определить, может ли экстрактор обработать заданный медиафайл, и функцию factory, которая создает экземпляр экстрактора для заданного медиафайла. Каждый экстрактор имеет название (для удобства отладки) и версию, чтобы можно было определить, какой из них самый новый.
Медиафреймворк автоматически загружает все доступные файлы экстракторов .so, поэтому вы можете создавать собственные экстракторы, добавляя новые файлы .so, не изменяя libstagefright или другие библиотеки медиафреймворка. Вы также можете настроить приоритет пользовательского извлекателя над извлекателем, предоставленным Google.
MediaSession2 API
API MediaSession2 позволяет мультимедийным приложениям предоставлять элементы управления воспроизведением и информацию о нем другим процессам, например фреймворку Android и другим приложениям. Этот компонент нельзя настроить.
MediaParser API
MediaParser API позволяет 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 версии 292100200) можно настраивать параметры распределения памяти 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()по мере необходимости.Чтобы повторно использовать процесс (OMX)
media.codec, скопируйте и зарегистрируйте класс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) загрузят обновленные модули из точки монтирования.