Sistema de Arquivos Incrementais

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:

  1. Configure a máquina de desenvolvimento para construir o kernel.
  2. Direcione o kernel comum do branch common-android-mainline .
    repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
    repo sync
  3. Valide se as seguintes alterações necessárias para o IncFS estão no checkout da filial:
  4. Anexe CONFIG_INCREMENTAL_FS=y ou apenas para Android 11 , CONFIG_INCREMENTAL_FS=m na parte inferior do arquivo defconfig . Para ver um exemplo, clique em um dos links abaixo:
  5. Construa o kernel
  6. Incorpore o kernel na compilação da imagem do dispositivo Android .
  7. 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 ):
  8. Ao usar CONFIG_INCREMENTAL_FS=y , anexe ao arquivo um destes:

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

    Ao usar CONFIG_INCREMENTAL_FS=m ( somente para Android 11 ), anexe ao arquivo um destes:

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

    • vold.te

    Permita que ele carregue o driver do sistema de arquivos 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 :

    • arquivo file.te - Para ver um exemplo, veja 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 existente encontrado em sua pasta /system/sepolicy/vendor :

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

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:

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.

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) Android Emulator (como parte da imagem do kernel)

Validação e teste

Valide a implementação usando testes unitários 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

Teste o IncFS

  1. Configure um ambiente de desenvolvimento.
  2. Conclua as tarefas de implementação descritas na seção de implementação.
  3. 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
Exemplo de instalação
Figura 1 : Exemplo de instalação

Localize esses testes