媒體模組

Android 10 以上版本包含多個可更新的媒體元件,可透過 Google Play 商店基礎架構或合作夥伴提供的無線 (OTA) 機制更新架構元件。媒體元件會封裝在模組中,因此不必更新完整系統映像檔,也能提供安全性更新和功能更新。

下列模組包含可更新的媒體元件。

如要瞭解如何新增自訂擷取器和解碼器,請參閱「自訂媒體元件」。

媒體擷取器

在 Android 9 以下版本中,擷取器會編譯為單一 libstagefright.so 檔案。在 Android 10 以上版本中,媒體擷取器是獨立元件。每個擷取器都有自己的 .so 檔案,其中包含提供 sniffer 函式的進入點,可判斷擷取器是否能處理指定的媒體檔案,以及建立指定媒體檔案擷取器例項的 factory 函式。每個擷取器都會命名 (有助於偵錯),並標示版本,指出哪個擷取器是最新版本。

媒體架構會自動載入所有可用的擷取器 .so 檔案,因此您只要新增 .so 檔案,就能建立自己的擷取器,不必修改 libstagefright 或其他媒體架構程式庫。您也可以確保自訂擷取器優先於 Google 提供的擷取器。

MediaSession2 API

媒體應用程式可透過 MediaSession2 API,將傳輸控制項和播放資訊公開給其他程序,例如 Android 架構和其他應用程式。這個元件無法自訂。

MediaParser API

ExoPlayer 可透過 MediaParser API 善用架構媒體容器剖析器,從媒體容器擷取媒體樣本。MediaParser 包含下列原始碼界線變更:

  • frameworks/base/apex/media/framework/java/android/media/MediaParser.java。 API 和精簡層實作。

  • external/exoplayer/。ExoPlayer 逐字來源,MediaParser 是以這些來源為基礎建構而成。

MediaParser API 無法自訂。如要測試 MediaParser,請使用 cts/tests/tests/mediaparser/ 中的測試。

媒體轉碼器

媒體轉碼器模組包含可更新的軟體 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) 和媒體轉碼器模組 (com.android.media.swcodec) 採用 APEX 格式。內含的媒體元件只會依賴 NDK API。

更新

更新期間,裝置上的架構元件會載入包含 Java 和原生程式碼的 APEX 封裝。

媒體更新

圖 1. 媒體元件更新流程

架構安裝 APEX 封裝後,裝置會重新啟動並掛接磁碟映像檔,而媒體系統程序 (media.extractormedia.codec) 會從掛接點載入更新後的模組。