SDK Extensions モジュールはデバイスの拡張 SDK レベルを決定し、アプリで拡張 SDK レベルを照会するための API を提供します。このモジュールは更新可能です。つまり、通常の Android リリース サイクル外で機能のアップデートを受信できます。
SDK Extensions の役割は次のとおりです。
- デバイスの拡張 SDK レベルを決定する。
- 拡張 SDK レベルをアプリが照会するための API を提供する。
- (Android 12 以降)環境変数
BOOTCLASSPATH
、DEX2OATBOOTCLASSPATH
、SYSTEMSERVERCLASSPATH
の値を判別する。
モジュールの形式
SDK Extensions モジュール(com.android.sdkext
)は APEX 形式であり、Android 11 以降を搭載したデバイスで使用できます。
パッケージの形式
SDK Extensions モジュール(com.google.android.sdkext
)は APEX 形式であり、次のコンポーネントを含んでいます。
(Android 12 以降)
bin/derive_classpath
: デバイスの起動プロセスの初期段階で実行されるネイティブ バイナリ。個々のクラスパス構成ファイルをシステムやその他のモジュールから読み込み、それらを統合して、CLASSPATH
環境変数を設定します。bin/derive_sdk
: このネイティブ バイナリは、デバイスの起動プロセスの初期段階で実行され、他のモジュールのメタデータを読み取り、拡張 SDK に関連するシステム プロパティ(例:build.version.extensions.r
)を設定します。javalib/framework-sdkextension.jar
: このファイルは、bootclasspath にあり、拡張 SDK レベルを照会する API をアプリに公開しています。
拡張 SDK レベルの導出
derive_sdk
プログラムは、各 APEX モジュール内の etc/sdkinfo.binarypb
サブパスにバイナリ protobuf ファイルとして格納されているメタデータを読み取ります。protobuf 構造の詳細については、protobuf
ファイルをご覧ください。
拡張 SDK レベルの読み取り
SDK Extensions モジュールでは、android.os.ext
パッケージの SdkExtensions
Java クラスを公開しています。getExtensionVersion(int)
メソッドを使用して、SDK 拡張機能のバージョン(getExtensionVersion(Build.VERSION_CODES.R)
など)を読み取ります。
クラスパスの導出
derive_classpath
サービスは、/system/etc/classpaths/
と /apex/*/etc/classpaths/
の個々の構成ファイルを読み取り、統合します。各構成には、classpaths.proto
からの protobuf メッセージが proto バイナリ形式で保存されています。クラスパス エントリの順序を決定するマージ アルゴリズムの厳密なものは、derive_classpath.cpp
に記述されています。これは、今後変更される可能性があります。