增量文件系統

Android 11 中引入的增量檔案系統 (IncFS) 核心模組使 Android 作業系統能夠透過 Android 偵錯橋 (ADB) 接收串流 APK。

這個獨立的核心模組創建了一個新的虛擬檔案系統,位於現有的 Android 檔案系統之上。這補充了框架和 SDK 中的更改,使應用程式和遊戲開發人員能夠透過 ADB 將大型 APK 部署到運行 Android 11 或更高版本的裝置。

核心變更啟用了新的APK 簽章方案 v4 格式,並支援 Android 套件管理器中的 Android 框架變更、新的系統服務以及對 ADB 的變更。

執行

為了實現 IncFS,OEM 和 SoC 製造商必須在其 Android 裝置版本中新增的核心驅動程式。

僅適用於 Android 11 ,如果核心驅動程式建置為模組,則會按需載入。如果沒有透過 ADB 增量安裝安裝任何應用程序,則裝置不會載入核心驅動程式。

否則,當它建構成核心映像的一部分時,始終會載入驅動程式。此實作對 Android 12 及更高版本有效,並可與 Android 11 一起使用。有關將核心驅動程式升級到 Android 12 的信息,請參閱核心驅動程式升級

核心驅動程式是較大系統的一部分,用於啟用串流 APK 安裝。 OEM 和供應商不需要使用範例實作中提供的確切 IncFS 程式碼。但是,為了確保跨裝置的一致體驗,您必須確保 API 實作具有一個檔案系統,該系統具有增量 FS 文件的使用者空間介面中定義的檔案讀取功能和目錄讀寫功能。

此外,實作必須具有在功能上與 IncFS 範例實作相符的掛載選項特殊檔案

下面列出了實施所需的變更:

  1. 設定開發機器來建立核心。
  2. common-android-mainline分支為目標通用核心。
    repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
    repo sync
  3. 驗證 IncFS 所需的以下變更是否在分支簽出中:
  4. defconfig檔案底部附加CONFIG_INCREMENTAL_FS=y僅適用於 Android 11 的CONFIG_INCREMENTAL_FS=m 。要查看範例,請按一下以下連結之一:
  5. 建構核心
  6. 將核心嵌入到Android 裝置映像建置中。
  7. 對於您的目標 Android 設備,請將以下特定於供應商的系統屬性行之一附加到您的device.mk檔案(在使用 Android 12 及更高版本啟動的設備中可選):
  8. 當您使用CONFIG_INCREMENTAL_FS=y時,請在文件中附加以下內容之一:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=yes

    當您使用CONFIG_INCREMENTAL_FS=m僅適用於 Android 11 )時,請在文件中附加下列內容之一:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. 請參閱 Android 模擬器和Pixel 4的範例device.mk檔案。
  10. 僅適用於 Android 11 :如果您使用CONFIG_INCREMENTAL_FS=m ,請新增SE Linux 規則
  11. 建立vold.te檔案並將其新增至您的裝置/system/sepolicy/vendor資料夾,其中包含以下內容:

    • vold.te

    允許它載入增量檔案系統驅動程式:

    • allow vold self:capability sys_module;
    • allow vold vendor_incremental_module:file r_file_perms;
    • allow vold vendor_incremental_module:system module_load;

    將下列 SE Linux 規則附加到/system/sepolicy/vendor資料夾中找到的現有file.te檔案:

    • file.te檔案 - 有關範例,請參閱此file.te檔案。)
    • 增量檔案系統驅動程式
    • type vendor_incremental_module, vendor_file_type, file_type;

    將下列 SE Linux 規則附加到/system/sepolicy/vendor資料夾中找到的現有file_contents檔案:

    • file_contents檔案 - 有關範例,請參閱此file_contents檔案。
    • # Incremental file system driver
    • /vendor/lib/modules/incrementalfs\.ko
    • u:object_r:vendor_incremental_module:s0

核心驅動升級

升級到 Android 12 的裝置可能包含舊版的 IncFS 驅動程式。對於這些設備,AOSP 建議您將 IncFS 驅動程式更新至目前版本(在本例中為 v2),原因如下:

  • 隨 Android 11 一起發布的版本是 IncFS 的初始實現,僅針對 ADB 安裝支援。
  • Android 12 使用 IncFS 驅動程式進行 Play 遊戲的串流安裝,這需要 IncFS v2 的新功能和最佳化才能獲得更好的使用者體驗。
  • V1 支援遊戲串流傳輸,但與 v2 相比,這樣做會帶來效能損失,電池、CPU 和 RAM 使用率更高。
  • V2 提供了改進的串流媒體使用者體驗,具有流暢的進度動畫、精確的磁碟空間使用報告以及防止第三方應用程式串流幹擾。

若要升級核心中的 IncFS 驅動程序,請為核心 4.14 或核心 4.19 應用以下修補程式:

對於所有其他自訂內核版本,請移植補丁集之一。它們僅影響fs/incfs目錄並完全適用於現有的 v1 程式碼。

繼續以與原始但現已升級的 Android 11 相同的方式使用 IncFS 驅動程序,既可以作為核心映像的內建部分,也可以作為單獨的模組。請勿變更系統板或系統屬性配置。

使用 GKI 核心映像的新裝置會自動取得最新 (v2) IncFS 驅動程序,並將其配置為核心映像的一部分。這不需要額外的步驟。

可載入模組配置在 Android 12 中已棄用,且新裝置不支援。僅當原始核心已將其建置為模組時才允許升級或供應商映像凍結。

參考實現

此實作可以被視為核心映像的一部分,或(僅適用於 Android 11 )作為可載入模組。

可載入模組(Pixel 4 設備)Android 模擬器(作為核心映像的一部分)

驗證和測試

使用功能單元測試、CTS 和 GTS 驗證實作。

CTS

使用CtsIncrementalInstallHostTestCases

GTS

atest GtsIncrementalInstallTestCases

/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java

測試 IncFS

  1. 建置開發環境。
  2. 完成實施部分概述的實施任務。
  3. 執行以下手動測試:
    mmma system/incremental_delivery/incfs/tests
    atest libincfs-test
    atest IncrementalServiceTest
    atest PackageManagerShellCommandTest
    PackageManagerShellCommandIncrementalTest

如何使用 Android SDK(ADB 和 apksigner)測試 IncFS

  • 建置開發環境。
  • 完成實施部分概述的實施任務。
  • 在目標實體設備或模擬器上刷新建置。
  • 產生或取得現有 APK。
  • 建立調試簽名金鑰
  • 使用build-tools資料夾中的 v4 簽章格式對 APK進行簽署
    ./apksigner sign --ks debug.keystore game.apk
  • platform-tools資料夾在設備上安裝APK。
    ./adb install game.apk
安裝範例
圖 1 :安裝範例

找到這些測試