Android 10 或更高版本包含多个可更新的媒体组件,它们支持通过 Google Play 商店基础架构或通过合作伙伴提供的无线下载 (OTA) 机制来更新框架组件。媒体组件都一起打包在模块中,这样一来,无需更新整个系统映像即可提供安全更新和功能更新。
以下模块中存在可更新的媒体组件。
媒体。此模块包含媒体提取器、
MediaSession2
API 和MediaParser
API。媒体编解码器:此模块包含可更新的软件 Codec2 组件。
MediaProvider:此模块可优化编入索引的元数据(来自 SD 卡和 USB 设备的音频、视频和图片),并通过 MediaStore 公共 API 将这些数据提供给应用。
如需详细了解如何添加自定义提取器和解码器,请参阅自定义媒体组件。
媒体提取器
在 Android 9 及更低版本中,提取器被编译为单个 libstagefright.so
文件。在 Android 10 或更高版本中,媒体提取器是单独的组件。每个提取器都有自己的 .so
文件,该文件的入口点提供一个嗅探器函数(用于确定提取器是否可以处理给定媒体文件)和一个工厂函数(用于为给定的媒体文件创建提取器实例)。每个提取器的命名(有助于执行调试)和版本控制方式会指示哪个提取器是最新的。
媒体框架会自动加载所有可用的提取器 .so
文件,因此您可以添加新的 .so
文件(无需修改 libstagefright
或其他媒体框架库),从而创建自己的提取器。您还可以确保自定义提取器的优先级高于 Google 提供的提取器。
MediaSession2 API
通过 MediaSession2 API,媒体应用可以向其他进程(如 Android 框架和其他应用)提供其传输控件和播放信息。此组件无法自定义。
MediaParser API
通过 MediaParser API,ExoPlayer 可以高效利用框架媒体容器解析器从媒体容器中提取媒体样本。MediaParser 对源代码边界进行了以下更改:
frameworks/base/apex/media/framework/java/android/media/MediaParser.java
- API 和薄层实现。external/exoplayer/
- MediaParser 基于的 Exoplayer 逐字源代码。
MediaParser API 无法自定义。如需测试 MediaParser,请使用 cts/tests/tests/mediaparser/
中的测试。
媒体编解码器
媒体编解码器模块包含可更新的软件 Codec2 组件。它们是否支持自定义因版本而异:
在 Android 11 或更高版本(尤其是 Google Play 系统更新 v292100200)中,您可以自定义用于 ION 内存分配的参数(如需了解详情,请参阅下文)。
在 Android 9 或更低版本中,OMX 编解码器 API 不可更新,但仍可在 vendor 分区中使用。
ION 内存分配
在 Android 11 或更高版本中以及 Google Play 系统更新 v292100200 或更高版本中,您可以为 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>
格式和依赖项
媒体模块 (com.android.media
) 和媒体编解码器模块 (com.android.media.swcodec
) 采用 APEX 格式。包含的媒体组件仅依赖于 NDK API。
更新
在更新期间,设备上的框架组件会加载包含 Java 和原生代码的 APEX 软件包。
图 1. 媒体组件更新流程
框架安装 APEX 软件包后,设备会重新启动并装载磁盘映像,媒体系统进程(media.extractor
和 media.codec
)会从装载点加载更新后的模块。