SDK 擴充功能

SDK 擴充功能模組會決定裝置的擴充功能 SDK 級別,並提供 API 供應用程式查詢擴充功能 SDK 級別。這個模組可更新,也就是說,即使不在正常的 Android 發布週期內,也能接收功能更新。

SDK 擴充功能負責:

  • 決定裝置的擴充功能 SDK 層級。
  • 提供 API,供應用程式查詢擴充功能 SDK 級別。
  • (Android 12 以上版本) 判斷 BOOTCLASSPATHDEX2OATBOOTCLASSPATHSYSTEMSERVERCLASSPATH 環境變數的值。

模組格式

SDK 擴充功能模組 (com.android.sdkext) 採用 APEX 格式,適用於搭載 Android 11 以上版本的裝置。

套件格式

SDK 擴充功能模組 (com.google.android.sdkext) 採用 APEX 格式,並包含下列元件:

  • (Android 12 以上版本) bin/derive_classpath:在裝置啟動程序早期執行的原生二進位檔。這個檔案會從系統和其他模組讀取個別類別路徑設定檔、合併這些檔案,並定義 CLASSPATH 環境變數的定義。

  • bin/derive_sdk:原生二進位檔,會在裝置啟動程序初期執行,並讀取其他模組的中繼資料,設定與擴充功能 SDK 相關的系統屬性 (例如 build.version.extensions.r)。

  • javalib/framework-sdkextension.jar:這個檔案位於 bootclasspath,可向應用程式公開 API,以查詢擴充功能 SDK 層級。

衍生擴充功能 SDK 層級

derive_sdk 程式會讀取儲存在每個 APEX 模組內 etc/sdkinfo.binarypb 子路徑中的二進位 Protobuf 檔案。如要進一步瞭解 protobuf 結構,請參閱 protobuf 檔案。

讀取擴充功能 SDK 層級

SDK 擴充功能模組會在 android.os.ext 套件中公開 SdkExtensions Java 類別。使用 getExtensionVersion(int) 方法讀取 SDK 擴充功能的版本 (例如 getExtensionVersion(Build.VERSION_CODES.R))。

衍生類別路徑

derive_classpath 服務會讀取並合併 /system/etc/classpaths//apex/*/etc/classpaths/ 中的個別設定檔。每個設定都會以 proto 二進位格式,儲存 classpaths.proto 中的 protobuf 訊息。決定類路徑項目順序的確切合併演算法如derive_classpath.cpp所述,且可能會隨時間變更。