媒体模块

Android 10 或更高版本包含多个可更新的媒体组件,它们支持通过 Google Play 商店基础架构或通过合作伙伴提供的无线下载 (OTA) 机制来更新框架组件。媒体组件都一起打包在模块中,这样一来,无需更新整个系统映像即可提供安全更新和功能更新。

以下模块中存在可更新的媒体组件。

如需详细了解如何添加自定义提取器和解码器,请参阅自定义媒体组件

媒体提取器

在 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 不对齐。

如需替换参数,请执行以下操作:

  1. 注册默认的 android.hardware.media.c2 服务并提供自定义 ION 用法参数。

  2. 将以下代码添加到设备的 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.extractormedia.codec)会从装载点加载更新后的模块。