增量文件系統

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. 追加任CONFIG_INCREMENTAL_FS=y或為Android 11只CONFIG_INCREMENTAL_FS=m處的底部defconfig文件。要查看示例,請單擊以下鏈接之一:
  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. 見例如device.mk文件Android模擬器和像素4
  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的規則,以現有的file.te文件在您找到/system/sepolicy/vendor文件夾:

    • file.te文件-對於一個例子來看看這個file.te文件)。
    • 增量文件系統驅動
    • type vendor_incremental_module, vendor_file_type, file_type;

    將以下SE Linux的規則,以現有的file_contents文件在您找到/system/sepolicy/vendor文件夾:

    • 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,具有流暢的進度動畫、精確的磁盤空間使用情況報告以及防止 3rd 方應用程序流式傳輸干擾。

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

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

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

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

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

參考實現

這種實現可以看作是作為內核圖像的一部分,或者(Android設備11只),其為可加載模塊。

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

驗證和測試

使用功能單元測試、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。
  • 創建調試簽名密鑰
  • 註冊從V4簽名格式的APK build-tools文件夾中。
    ./apksigner sign --ks debug.keystore game.apk
  • 安裝設備上的APK platform-tools文件夾中。
    ./adb install game.apk
安裝示例
圖1:安裝例如

找到這些測試