SDK Extensions

SDK Extensions モジュールはデバイスの拡張 SDK レベルを決定し、アプリで拡張 SDK レベルを照会するための API を提供します。このモジュールは更新可能です。つまり、通常の Android リリース サイクル外で機能のアップデートを受信できます。

SDK Extensions の役割は次のとおりです。

  • デバイスの拡張 SDK レベルを決定する。
  • 拡張 SDK レベルをアプリが照会するための API を提供する。
  • (Android 12 以降)環境変数 BOOTCLASSPATHDEX2OATBOOTCLASSPATHSYSTEMSERVERCLASSPATH の値を判別する。

モジュールの形式

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 に記述されています。これは、今後変更される可能性があります。