Em versões anteriores do Android, o sistema percorria todos os arquivos de um app específico para medir o uso do disco. Essa medição manual pode levar alguns minutos para ser calculada antes de mostrar os resultados aos usuários nas Configurações.
Além disso, o algoritmo interno para limpar arquivos de dados em cache só verificava o tempo de modificação em todos os apps. Isso permitiu que apps maliciosos degradassem a experiência geral do usuário definindo tempos modificados no futuro para se favorecer injustamente em relação a outros apps.
Para melhorar essas experiências, o Android 8.0 oferece a possibilidade de aproveitar o suporte de "cota" do sistema de arquivos ext4 para retornar estatísticas de uso do disco quase instantaneamente. Esse recurso de cota também melhora a estabilidade do sistema, impedindo que um único app use mais de 90% do espaço em disco ou 50% dos inodes.
Implementação
O recurso de cota faz parte da implementação padrão de installd
.
O installd
usa automaticamente o recurso de cota quando ativado em um
sistema de arquivos específico. O sistema retoma o cálculo manual de forma automática e transparente quando o recurso de cota não está ativado ou não tem suporte no dispositivo de bloco que está sendo medido.
Para ativar o suporte a cota em um dispositivo de bloco específico:
- Ative as opções
CONFIG_QUOTA
,CONFIG_QFMT_V2
eCONFIG_QUOTACTL
do kernel. - Adicione a opção
quota
à partição de userdata no arquivo fstab:/dev/block/platform/soc/624000.ufshc/by-name/userdata /data ext4 noatime,nosuid,nodev,barrier=1,noauto_da_alloc latemount,wait,check,formattable,fileencryption=ice,quota
A opção fstab
pode ser ativada ou desativada com segurança em dispositivos
existentes. Durante a primeira inicialização após a alteração da opção fstab
,
o fsmgr
força uma passagem fsck
para atualizar todas as estruturas de dados
de cota, o que pode fazer com que a primeira inicialização demore um pouco mais. As inicializações
posteriores não serão afetadas.
O suporte a cota foi testado apenas no ext4 e no Linux 3.18 ou mais recente. Se a ativação em outros sistemas de arquivos ou em versões mais antigas do kernel, os fabricantes de dispositivos são responsáveis por testar e verificar a correção das estatísticas.
Não é necessário suporte a hardware especial.
Validação
Há testes CTS em StorageHostTest
, que usam APIs públicas
para medir o uso do disco. Espera-se que essas APIs retornem valores corretos,
independente de o suporte à cota estar ativado ou desativado.
Depuração
O app de teste aloca cuidadosamente regiões de espaço em disco usando números primos
exclusivos para o tamanho. Ao depurar esses testes, use isso para determinar a causa de qualquer
discrepância. Por exemplo, se um teste falhar com um delta de 11 MB, examine o
método Utils.useSpace()
para conferir se o blob de 11 MB foi armazenado em
getExternalCacheDir()
.
Há também alguns testes internos que podem ser úteis para depuração, mas pode ser necessário desativar as verificações de segurança para que sejam aprovados:
runtest -x frameworks/base/services/tests/servicestests/ \ src/com/android/server/pm/InstallerTest.java
adb shell /data/nativetest64/installd_utils_test/installd_utils_test
adb shell /data/nativetest64/installd_cache_test/installd_cache_test
adb shell /data/nativetest64/installd_service_test/installd_service_test