增量文件系統

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 11CONFIG_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 Rules
  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 為流式傳輸提供了改進的 UX,具有流暢的進度動畫、精確的磁盤空間使用報告以及防止第 3 方應用程序流式傳輸干擾。

要升級內核中的 IncFS 驅動程序,請為內核 4.14 或內核 4.19 應用以下補丁:

對於所有其他自定義內核版本,請移植其中一個補丁集。它們只影響fs/incfs目錄並乾淨地應用於現有的 v1 代碼。

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

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

可加載模塊配置在 Android 12 中已棄用,並且不支持新設備。僅當原始內核已經將其構建為模塊時,才允許升級或供應商映像凍結。

參考實現

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

可加載模塊(Pixel 4 設備)Android Emulator(作為內核映像的一部分)

驗證和測試

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

中旅

使用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 :安裝示例

找到這些測試