漸進式檔案系統

Android 11 推出的 Incremental File System (IncFS) 核心模組,可讓 Android OS 透過 Android Debug Bridge (ADB) 接收串流 APK。

這個獨立的 Kernel 模組會建立新的虛擬檔案系統,位於現有 Android 檔案系統的頂端。這項功能與架構和 SDK 的變更相輔相成,可讓應用程式和遊戲開發人員透過 ADB,將大型 APK 部署至搭載 Android 11 以上版本的裝置。

這項核心變更可啟用新的 APK 簽署配置 v4 格式,並支援 Android 封裝管理工具中的 Android 架構變更、新的系統服務,以及 ADB 的變更。

實作

如要實作 IncFS,原始設備製造商和 SoC 製造商必須在 Android 裝置建構版本中新增核心驅動程式。

僅適用於 Android 11:如果核心驅動程式是建構為模組,系統會視需要載入。如果沒有透過 ADB 增量安裝任何應用程式,裝置就不會載入核心驅動程式。

否則,當驅動程式建構為核心映像檔的一部分時,系統一律會載入驅動程式。這項實作方式適用於 Android 12 以上版本,且可搭配 Android 11 使用。如要瞭解如何將核心驅動程式升級至 Android 12,請參閱「核心驅動程式升級」。

核心驅動程式是較大型系統的一部分,可啟用 APK 串流安裝功能。OEM 和供應商不必使用範例實作中提供的確切 IncFS 程式碼。不過,為確保裝置間的體驗一致,您必須確保 API 實作項目具有檔案系統,且該檔案系統具備檔案讀取功能和目錄讀寫功能,如「Userspace interface for Incremental 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 4device.mk 檔案範例。
  10. 僅適用於 Android 11:如果您使用 CONFIG_INCREMENTAL_FS=m,請新增 SE Linux 規則
  11. 在裝置的 /system/sepolicy/vendor 資料夾中建立並新增 vold.te 檔案,並加入以下內容:

    • 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 驅動程式。對於這類裝置,Android 開放原始碼計畫建議您將 IncFS 驅動程式更新至目前版本 (本例為 v2),原因如下:

  • Android 11 隨附的版本是 IncFS 的初始實作項目,僅支援透過 ADB 安裝。
  • Android 12 會使用 IncFS 驅動程式串流安裝 Play 遊戲,因此需要 IncFS 第 2 版的新功能和最佳化項目,才能提供更優質的使用者體驗。
  • 第 1 版支援遊戲串流,但效能會受到影響,且電池、CPU 和 RAM 用量會高於第 2 版。
  • 第 2 版提供更優質的串流體驗,包括流暢的進度動畫、精確的磁碟空間用量報表,以及防止第三方應用程式干擾串流。

如要升級核心中的 IncFS 驅動程式,請套用核心 4.14 或核心 4.19 的下列修補程式:

如要使用其他自訂核心版本,請移植其中一個修補程式集。這些變更只會影響 fs/incfs 目錄,並會乾淨地套用至現有的 v1 程式碼。

繼續以與原始版本相同的方式使用 IncFS 驅動程式,但現在已升級至 Android 11,無論是做為核心映像檔的內建部分,或是做為獨立模組,都可以使用。請勿變更系統板或系統屬性設定。

使用 GKI 核心映像檔的新裝置會自動取得最新 (v2) 版 IncFS 驅動程式,並在核心映像檔中完成設定。這項操作不需要額外步驟。

Android 12 已淘汰可載入的模組設定,且新裝置不支援這項設定。只有在升級時,或原始核心已將其建構為模組時,才允許供應商凍結映像檔。

參考實作

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

可載入的模組 (Pixel 4 裝置) Android Emulator (屬於核心映像檔)

驗證和測試

使用功能單元測試、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:安裝範例

找出這些測試