增量文件系统

通过 Android 11 中引入的增量文件系统 (IncFS) 内核模块,Android 操作系统能够通过 Android 调试桥 (adb) 来接收流式传输 APK。

这个独立的内核模块会创建一个基于现有 Android 文件系统的新虚拟文件系统。这是对框架中以及 SDK 中的变更的补充,使应用和游戏开发者能够通过 adb 将大型 APK 部署到搭载 Android 11 或更高版本的设备。

通过内核变更采用了新的 APK 签名方案 v4 格式,为 Android 软件包管理器中的 Android 框架变更、新的系统服务以及 adb 的变更提供支持。

实现

如需实现 IncFS,OEM 和 SoC 制造商必须在其 Android 设备 build 中添加新的内核驱动程序。

仅适用于 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=yCONFIG_INCREMENTAL_FS=m(仅适用于 Android 11)。如需查看示例,请点击以下某个链接:
  5. 构建内核
  6. 将内核嵌入到 Android 设备映像 build 中。
  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 规则
  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 改进了流式传输的用户体验,可提供流畅的进度动画、精确的磁盘可用空间使用情况报告,并防止第三方应用流式传输造成的干扰。

如需升级内核中的 IncFS 驱动程序,请对内核 4.14 或内核 4.19 应用以下补丁:

对于所有其他自定义内核版本,请移植上述其中一个补丁集。它们只会影响 fs/incfs 目录,并且会完全应用到现有的 v1 代码。

将 IncFS 驱动程序作为内核映像的内置部分或作为单独的模块继续使用,使用方式与原始版本但现在已升级的 Android 11 相同。请勿更改系统主板或系统属性配置。

使用 GKI 内核映像的新设备会自动获取最新的 (v2) InFS 驱动程序,并将其配置为内核映像的一部分。这不需要额外的步骤。

可加载模块配置已在 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

  1. 设置开发环境。
  2. 完成“实现”部分所概述的实现任务。
  3. 运行以下手动测试:
    mmma system/incremental_delivery/incfs/tests
    atest libincfs-test
    atest IncrementalServiceTest
    atest PackageManagerShellCommandTest
    PackageManagerShellCommandIncrementalTest

如何使用 Android SDK(adb 和 apksigner)测试 IncFS

  • 设置开发环境。
  • 完成“实现”部分所概述的实现任务。
  • 在目标实体设备或模拟器上刷写相应 build。
  • 生成或获取现有的 APK。
  • 创建调试签名密钥
  • 使用 build-tools 文件夹中的 v4 签名格式对 APK 进行签名
    ./apksigner sign --ks debug.keystore game.apk
  • platform-tools 文件夹中安装设备上的 APK。
    ./adb install game.apk
安装示例
图 1:安装示例

找到这些测试