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 示例實現相匹配的掛載選項和特殊文件。
以下列出了實施所需的更改:
- 設置開發機器以構建內核。
- 從
common-android-mainline
分支定位通用內核。repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
repo sync
- 驗證 IncFS 所需的以下更改是否在分支結帳中:
- https://android-review.googlesource.com/c/kernel/common/+/1222869/
- https://android-review.googlesource.com/c/kernel/common/+/1222870
- https://android-review.googlesource.com/c/kernel/common/+/1222871
- https://android-review.googlesource.com/q/%2522ANDROID:+Incremental+fs:%2522+branch:android-mainline+status:merg
- 在
defconfig
文件的底部附加CONFIG_INCREMENTAL_FS=y
或僅適用於 Android 11的CONFIG_INCREMENTAL_FS=m
。要查看示例,請單擊以下鏈接之一: - 構建內核
- 將內核嵌入到Android 設備映像構建中。
- 對於您的目標 Android 設備,將以下供應商特定的系統屬性行之一附加到您的
device.mk
文件(在 Android 12 及更高版本中是可選的): -
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=yes
-
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- 請參閱 Android 模擬器和Pixel 4的示例
device.mk
文件。 - 僅適用於 Android 11 :如果您使用的是
CONFIG_INCREMENTAL_FS=m
,請添加SE Linux Rules 。 -
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;
-
file.te
文件 - 有關示例,請參file.te
文件。) - 增量文件系統驅動程序
type vendor_incremental_module, vendor_file_type, file_type;
-
file_contents
文件 - 例如,請參閱此file_contents
文件。 -
# Incremental file system driver
-
/vendor/lib/modules/incrementalfs\.ko
-
u:object_r:vendor_incremental_module:s0
當您使用CONFIG_INCREMENTAL_FS=y
時,請在文件中附加以下之一:
當您使用CONFIG_INCREMENTAL_FS=m
(僅適用於 Android 11 )時,請在文件中附加以下內容之一:
創建一個vold.te
文件並將其添加到您的設備/system/sepolicy/vendor
文件夾,其中包含以下內容:
允許它加載增量文件系統驅動程序:
將以下 SE Linux 規則附加到/system/sepolicy/vendor
文件夾中的現有file.te
文件中:
將以下 SE Linux 規則附加到/system/sepolicy/vendor
文件夾中的現有file_contents
文件中:
內核驅動升級
升級到 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
- 搭建開發環境。
- 完成實施部分中概述的實施任務。
- 運行以下手動測試:
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
![安裝示例](https://source.android.google.cn/static/devices/architecture/images/incfs-incremental-install.png?authuser=8&hl=zh-tw)
找到這些測試
- /android/kernel/common/tools/testing/selftests/filesystems/incfs/
- /android/system/incremental_delivery/incfs/tests/incfs_test.cpp
- /android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java