Por que preciso limpar o Dalvik Cache?


46

Quando estou atualizando uma ROM personalizada, sempre há uma instrução para limpar o cache do Dalvik . Não vejo uma razão para isso ser necessariamente.

Observando o logcat enquanto o sistema está inicializando, posso ver claramente que, se um aplicativo for alterado, seu dexarquivo será invalidado e depois regenerado. Ainda assim, quando menciono isso em qualquer lugar, sou encontrado em silêncio. Como se nem mesmo alguns desenvolvedores de ROM estivessem cientes disso e só estivessem fazendo isso porque todo mundo sabe.

Então as perguntas:

  • Havia uma versão do Android em que os arquivos Dalvik não foram invalidados durante a inicialização?
  • Existe alguma vantagem em fazer isso sozinho, em vez de deixar o sistema fazer o trabalho que deveria fazer?

Uma resposta ideal incluiria referências ao código relevante, portanto, eu teria uma referência na próxima vez que isso surgir.

Respostas:


43

Para responder suas perguntas:

  • Não conheço nenhuma versão do Android em que o Dalvik não tenha sido invalidado na inicialização. Talvez a versão inicial 1.0 tenha, que eu realmente não sei, tenha passado por Eclair, Froyo, Gingerbread, Ice Cream Sandwich. Você precisa olhar para a árvore de origem e refazê-la novamente para CupCake ou Donut (1.5 e 1.6, respectivamente)

  • A razão detalhada :)

A razão pela qual o Wipe Cache deve ser usado é porque todos os aplicativos, incluindo os do sistema, têm um arquivo dex anexado a ele. Quando a ROM é inicializada pela primeira vez, o Dalvik do Android passa por cada um desses aplicativos e extrai o arquivo dex e coloque-o no cache /data/dalvik-cache, agilizando a execução do próprio aplicativo.

A maioria das ROMs tem aplicativos odex , o cache é empacotado no próprio apk como um arquivo externo.

Muitos modders de ROM personalizados teriam esses apks deodex 'd, o que significa que o arquivo dex é substituído e reembalado para facilitar o tema / modificar um apk.

Quando você atualiza uma ROM personalizada e não limpa o cache, os apks da ROM personalizada mais recente têm um arquivo dex diferente anexado a ela e, quando o Dalvik os examina, ele vê o arquivo dex em cache existente no diretório e ignora e, ao executar o aplicativo, você garante um fechamento forçado ou ANR (aplicativo não está respondendo).

Você não está perdendo dados por si só, se estiver usando ClockWorkMod Recovery e Wipe Data estiver selecionado, sim, todas as configurações relacionadas aos aplicativos serão limpas de maneira limpa - consulte /data/app.

Portanto, você pode limpar o cache, mas não limpar os dados , o que é feito de maneira eficaz, é inserido nos apks mais recentes, nos quais as configurações são mantidas. Esse era um cenário bastante comum nas noites noturnas do CyanogenMod, em que uma compilação de ROM instável / de teste pisca e as configurações mantidas com a limpeza do cache. A milhagem varia de acordo com os aplicativos baixados do mercado (as configurações teriam sido alteradas pelo aumento de versão bastante provável).

Para obter melhores resultados, seria aconselhável executar a limpeza de dados e a limpeza de cache para garantir a integridade e nenhum erro de programa no próprio aplicativo.

Sim, isso significaria que o tempo de inicialização seria mais lento, mas seu momento inicial inicial. Depois disso, seria inicializado mais rápido. Em poucas palavras, limpar explicitamente o próprio cache via CWM realmente ajuda a acelerar e garantir que nenhum resíduo da versão anterior existente possa ser absorvido (agora, neste estágio, estou percebendo sua pergunta com toda a justiça, não visto o Android não executar a invalidação do próprio cache durante a inicialização ao piscar uma nova ROM ..)

Use a fonte Luke seriamente! : D

frameworks/base/core/java/com/android/internal/os/ZygoteInit.javaé o código de inicialização para cada tempo de execução do apk. Ele interage com o código C nativo encontrado na dalvikárvore de diretórios, que contém instruções específicas do chipset para interpretar o bytecode no conjunto de instruções da CPU nativa do apk para o. O ARMv6 é praticamente uma versão hackeada do ARMv5 (que era o chipset original nas versões mais antigas do Android anteriores à Eclair), portanto você não verá o ARMv6 na fonte AOSP do google. O CyanogenMod terá esse ARMv6 em sua fonte.


Para o bem desta discussão, vamos assumir que estamos falando de um lançamento oficial do CM7. Deixe-me começar dizendo que nunca limpei meu cache do dalvik e nunca experimentei problemas que seriam resolvidos com isso. Como não é odexed, não há como haver vários arquivos (o) dex presentes e, portanto, na inicialização, o arquivo antigo é substituído por um recém-gerado. Ah, e se é realmente um grande negócio, por que os desenvolvedores não adicionam isso ao script atualizador? Vou verificar a fonte, obrigado.
RR

1
Você pode explicitamente colocar isso no script do atualizador, mas isso pode irritar outras pessoas quando piscar porque "Oh, merda, perdi minhas configurações / dados" e CM provavelmente não quis se queimar pelas perguntas / respostas da chama, como em " Por que você limpou meu cache ao exibir uma nova versão do CM? " - talvez seja responsabilidade do CM, então deu essa opção ao usuário final? E colocá-lo de volta neles para que, se eles piscarem sem esfregar, e lamentem nos fóruns a lá "Ei, meu aplicativo está falhando", o CM possa se virar e dizer "Você limpou?"
t0mm13b

Eu não quis dizer data/datamas data\dalvik-cache. Possivelmente apenas os do sistema.
RR

1
ROMs da AOSP são odexed, CM ter modificado o sistema de compilação para usar deodex .... apenas dizendo;)
t0mm13b

2
Obrigado pela resposta detalhada t0mm13b. Só para esclarecer ... Parece que a resposta simples para a pergunta postada é "Você não sabe. Ele é apagado por padrão no momento da inicialização". Corrigir?
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.