Sistema de arquivos incremental

O módulo do kernel do sistema de arquivos incremental (IncFS) introduzido no Android 11 permite que o SO Android receba APKs transmitidos pelo Android Debug Bridge (ADB).

Esse módulo de kernel independente cria um novo sistema de arquivos virtual que fica acima do sistema de arquivos Android atual. Isso complementa as mudanças no framework e no SDK para permitir que desenvolvedores de apps e jogos implantem APKs grandes usando o ADB em um dispositivo com Android 11 ou mais recente.

A mudança no kernel permite um novo formato de esquema de assinatura de APK v4 e oferece suporte a mudanças no framework 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 de 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 vai 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 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 permitir instalações de APKs transmitidos. Os 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, verifique se a implementação da API tem um sistema de arquivos com funcionalidade de leitura de arquivos e leitura/gravação de diretórios, conforme definido na documentação da Interface do espaço do usuário para FS incremental.

Além disso, as implementações precisam ter opções de montagem e arquivos especiais que correspondam funcionalmente à implementação de amostra do IncFS.

Confira abaixo as mudanças necessárias para a implementação:

  1. Configure a máquina de desenvolvimento para criar o kernel.
  2. Segmentar o kernel comum da ramificação common-android-mainline.
    repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
    repo sync
  3. Valide se as seguintes mudanças necessárias para o IncFS estão no checkout da ramificação:
  4. Adicione CONFIG_INCREMENTAL_FS=y ou, somente para o Android 11, CONFIG_INCREMENTAL_FS=m na parte de baixo do arquivo defconfig. Para ver um exemplo, clique em um dos links abaixo:
  5. Criar o kernel
  6. Incorpore o kernel ao build da imagem do dispositivo Android.
  7. Para o dispositivo Android de destino, adicione 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):
  8. Ao usar CONFIG_INCREMENTAL_FS=y, adicione o arquivo com uma destas opções:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=yes

    Ao usar CONFIG_INCREMENTAL_FS=m (somente para o Android 11), adicione o arquivo com um destes:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. Consulte os arquivos de exemplo device.mk para o emulador do Android e o Pixel 4.
  10. Somente para o Android 11: se você estiver usando CONFIG_INCREMENTAL_FS=m, adicione regras do SE Linux.
  11. Crie e adicione um arquivo vold.te à pasta /system/sepolicy/vendor do dispositivo com o seguinte conteúdo:

    • vold.te

    Permita que ele carregue o driver incremental do sistema de arquivos:

    • 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 encontrado na pasta /system/sepolicy/vendor:

    • file.te - Para ver um exemplo, consulte este arquivo file.te.
    • Driver incremental do sistema de arquivos
    • type vendor_incremental_module, vendor_file_type, file_type;

    Anexe as seguintes regras do SE Linux ao arquivo file_contents encontrado na pasta /system/sepolicy/vendor:

    • Arquivo file_contents: para ver um exemplo, consulte este arquivo file_contents.
    • # Incremental file system driver
    • /vendor/lib/modules/incrementalfs\.ko
    • u:object_r:vendor_incremental_module:s0

Upgrade do driver do kernel

Os dispositivos que fazem upgrade 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 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 à compatibilidade com a instalação do ADB.
  • O Android 12 usa o driver IncFS para instalações de streaming de jogos do Play, o que exige os novos recursos e otimizações do IncFS v2 para uma melhor experiência do usuário.
  • A v1 é compatível com 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 aprimorada 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:

Para todas as outras versões de kernel personalizadas, faça a portabilidade de um dos patchsets. Elas afetam apenas o diretório fs/incfs e são aplicadas corretamente ao código v1 atual.

Continue usando o driver IncFS da mesma forma que no Android 11 original, mas agora atualizado, seja 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 de kernel GKI recebem automaticamente o driver IncFS mais recente (v2), configurado como parte da imagem do kernel. Isso não exige etapas adicionais.

A configuração de módulo carregável foi descontinuada no Android 12 e não é compatível com novos dispositivos. Isso só é permitido para upgrades ou para um congelamento de imagem do fornecedor quando o kernel original já o tinha 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 Android 11) como um módulo carregável.

Módulo carregável (dispositivo Pixel 4) Android Emulator (como parte da imagem do kernel)

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

  1. Configure um ambiente de desenvolvimento.
  2. Conclua as tarefas de implementação descritas na seção correspondente.
  3. 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 correspondente.
  • Atualize o build em um dispositivo físico ou emulador de destino.
  • Gere ou obtenha um APK.
  • Crie uma chave de assinatura de depuração.
  • Assine o APK com o formato de assinatura v4 da pastabuild-tools.
    ./apksigner sign --ks debug.keystore game.apk
  • Instale o APK no dispositivo na pasta platform-tools.
    ./adb install game.apk
Exemplo de instalação
Figura 1: exemplo de instalação

Localizar esses testes