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 实现的文件系统具有文件读取功能和目录读写功能,如 Incremental 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 模拟器的示例
device.mk
文件和 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
文件。 # 增量文件系统驱动程序
/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,具有流畅的进度动画、精确的磁盘空间使用情况报告以及防止第三方应用流式传输干扰。
要升级内核中的 IncFS 驱动程序,请为内核 4.14 或内核 4.19 应用以下补丁
对于所有其他自定义内核版本,请移植其中一个补丁集。 它们仅影响 fs/incfs
目录,并能干净地应用于现有的 v1 代码。
继续以与最初但现在已升级的 Android 11 相同的方式使用 IncFS 驱动程序,无论是作为内核映像的内置部分,还是作为单独的模块。 不要更改系统板或系统属性配置。
使用 GKI 内核映像的新设备会自动获得最新的 (v2) IncFS 驱动程序,该驱动程序配置为内核映像的一部分。 这不需要额外的步骤。
可加载模块配置在 Android 12 中已弃用,并且不支持新设备。 它仅允许用于升级,或者当原始内核已经将其构建为模块时用于供应商映像冻结。
参考实现
此实现可以被视为内核映像的一部分,或者(仅对于 Android 11)作为可加载模块。
可加载模块(Pixel 4 设备) Android 模拟器(作为内核映像的一部分)验证和测试
使用功能单元测试、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