Android 10 以降には、Google Play ストアのインフラストラクチャまたはパートナーが提供する無線(OTA)メカニズムを介して、フレームワーク コンポーネントを更新できるようにする、更新可能なメディア コンポーネントが用意されています。メディア コンポーネントは、システム イメージ全体を更新せずにセキュリティ アップデートと機能アップデートを提供できるモジュールにパッケージ化されています。
更新可能なメディア コンポーネントは、次のモジュールに格納されています。
メディア。このモジュールには、Media Extractor、
MediaSession2
API、MediaParser
API が含まれます。Media Codec。このモジュールには、更新可能なソフトウェア Codec2 コンポーネントが含まれます。
MediaProvider。このモジュールは、インデックスに登録されたメタデータ(SD カードと USB デバイスのオーディオ、動画、画像)を最適化し、そのデータを MediaStore 公開 API を介してアプリで利用できるようにします。
カスタムのエクストラクタとデコーダの追加について詳しくは、メディア コンポーネントのカスタマイズをご覧ください。
Media Extractor
Android 9 以前では、エクストラクタは 1 つの libstagefright.so
ファイルにコンパイルされています。Android 10 以降では、メディア エクストラクタは別々のコンポーネントです。各エクストラクタには独自の .so
ファイルがあり、エクストラクタが特定のメディア ファイルを処理できるかどうかを判別する sniffer 関数と、特定のメディア ファイルのエクストラクタのインスタンスを作成する factory 関数を提供するエントリ ポイントが用意されています。各エクストラクタには(デバッグに役立つように)名前が付けられ、どのエクストラクタが最新であるかを示すようにバージョンが付けられています。
メディア フレームワークでは、使用可能なすべてのエクストラクタの .so
ファイルが自動的に読み込まれるため、libstagefright
などのメディア フレームワーク ライブラリを変更せずに、新しい .so
ファイルを追加することで独自のエクストラクタを作成できます。また、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/
のテストを使用します。
Media Codec
Media Codec モジュールには、更新可能なソフトウェア Codec2 コンポーネントが含まれます。カスタマイズのサポートはリリースによって異なります。
Android 11 以降(具体的には Google Play システム アップデート v292100200)では、ION メモリ割り当てのパラメータをカスタマイズできます(詳細は後述します)。
Android 9 以前では、OMX コーデック API は更新できませんが、ベンダー パーティションでは使用できます。
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
プロセスを再利用するには、frameworks/av/media/codec2/hidl/services/vendor.cpp から既存のmediacodec
ファイル(frameworks/av/services/mediacodec/main_codecservice.cpp)に、StoreImpl
クラスをコピーして登録します。
次のコードをデバイスの
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 形式です。含まれるメディア コンポーネントは、NDK API にのみ依存します。
更新
更新中、デバイスのフレームワーク コンポーネントは、Java とネイティブ コードを含む APEX パッケージを読み込みます。
図 1. メディア コンポーネントの更新フロー
フレームワークが APEX パッケージをインストールすると、デバイスが再起動してディスク イメージをマウントし、メディア システム プロセス(media.extractor
と media.codec
)が更新されたモジュールをマウント ポイントから読み込みます。