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