Nas versões anteriores do Android, o sistema percorria todos os arquivos pertencentes a um aplicativo específico para medir o uso do disco. Essa medição manual pode levar alguns minutos para ser computada antes de exibir os resultados aos usuários em Configurações.
Além disso, o algoritmo interno para limpar os arquivos de dados em cache apenas analisava o tempo modificado em todos os aplicativos. Isso permitiu que aplicativos maliciosos degradassem a experiência geral do usuário, definindo tempos modificados no futuro para favorecer injustamente a si mesmos em relação a outros aplicativos.
Para melhorar essas experiências, o Android 8.0 oferece o suporte a "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 qualquer aplicativo único 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 do installd
. 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 é suportado no dispositivo de bloco que está sendo medido.
Para habilitar o suporte a cotas em um dispositivo de bloco específico:
- Habilite as opções de kernel
CONFIG_QUOTA
,CONFIG_QFMT_V2
eCONFIG_QUOTACTL
. - Adicione a opção de
quota
à sua partição userdata em seu 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 habilitada ou desabilitada com segurança em dispositivos existentes. Durante a primeira inicialização após alterar a opção fstab
, o fsmgr
força uma passagem do 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 botas subsequentes não serão afetadas.
O suporte a cotas foi testado apenas em ext4 e Linux 3.18 ou superior. Se habilitar 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 exatidão das estatísticas.
Nenhum suporte de hardware especial é necessário.
Validação
Existem testes CTS em StorageHostTest
, que exercitam APIs públicas para medir o uso do disco. Espera-se que essas APIs retornem valores corretos, independentemente do suporte de cota estar ativado ou desativado.
Depuração
O aplicativo de teste aloca cuidadosamente as regiões do espaço em disco usando números primos exclusivos para o tamanho. Ao depurar esses testes, use isso para determinar a causa de quaisquer discrepâncias. Por exemplo, se um teste falhar com um delta de 11 MB, examine o método Utils.useSpace()
para ver se o blob de 11 MB foi armazenado em getExternalCacheDir()
.
Há também alguns testes internos que podem ser úteis para depuração, mas podem exigir a desativação das verificações de segurança para passar:
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