Android デバイスのメーカーは、さまざまな理由で AOSP ライブラリのソース コードを変更します。一部のベンダーは AOSP ライブラリに関数を再実装してパフォーマンスを向上させますが、他のベンダーは新しいフック、新しい API、または新しい機能を AOSP ライブラリに追加します。このセクションでは、CTS/VTS を壊さない方法で AOSP ライブラリを拡張するためのガイドラインを提供します。
ドロップイン交換
変更された共有ライブラリはすべて、バイナリ互換性があり、対応する AOSP のドロップイン置換である必要があります。すべての既存の AOSP ユーザーは、変更された共有ライブラリを再コンパイルせずに使用できる必要があります。この要件は次のことを意味します。
- AOSP 機能は削除しないでください。
- 構造がユーザーに公開されている場合は、構造を変更してはなりません。
- 関数の前提条件を強化してはなりません。
- 関数は同等の機能を提供する必要があります。
- 関数の事後条件を弱めてはなりません。
拡張モジュールの分類
定義および使用する機能によってモジュールを分類します。
注: API/ABI を変更せずに機能を追加できるため、ここでは API/ABI の代わりに機能が使用されています。
モジュールで定義されている機能に応じて、モジュールはDA モジュールとDX モジュールに分類できます。
- 定義専用 AOSP モジュール (DA モジュール) は、対応する AOSP にはない新しい機能を定義しません。
- 例 1.完全な未変更の AOSP ライブラリは DA モジュールです。
- 例 2.ベンダーが
libcrypto.so
の関数を SIMD 命令で (新しい関数を追加せずに) 書き換えた場合、変更されたlibcrypto.so
DA モジュールになります。
- 定義拡張モジュール (DX モジュール) は、新しい機能を定義するか、AOSP に相当する機能を持っていません。
- 例 1.ベンダーが一部の内部データにアクセスするために
libjpeg.so
にヘルパー関数を追加した場合、変更されたlibjpeg.so
は DX-Lib になり、新しく追加された関数はライブラリの拡張部分になります。 - 例 2.ベンダーが
libfoo.so
という名前の非 AOSP ライブラリを定義した場合、libfoo.so
DX-Lib になります。
- 例 1.ベンダーが一部の内部データにアクセスするために
モジュールで使用される機能に応じて、モジュールはUA-ModuleとUX-Moduleに分類できます。
- AOSP のみを使用するモジュール (UA モジュール) は、実装で AOSP 機能のみを使用します。非 AOSP 拡張機能には依存しません。
- 例 1.完全な未変更の AOSP ライブラリは UA モジュールです。
- 例 2.変更された共有ライブラリ
libjpeg.so
他の AOSP API のみに依存する場合、それは UA モジュールになります。
- 使用拡張モジュール (UX モジュール) は、実装において一部の非 AOSP 機能に依存します。
- 例 1.変更された
libjpeg.so
libjpeg_turbo2.so
という名前の別の非 AOSP ライブラリに依存する場合、変更されたlibjpeg.so
は UX モジュールになります。 - 例 2.ベンダーが変更された
libexif.so
に新しい関数を追加し、変更されたlibjpeg.so
がlibexif.so
から新しく追加された関数を使用する場合、変更されたlibjpeg.so
は UX モジュールになります。
- 例 1.変更された
定義と使用法は互いに独立しています。
使用される機能 | |||
---|---|---|---|
AOSP (UA) のみ | 拡張(UX) | ||
定義された機能 | AOSP (DA) のみ | ダウア | ダックス |
拡張(DX) | DXUA | DXUX |
VNDK 拡張メカニズム
同じ名前の AOSP ライブラリには拡張機能がないため、拡張機能に依存するベンダー モジュールは動作しません。ベンダー モジュールが拡張機能に直接的または間接的に依存する場合、ベンダーは DAUX、DXUA、および DXUX 共有ライブラリをベンダー パーティションにコピーする必要があります (ベンダー プロセスは常に最初にベンダー パーティション内の共有ライブラリを検索します)。ただし、LL-NDK ライブラリをコピーしてはなりません。そのため、ベンダー モジュールは、変更された LL-NDK ライブラリによって定義された拡張機能に依存してはなりません。
対応する AOSP ライブラリが同じ機能を提供でき、システム パーティションが汎用システム イメージ (GSI) によって上書きされてもベンダー モジュールが動作し続ける場合、DAUA 共有ライブラリはシステム パーティション上に残ることができます。
GSI 内の未変更の VNDK ライブラリは、名前が衝突すると変更された共有ライブラリとリンクするため、ドロップイン置換は重要です。 AOSP ライブラリが API/ABI と互換性のない方法で変更された場合、GSI 内の AOSP ライブラリはリンクに失敗したり、未定義の動作が発生したりする可能性があります。