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 autônomo cria um novo sistema de arquivos virtual que fica sobre o sistema de arquivos existente do Android. 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 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, OEMs e fabricantes de SoC devem adicionar um novo driver de kernel às compilações de 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 aplicativos instalados por meio de uma instalação incremental do ADB, o dispositivo não carregará o driver do kernel.

Caso contrário, quando ele for construído como parte da imagem do kernel, o driver será 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 em streaming. OEMs e fornecedores não precisam usar o código IncFS exato fornecido nas implementações de amostra. 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/gravação de diretório, conforme definido na interface Userspace para a documentação do FS incremental .

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

A seguir listamos as mudanças necessárias para a implementação:

  1. Configure a máquina de desenvolvimento para construir o kernel.
  2. 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
  3. Valide se as seguintes alterações necessárias para IncFS estão no check-out 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. Construir o kernel
  6. Incorpore o kernel na construção da imagem do dispositivo Android .
  7. 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 em dispositivos iniciados com Android 12 e superior ):
  8. Ao usar CONFIG_INCREMENTAL_FS=y , anexe o arquivo com um destes:

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

    Ao usar CONFIG_INCREMENTAL_FS=m ( somente para Android 11 ), anexe o arquivo com 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. Apenas 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 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 obter um exemplo, consulte este arquivo file.te .)
    • Driver do sistema de arquivos incremental
    • 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 - Para obter um 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) por estes motivos:

  • A versão lançada com o 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 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 do 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, por favor, portar 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 uma 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 do kernel GKI obtêm o driver IncFS mais recente (v2) automaticamente, configurado como parte da imagem do 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 atualizações ou para 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 ( 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

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 emulador ou dispositivo físico 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 da 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