O módulo do kernel do sistema de arquivos incremental (IncFS, na sigla em inglês), introduzido no Android 11, permite que o SO Android receba APKs transmitidos por streaming pela ponte de depuração do Android (ADB).
Esse módulo do kernel independente cria um novo sistema de arquivos virtual que fica acima do sistema de arquivos Android. Isso complementa as mudanças no framework e no SDK para permitir que desenvolvedores de apps e jogos implantem APKs grandes pelo ADB em um dispositivo com o Android 11 ou mais recente.
A mudança no kernel ativa um novo formato do esquema de assinatura de APK v4 e oferece suporte a mudanças no framework do Android no Gerenciador de pacotes do Android, novos serviços do sistema e mudanças no ADB.
Implementação
Para implementar o IncFS, os OEMs e fabricantes de SoC precisam adicionar um novo driver do kernel aos builds de dispositivos Android.
Somente para o Android 11, se o driver do kernel for criado como um módulo, ele será carregado sob demanda. Se não houver apps instalados por uma instalação incremental do ADB, o dispositivo não carregará o driver do kernel.
Caso contrário, quando ele é criado como parte da imagem do kernel, o driver é sempre carregado. Essa implementação é válida para o Android 12 e versões mais recentes e pode ser usada com o Android 11. Para informações sobre como fazer upgrade do driver do kernel para o Android 12, consulte Upgrade do driver do kernel.
O driver do kernel faz parte de um sistema maior para ativar instalações de APKs transmitidos. OEMs e fornecedores não precisam usar o código IncFS exato fornecido nas implementações de exemplo. No entanto, para garantir uma experiência consistente em dispositivos, é necessário que a implementação da API tenha um sistema de arquivos com a funcionalidade de leitura de arquivos e a funcionalidade de leitura e gravação de diretórios, conforme definido na documentação da Interface do espaço do usuário para o FS incremental.
Além disso, as implementações precisam ter opções de montagem e arquivos especiais que correspondam funcionalmente à implementação de exemplo do IncFS.
Confira a seguir as mudanças necessárias para a implementação:
- Configure a máquina de desenvolvimento para criar o kernel.
- Defina como destino o kernel comum da ramificação
common-android-mainline
.repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
repo sync
- Valide se as seguintes mudanças necessárias para IncFS estão no processo de finalização da compra 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
ou, para somente Android 11,CONFIG_INCREMENTAL_FS=m
na parte de baixo do arquivodefconfig
. Para conferir um exemplo, clique em um dos links abaixo: - Criar o kernel
- Incorpore o kernel ao build da imagem do dispositivo Android.
- Para o dispositivo Android de destino, anexe uma das seguintes linhas de propriedade do sistema específicas do fornecedor
ao arquivo
device.mk
(opcional em dispositivos lançados com o Android 12 e versões mais recentes): PRODUCT_PROPERTY_OVERRIDES += \
ro.incremental.enable=yes
PRODUCT_PROPERTY_OVERRIDES += \
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- Consulte os arquivos
device.mk
de exemplo para o emulador do Android e o Pixel 4. - Somente para o Android 11: se você estiver usando
CONFIG_INCREMENTAL_FS=m
, adicione 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;
-
Arquivo
file.te
: para conferir um exemplo, consulte este arquivofile.te
. - Driver do sistema de arquivos incremental
type vendor_incremental_module, vendor_file_type, file_type;
-
Arquivo
file_contents
: confira um exemplo neste arquivofile_contents
. # Incremental file system driver
/vendor/lib/modules/incrementalfs\.ko
u:object_r:vendor_incremental_module:s0
Ao usar CONFIG_INCREMENTAL_FS=y
, anexe o arquivo com
uma destas opções:
Quando você estiver usando CONFIG_INCREMENTAL_FS=m
(somente para Android 11),
anexe o arquivo com uma destas opções:
Crie e adicione um arquivo vold.te
à pasta
/system/sepolicy/vendor
do dispositivo com o seguinte conteúdo:
Permita que ele carregue o driver do sistema de arquivos incremental:
Anexe as seguintes regras do SE Linux ao arquivo file.te
encontrado na pasta /system/sepolicy/vendor
:
Anexe as seguintes regras do SE Linux ao arquivo file_contents
encontrado na pasta /system/sepolicy/vendor
:
Upgrade do driver do kernel
Os dispositivos que fazem upgrade para o Android 12 podem incluir uma versão mais antiga do driver do IncFS. Para esses dispositivos, o AOSP recomenda atualizar o driver do IncFS para a versão atual (neste caso, v2) pelos seguintes motivos:
- A versão lançada com o Android 11 é a implementação inicial do IncFS, destinada apenas ao suporte à instalação do ADB.
- O Android 12 usa o driver do IncFS para instalações de streaming de jogos do Google Play, que exige os novos recursos e otimizações do IncFS v2 para uma melhor experiência do usuário.
- A V1 oferece suporte ao streaming de jogos, mas com penalidades de desempenho e maior uso de bateria, CPU e RAM do que a v2.
- A V2 oferece uma UX melhorada para streaming, com animações de progresso suaves, relatórios precisos de uso de espaço em disco e prevenção de interferências de streaming de apps de terceiros.
Para fazer upgrade do driver IncFS no kernel, aplique os seguintes patches para o kernel 4.14 ou 4.19:
- Patch do kernel 4.14
- Patch do kernel 4.19
Para todas as outras versões personalizadas do kernel, transfira um dos conjuntos de patches. Elas
afetam apenas o diretório fs/incfs
e são aplicadas de forma limpa ao
código v1 atual.
- Correção do kernel 4.14 para o driver v1
- Correção do Kernel 4.19 para o v1 driver
- Correção do kernel 5.4 para o driver v1
Continue usando o driver IncFS da mesma maneira que o original, mas agora atualizado para o Android 11, como parte integrada da imagem do kernel ou como um módulo separado. Não mude a configuração da placa-mãe ou da propriedade do sistema.
Os novos dispositivos que usam uma imagem do kernel do GKI recebem o driver IncFS mais recente (v2) automaticamente, configurado como parte da imagem do kernel. Isso não requer etapas adicionais.
A configuração de módulo carregável foi descontinuada no Android 12 e não tem suporte para novos dispositivos. Ele só é permitido para upgrades ou para congelamento de imagem de um fornecedor quando o kernel original já foi criado como um módulo.
Implementações de referência
Essa implementação pode ser considerada como parte de uma imagem do kernel ou (somente para o Android 11) como um módulo carregável.
Módulo de carregamento (dispositivo Pixel 4)- Adicionar pré-criados de módulo do kernel
- Adicionar e ativar a mudança de propriedade do sistema do módulo do kernel no dispositivo
- Atualizar as regras do SE Linux
Validação e teste
Valide a implementação usando testes de unidade de recursos, CTS e GTS.
CTS
Use
CtsIncrementalInstallHostTestCases
.
GTS
atest GtsIncrementalInstallTestCases
:
/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java
Testar o IncFS
- 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
Testar o IncFS com o SDK do Android (ADB e apksigner)
- Configure um ambiente de desenvolvimento.
- Conclua as tarefas de implementação descritas na seção de implementação.
- Atualize o build em um dispositivo físico ou emulador de destino.
- Gerar ou receber um APK.
- Crie uma chave de assinatura de depuração.
- Assine o APK com o formato de assinatura v4 da pasta
build-tools
../apksigner sign --ks debug.keystore game.apk
- Instale o APK no dispositivo na pasta
platform-tools
../adb install game.apk

Localizar esses testes
- /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