Incremental File System (IncFS) é um módulo de kernel que permite que o sistema operacional Android receba APKs transmitidos pelo Android Debug Bridge (ADB). O módulo de kernel autocontido cria um novo sistema de arquivos virtual que fica em cima do sistema de arquivos Android existente e complementa as mudanças na estrutura do Android 11 e SDK para permitir que desenvolvedores de aplicativos e jogos implantem grandes APKs por meio de ADB em um dispositivo Android 11.
A mudança do kernel habilita um novo formato APK Signature Scheme v4 , suporta mudanças de estrutura Android no Android Package Manager, novos serviços de sistema e mudanças no Android Debug Bridge.
Implementação
Os fabricantes de OEMs e SoC precisam adicionar um novo driver de kernel às compilações de seus dispositivos Android. Se o driver do kernel for construído como um módulo, ele será carregado sob demanda. Se nenhum aplicativo for instalado por meio da instalação incremental ADB, o dispositivo não carregará o driver do kernel. Ao compilar como parte da imagem do kernel, o driver está sempre carregado.
O driver do kernel faz parte de um sistema maior para permitir instalações de APK em fluxo. Os parceiros não precisam usar o código IncFS exato fornecido nas implementações de exemplo. No entanto, para garantir uma experiência consistente em todos os dispositivos, os parceiros devem garantir que a implementação da API tenha um sistema de arquivos que tenha funcionalidade de leitura de arquivo e funcionalidade de leitura / gravação de diretório conforme definido aqui .
Além disso, as implementações de parceiros devem ter opções de montagem e arquivos especiais que correspondam funcionalmente à implementação de amostra IncFS.
O seguinte descreve as mudanças necessárias para implementação:
- Configure a máquina de desenvolvimento para construir o kernel.
- Almeje o kernel comum a partir do branch
common-android-mainline
.-
$ repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
-
$ repo sync
-
- Verifique se as seguintes alterações necessárias para IncFS estão no checkout da filial:
- 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
- Anexe
CONFIG_INCREMENTAL_FS=y
ouCONFIG_INCREMENTAL_FS=m
linha ao final do arquivodefconfig
. Os exemplos podem ser encontrados nos seguintes links: - Kernel de construção
- Integre o kernel na construção da imagem do dispositivo Android .
- Para o seu dispositivo Android de destino, anexe uma das seguintes linhas de propriedade do sistema específicas do fornecedor ao arquivo
device.mk
:- Caso você esteja usando
CONFIG_INCREMENTAL_FS=y
-
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=yes
- No caso de quando você estiver usando
CONFIG_INCREMENTAL_FS=m
-
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- Existem exemplos de arquivos device.mk para o emulador do Android ePixel 4 .
- Caso você esteja usando
- Apenas se estiver usando
CONFIG_INCREMENTAL_FS=m
, Adicionar Regras SE Linux .- Crie e adicione um arquivo
vold.te
à pasta device/system/sepolicy/vendor
com o seguinte conteúdo:-
vold.te
- Permitir carregar driver de sistema de arquivo incremental
-
allow vold self:capability sys_module;
-
allow vold vendor_incremental_module:file r_file_perms;
-
allow vold vendor_incremental_module:system module_load;
-
- Anexe as seguintes regras do SE Linux ao arquivo
file.te
existente encontrado em sua pasta/system/sepolicy/vendor
:- Exemplo de arquivo
file.te
- Driver incremental do sistema de arquivos
-
type vendor_incremental_module, vendor_file_type, file_type;
- Exemplo de arquivo
- Anexe as seguintes regras do SE Linux ao arquivo
file_contents
existente encontrado em sua pasta/system/sepolicy/vendor
:- Exemplo de arquivo
file_contents
-
# Incremental file system driver
- Exemplo de arquivo
- Crie e adicione um arquivo
-
/vendor/lib/modules/incrementalfs\.ko
-
u:object_r:vendor_incremental_module:s0
Implementações de referência
Existem duas maneiras de abordar essa implementação, como um módulo carregável ou como parte de uma imagem do kernel.
- Módulo carregável (dispositivo Pixel 4)
- Adicionar pré-compilados de módulo de kernel
- Adicionar e ativar a alteração da propriedade do sistema do módulo do kernel no dispositivo
- Atualizar regras do SE Linux
- Emulador Android (como parte da imagem do kernel)
- Habilitar driver de kernel IncFS
- Ativar Incremental no dispositivo
Validação e teste
Valide a implementação usando testes de unidade de recurso, CTS e GTS.
CTS
-
CtsIncrementalInstallHostTestCases
GTS
-
atest GtsIncrementalInstallTestCases
-
/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java
-
Testando os IncFs (Sistema de Arquivos Incremental)
- Configure um ambiente de desenvolvimento.
- Conclua as tarefas de implementação descritas na seção de implementação.
- Execute os seguintes testes manuais:
-
$ mmma system/incremental_delivery/incfs/tests
-
$ atest libincfs-test
-
$ atest IncrementalServiceTest
-
$ atest PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest
-
Testando IncFS com Android SDK (ADB e apksigner)
- Configure um ambiente de desenvolvimento.
- Conclua as tarefas de implementação descritas na seção de implementação.
- Atualize a compilação em um dispositivo físico ou emulador de destino.
- Gere ou obtenha um apk existente.
- Crie uma chave de assinatura de depuração .
- Assine o apk com formato de assinatura v4 na pasta de
build-tools
.-
$ ./apksigner sign --ks debug.keystore game.apk
-
- Instale o apk no dispositivo da pasta de
platform-tools
daplatform-tools
.-
$ ./adb install game.apk
-

Onde esses testes podem ser encontrados?
- / android / kernel / common / tools / testing / selftests / filesystems / incfs /
- /android/system/incremental_delivery/incfs/tests/incfs_test.cpp
- /android/frameworks/base/services/incremental/test/IncrementalServiceTest.cpp
- /android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java