媒体模块

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/。Exoplayer MediaParser 构建于其上的逐字来源。

MediaParser API 无法自定义。要测试 MediaParser,请使用 cts/tests/tests/mediaparser/ 中的测试。

媒体编解码器

Media Codecs 模块包括可更新的软件 Codec2 组件。各个版本对自定义的支持有所不同

  • 在 Android 11 或更高版本(特别是Google Play 系统更新 v292100200)中,您可以自定义 ION 内存分配的参数(详情请参见下文)。

  • 在 Android 9 或更低版本中,OMX 编解码器 API 不可更新,但您仍然可以在供应商分区中使用它。

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) 和 Media Codec 模块 (com.android.media.swcodec) 采用 APEX 格式。包含的媒体组件仅依赖于 NDK API。

更新

在更新期间,设备上的框架组件会加载一个包含 Java 和原生代码的 APEX 软件包。

Media Updates

图 1. 媒体组件更新流程

在框架安装 APEX 软件包后,设备会重启并挂载磁盘映像,并且媒体系统进程(media.extractormedia.codec)会从挂载点加载更新后的模块。