O módulo de 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 em cima do sistema de arquivos Android existente. Isso complementa as alterações na estrutura e no SDK para permitir que desenvolvedores de aplicativos e jogos implantem grandes APKs por meio do ADB em um dispositivo com Android 11 ou superior.
A alteração do kernel habilita 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 fabricantes de OEMs e SoC devem adicionar um novo driver de kernel às compilações de seus dispositivos Android.
Apenas 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 carregará o driver do kernel.
Caso contrário, quando ele é compilado como parte da imagem do kernel, o driver é sempre carregado. Essa 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 transmitidas. 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 todos os dispositivos, você deve garantir que a implementação da API tenha um sistema de arquivos com funcionalidade de leitura de arquivo e funcionalidade de leitura de diretório, conforme definido na interface Userspace para a documentação do Incremental FS .
Além disso, as implementações devem ter opções de montagem e arquivos especiais que correspondam funcionalmente à implementação de amostra do IncFS.
A seguir lista as mudanças necessárias para implementação:
- Configure a máquina de desenvolvimento para construir o kernel.
- Direcione 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 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: - Construir o núcleo
- Incorpore o kernel na compilação da imagem do dispositivo Android .
- Para seu dispositivo Android de destino, anexe uma das seguintes linhas de propriedade do sistema específicas do fornecedor ao seu arquivo
device.mk
( opcional no 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 . - Apenas 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 um exemplo veja este arquivofile.te
.) - Driver do sistema de arquivos incremental
-
type vendor_incremental_module, vendor_file_type, file_type;
- arquivo
file_contents
- Para obter um exemplo, consulte este arquivofile_contents
. -
# Incremental file system driver
-
/vendor/lib/modules/incrementalfs\.ko
-
u:object_r:vendor_incremental_module:s0
Quando você estiver usando CONFIG_INCREMENTAL_FS=y
, anexe o arquivo com um destes:
Ao usar CONFIG_INCREMENTAL_FS=m
( somente para Android 11 ), anexe o arquivo com 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) por estes motivos:
- A versão lançada com o Android 11 é a implementação inicial do IncFS, direcionada apenas para suporte à instalação do ADB.
- O Android 12 usa o driver IncFS para streaming de instalações 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.
- O V2 fornece UX aprimorado 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 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, por favor, porte um dos conjuntos de patches. Eles afetam apenas o diretório fs/incfs
e se aplicam perfeitamente ao código v1 existente.
- Correção do kernel 4.14 para o driver v1
- Correção do kernel 4.19 para o driver v1
- Correção do kernel 5.4 para o driver v1
Continue usando o driver IncFS da mesma maneira que para o 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 usando uma imagem de kernel GKI obtêm o driver IncFS mais recente (v2) automaticamente, configurado como parte da imagem de kernel. Isso não requer etapas adicionais.
A configuração do módulo carregável foi preterida no Android 12 e não é compatível com novos dispositivos. Só é permitido para as atualizações, ou para um congelamento de imagem do fornecedor quando o kernel original já o tinha construído como um módulo.
Implementações de referência
Essa implementação pode ser considerada como parte de uma imagem do kernel ou ( apenas para Android 11 ) como um módulo carregável.
Módulo carregável (dispositivo Pixel 4)- Adicionar módulos de kernel pré-construídos
- Adicionar e habilitar a mudança de propriedade do sistema do módulo do kernel no dispositivo
- Atualizar regras do SE Linux
Validação e testes
Valide a implementação usando Feature Unit Tests, 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 o 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 o formato de assinatura v4 na pasta
build-tools
../apksigner sign --ks debug.keystore game.apk
- Instale o APK no dispositivo da pasta
platform-tools
../adb install game.apk
Localize estes 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