Android 11 中推出的 Incremental File System (IncFS) 核心模組可讓 Android 作業系統透過 Android Debug Bridge (ADB) 接收串流 APK。
這個獨立的核心模組會建立新的虛擬檔案系統,並置於現有 Android 檔案系統之上。這項功能可補足架構和 SDK 的變更,讓應用程式和遊戲開發人員透過 ADB 將大型 APK 部署至搭載 Android 11 以上版本的裝置。
核心變更可啟用新的 APK Signature Scheme v4 格式,並支援 Android 套件管理工具中的 Android 架構變更、新的系統服務和 ADB 變更。
實作
如要實作 IncFS,原始設備製造商 (OEM) 和 SoC 製造商必須在 Android 裝置版本中新增核心驅動程式。
僅限 Android 11:如果核心驅動程式是以模組形式建構,則會視需要載入。如果沒有透過 ADB 增量安裝程序安裝任何應用程式,裝置就不會載入核心驅動程式。
否則,當驅動程式在建構時成為核心映像檔的一部分,系統一律會載入驅動程式。這項實作適用於 Android 12 以上版本,並可與 Android 11 搭配使用。如要瞭解如何將核心驅動程式升級至 Android 12,請參閱「核心驅動程式升級」。
核心驅動程式是更大系統的一部分,可啟用串流 APK 安裝作業。OEM 和供應商不必使用範例實作中提供的 IncFS 程式碼。不過,為確保各裝置的使用體驗一致,您必須確保 API 實作具有檔案讀取功能和目錄讀寫功能,如增量檔案系統的使用者空間介面說明文件所定義。
此外,實作項目必須具備功能上與 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 規則。 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 驅動程式。針對這些裝置,Android 開放原始碼計畫建議您將 IncFS 驅動程式更新至目前版本 (在本例中為 v2),原因如下:
- 與 Android 11 一併發布的版本是 IncFS 的初始實作項目,僅針對 ADB 安裝支援功能。
- Android 12 會使用 IncFS 驅動程式串流安裝 Play 遊戲,這需要 IncFS 第 2 版的新功能和最佳化功能,才能提供更優質的使用者體驗。
- 第 1 版支援遊戲串流功能,但會導致效能降低,且電池、CPU 和 RAM 的用量會比第 2 版高。
- 第 2 版提供改善的串流使用者體驗,包括流暢的進度動畫、精確的磁碟空間使用量回報,以及防止第三方應用程式串流干擾。
如要升級核心中的 IncFS 驅動程式,請為核心 4.14 或核心 4.19 套用下列修補程式:
- Kernel 4.14 修補程式
- Kernel 4.19 修補程式
如要移植其他自訂核心版本,請移植其中一個修補程式集。這些變更只會影響 fs/incfs
目錄,並且會整齊地套用至現有的 v1 程式碼。
繼續使用 IncFS 驅動程式,方法與原始 (但已升級至 Android 11) 相同,可做為核心映像檔的內建部分,或做為獨立模組。請勿變更系統主機板或系統屬性設定。
使用 GKI 核心映像檔的新裝置會自動取得最新的 IncFS 驅動程式 (第 2 版),並在核心映像檔中進行設定。這不需要額外步驟。
可載入的模組設定已在 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
- 設定開發環境。
- 完成實作部分中列出的實作工作。
- 執行下列手動測試:
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

找出這些測試
- /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