O módulo do kernel Incremental File System (IncFS) introduzido no Android 11 permite que o sistema operacional Android receba APKs transmitidos pelo Android Debug Bridge (ADB).
Este módulo de kernel independente cria um novo sistema de arquivos virtual que fica sobre o sistema de arquivos Android existente. Isso complementa as mudanças na estrutura e no SDK para permitir que desenvolvedores de aplicativos e jogos implantem APKs grandes por meio do ADB em um dispositivo com Android 11 ou superior.
A alteração do kernel permite um novo formato APK Signature Scheme v4 e oferece suporte a alterações na estrutura do Android no Android Package Manager, novos serviços do sistema e alterações no ADB.
Implementação
Para implementar o IncFS, os OEMs e os fabricantes de SoC devem adicionar um novo driver de kernel às compilações de seus dispositivos Android.
Somente para Android 11 , se o driver do kernel for criado como um módulo, ele será carregado sob demanda. Se não houver nenhum aplicativo instalado por meio de uma instalação incremental do ADB, o dispositivo não carrega o driver do kernel.
Caso contrário, quando for compilado como parte da imagem do kernel, o driver será sempre carregado. Esta implementação é válida para Android 12 e superior e pode ser usada com Android 11 . Para obter informações sobre como atualizar o driver do kernel para o Android 12, consulte Atualização do driver do kernel .
O driver do kernel faz parte de um sistema maior para permitir instalações de APK por streaming. 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 entre dispositivos, você deve garantir que a implementação da API tenha um sistema de arquivos que tenha funcionalidade de leitura de arquivo e funcionalidade de leitura e gravação de diretório, conforme definido na interface do Userspace para documentação de FS Incremental .
Além disso, as implementações devem ter opções de montagem e arquivos especiais que correspondam funcionalmente à implementação de exemplo do IncFS.
A seguir listamos as mudanças necessárias para implementação:
- Configure a máquina de desenvolvimento para construir o kernel.
- Direcione o kernel comum do branch
common-android-mainline
.repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
repo sync
- Valide se as seguintes alterações necessárias para o 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
ou apenas para Android 11 ,CONFIG_INCREMENTAL_FS=m
na parte inferior do arquivodefconfig
. Para ver um exemplo, clique em um dos links abaixo: - Construa o kernel
- Incorpore o kernel na compilaçã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 seu arquivo
device.mk
( opcional em dispositivos lançados com Android 12 e superior ): -
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=yes
-
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- Veja os arquivos
device.mk
de exemplo para o emulador do Android e o Pixel 4 . - Somente para 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 ver um exemplo, veja este arquivofile.te
) - Driver incremental do sistema de arquivos
-
type vendor_incremental_module, vendor_file_type, file_type;
- Arquivo
file_contents
- Por exemplo, consulte este 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 ao arquivo um destes:
Ao usar CONFIG_INCREMENTAL_FS=m
( somente para Android 11 ), anexe ao arquivo um destes:
Crie e adicione um arquivo vold.te
à pasta /system/sepolicy/vendor
do seu 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
existente encontrado em sua pasta /system/sepolicy/vendor
:
Anexe as seguintes regras do SE Linux ao arquivo file_contents
existente encontrado em sua pasta /system/sepolicy/vendor
:
Atualização do driver do kernel
Os dispositivos atualizados para o Android 12 podem incluir uma versão mais antiga do driver IncFS. Para esses dispositivos, o AOSP recomenda que você atualize o driver IncFS para a versão atual (neste caso, v2) pelos seguintes motivos:
- A versão lançada com Android 11 é a implementação inicial do IncFS, voltada apenas para suporte à instalação do ADB.
- O Android 12 usa o driver IncFS para instalações de streaming de jogos do Play, o que requer os novos recursos e otimizações do IncFS v2 para uma melhor experiência do usuário.
- A V1 suporta streaming de jogos, mas o faz com penalidades de desempenho e maior uso de bateria, CPU e RAM do que a v2.
- A V2 fornece UX aprimorada para streaming, com animações de progresso suaves, relatórios precisos de uso de espaço em disco e prevenção de interferência de streaming de aplicativos de terceiros.
Para atualizar o driver IncFS em seu kernel, aplique os seguintes patches para o kernel 4.14 ou kernel 4.19:
- Correção do kernel 4.14
- Correção do kernel 4.19
Para todas as outras versões personalizadas do kernel, faça a portabilidade de um dos conjuntos de patches. Eles afetam apenas o diretório fs/incfs
e se aplicam de forma limpa ao código v1 existente.
- Correção do kernel 4.14 para driver v1
- Correção do kernel 4.19 para driver v1
- Correção do kernel 5.4 para driver v1
Continue usando o driver IncFS da mesma maneira que no Android 11 original, mas agora atualizado, como parte integrada da imagem do kernel ou como um módulo separado. Não altere a placa do sistema ou a configuração das propriedades do sistema.
Novos dispositivos que usam uma imagem de kernel GKI obtêm automaticamente o driver IncFS mais recente (v2), configurado como parte da imagem do kernel. Isso não requer etapas adicionais.
A configuração do módulo carregável foi descontinuada no Android 12 e não é compatível com novos dispositivos. Só é permitido para atualizações ou congelamento de imagem do fornecedor quando o kernel original já o construiu como um módulo.
Implementações de referência
Esta implementação pode ser considerada como parte de uma imagem do kernel ou ( somente para Android 11 ) como um módulo carregável.
Módulo carregável (dispositivo Pixel 4)- Adicionar módulos pré-construídos do kernel
- Adicionar e ativar alteração de propriedade do sistema do módulo Kernel no dispositivo
- Atualizar regras do SE Linux
Validação e teste
Valide a implementação usando testes unitários de recursos, CTS e GTS.
CTS
UseCtsIncrementalInstallHostTestCases
.GTS
atest GtsIncrementalInstallTestCases
:
/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java
Teste 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
Como testar 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
build-tools
../apksigner sign --ks debug.keystore game.apk
- Instale o APK no dispositivo a partir da pasta
platform-tools
../adb install game.apk
Localize 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