O módulo do kernel do sistema de arquivos incremental (IncFS, na sigla em inglês) introduzido no Android 11 permite que o SO Android receba os APKs transmitidos por streaming pelo Android Debug Bridge (adb).
Esse módulo independente do kernel cria um novo sistema de arquivos virtual que é sobre o sistema de arquivos atual do Android. Isso complementa as mudanças e SDK para permitir que desenvolvedores de apps e jogos implantem APKs grandes por meio de o adb a um dispositivo com o Android 11 ou mais recente.
A mudança do kernel permite uma nova Formato do esquema de assinatura de APK v4 e oferece suporte a mudanças de framework do Android no gerenciador de pacotes do Android, novos serviços do sistema e mudanças no ADB.
Implementação
Para implementar a IncFS, os OEMs e os fabricantes de SoC precisam adicionar um novo kernel. aos builds de dispositivos Android.
Somente para o Android 11, se o driver do kernel é construído como um módulo que é carregado sob demanda. Se não houver nenhum app instalado por uma instalação incremental do adb, dispositivo não carrega o driver do kernel.
Quando ele for criado como parte do kernel, o driver estará 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 ativar o APK de streaming instalações. 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 dispositivos, é necessário garantir que a implementação da API tenha um sistema de arquivos que tem a funcionalidade de leitura de arquivos e de leitura e gravação de diretórios, definido na documentação Interface do espaço do usuário para FS incremental.
Além disso, as implementações precisam ter opções de ativação. e arquivos especiais que correspondam funcionalmente à implementação de amostra IncFS.
Confira a seguir as mudanças necessárias para a implementação:
- Configurar a máquina de desenvolvimento para criar o kernel.
- Segmente o kernel comum da ramificação
common-android-mainline
.repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
repo sync
- Confira se as seguintes mudanças necessárias para a IncFS estão no pagamento 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 (link em inglês)
- Anexe
CONFIG_INCREMENTAL_FS=y
ou para somente o Android 11,CONFIG_INCREMENTAL_FS=m
na parte de baixo do arquivodefconfig
. Para ver um exemplo, clique em um dos links abaixo: - Criar o kernel
- Incorpore o kernel no build de imagem do dispositivo Android.
- Para o dispositivo Android de destino, anexe uma das seguintes opções específicas de fornecedor
linhas de propriedade do sistema ao arquivo
device.mk
(opcional em dispositivos lançados com o Android 12 e versões mais recentes): PRODUCT_PROPERTY_OVERRIDES += \
ro.incremental.enable=yes
PRODUCT_PROPERTY_OVERRIDES += \
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- Confira os arquivos
device.mk
de exemplo para o Android Emulator e Pixel 4. - Somente para o Android 11: se você estiver usando
CONFIG_INCREMENTAL_FS=m
, adicione Regras do SE Linux. 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;
-
file.te
: para ver um exemplo, veja este arquivofile.te
. - Driver de sistema de arquivos incremental
type vendor_incremental_module, vendor_file_type, file_type;
-
file_contents
: por exemplo, veja 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 o arquivo com
um destes:
Ao usar CONFIG_INCREMENTAL_FS=m
(somente para o Android 11),
anexe o arquivo com uma das seguintes opções:
Criar e adicionar um arquivo vold.te
ao dispositivo
Pasta /system/sepolicy/vendor
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
encontrados na pasta /system/sepolicy/vendor
:
Anexe as seguintes regras do SE Linux ao file_contents
atual
arquivo encontrado na pasta /system/sepolicy/vendor
:
Upgrade do driver do kernel
Os dispositivos que fizerem upgrade para o Android 12 podem incluir uma versão mais antiga da IncFS motorista. 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, segmentado apenas para suporte à instalação do adb.
- O Android 12 usa o driver IncFS para instalações de streaming do Play Games, o que exige os novos recursos e otimizações do IncFS v2 para um melhor do usuário.
- A V1 oferece suporte ao streaming de jogos, mas faz isso 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, a geração de relatórios precisos sobre o uso do espaço em disco e a prevenção do streaming de apps de terceiros interferência.
Para fazer upgrade do driver IncFS no seu kernel, aplique os seguintes patches para kernel 4.14 ou kernel 4.19:
- Patch do Kernel 4.14
- Patch do Kernel 4.19
Para todas as outras versões personalizadas do kernel, transfira um dos patchsets. Eles
afetam apenas o diretório fs/incfs
e são aplicados diretamente ao
código v1 existente.
- Correção do kernel 4.14 para o driver v1
- Correção do kernel 4.19 para o drivr v1
- Correção do kernel 5.4 para o driver v1
Continue usando o driver IncFS da mesma maneira que o original, mas agora atualizou o Android 11 como uma parte integrada da imagem do kernel ou como um módulo separado. Não mudar a placa do sistema ou a propriedade do sistema configuração do Terraform.
Novos dispositivos que usam uma imagem do kernel de GKI recebem o driver IncFS mais recente (v2) configurada automaticamente como parte da imagem do kernel. Isso não exige etapas adicionais.
A configuração do 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 fornecedor a imagem congela quando o kernel original já a tinha criado como um módulo.
Implementações de referência
Essa implementação pode ser considerada como parte de uma imagem de kernel ou (para Android 11 apenas) como um módulo carregável.
Módulo carregável (dispositivo Pixel 4)- Adicionar módulos pré-criados do módulo do kernel
- Adicionar e ativar a mudança da propriedade do sistema de módulo do kernel no dispositivo
- Atualizar regras do SE Linux
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 a IncFS
- Configure um ambiente de desenvolvimento.
- Conclua as tarefas de implementação descritas na seção de implementação.
- Faça os seguintes testes manuais:
mmma system/incremental_delivery/incfs/tests
atest libincfs-test
atest IncrementalServiceTest
atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
Testar IncFS com o SDK do Android (adb e apksigner)
- Configuração um ambiente de desenvolvimento.
- Conclua as tarefas de implementação descritas na seção de implementação.
- Atualizar o build em um dispositivo físico ou emulador de destino.
- Gere ou receba 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 pelo
platform-tools
. do Compute Engine../adb install game.apk
Localizar esses testes
- /android/kernel/common/tools/testing/selftests/filesystems/incfs/
- /android/system/incremental_delivery/incfs/tests/incfs_test.cpp (link em inglês)
- /android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java