Perché devo cancellare la cache di Dalvik?


46

Quando aggiorno una ROM personalizzata, c'è sempre un'istruzione per cancellare la cache di Dalvik . Non vedo un motivo per cui questo sia necessariamente.

Osservando il logcat durante l'avvio del sistema, vedo chiaramente che se un'app viene modificata, il suo dexfile viene invalidato e quindi rigenerato. Eppure, quando lo menziono ovunque, mi imbatto nel silenzio. Come se nemmeno alcuni sviluppatori ROM lo sapessero e lo fanno solo perché lo fanno tutti gli altri.

Quindi le domande:

  • Esisteva una versione Android in cui i file Dalvik non venivano invalidati durante l'avvio?
  • C'è qualche vantaggio nel farlo da soli, invece di lasciare che il sistema faccia il lavoro che dovrebbe fare?

Una risposta ideale dovrebbe includere riferimenti al codice pertinente, quindi vorrei avere un riferimento la prossima volta che compare.

Risposte:


43

Per rispondere alle tue domande:

  • Non sono a conoscenza di alcuna versione di Android in cui Dalvik non è stato invalidato all'avvio. Forse la versione iniziale 1.0 aveva che, davvero non lo so, sono passati attraverso Eclair, Froyo, Gingerbread, Ice Cream Sandwich. Devi guardare l'albero dei sorgenti e rimodificarlo su CupCake o Donut (rispettivamente 1.5 e 1.6)

  • Il motivo dettagliato :)

Il motivo per cui è necessario utilizzare Wipe Cache è perché tutti gli apk, compresi gli apk di sistema, hanno un file dex collegato ad esso, quando la ROM viene avviata per la prima volta, Dalvik di Android passa attraverso ognuno di quegli apk ed estrae il file dex da esso e posizionarlo nella cache /data/dalvik-cacheaccelerando così l'esecuzione dell'app stessa.

La maggior parte delle ROM ha apk che sono odex 'ed, la cache è raggruppata nell'apk stesso come file esterno.

Molti modder ROM personalizzati avrebbero quegli apk deodex 'd, il che significa che il file dex viene sostituito e riconfezionato per rendere più semplice il tema / modifica di un apk.

Quando si esegue il flashing di una ROM personalizzata e non si cancella la cache, gli apk della ROM personalizzata più recente avranno un file dex diverso allegato e quando il Dalvik li attraversa, vede il file dex memorizzato nella cache trovato nella directory e la salta, quindi quando si esegue l'app, si garantisce una chiusura forzata o ANR (applicazione che non risponde).

Non stai perdendo dati di per sé, se si utilizza ClockWorkMod Recovery e Wipe Data è selezionato, quindi sì, tutte le impostazioni relative alle app vengono cancellate in modo pulito - guardare dentro /data/app.

Quindi puoi cancellare la cache ma non cancellare i dati , ciò che viene fatto in modo efficace, viene inserito negli apk più recenti, in cui sono conservate le impostazioni. Questo era uno scenario abbastanza comune con i nightly CyanogenMod in cui è stata eseguita la flashing di una build ROM instabile / test e le impostazioni sono state mantenute con la cancellazione della cache. Il chilometraggio varierà a seconda delle app scaricate dal mercato (le impostazioni sarebbero probabilmente cambiate in base al bump della versione).

Per ottenere risultati ottimali, è consigliabile eseguire sia Wipe Data che Wipe Cache per garantire integrità e nessun errore di programma all'interno dell'app stessa.

Sì, ciò significherebbe che il tempo di avvio sarebbe più lento, ma il suo momento iniziale una tantum. Dopo questo sarebbe l'avvio più veloce. In poche parole, cancellare esplicitamente la cache stessa tramite CWM aiuta effettivamente ad accelerarla e a garantire che non vi siano residui della versione precedente in atto che potrebbero essere confusi visto Android non esegue l'invalidazione della cache stessa all'avvio durante il flashing di una nuova ROM ..)

Usa la fonte Luke sul serio! : D

frameworks/base/core/java/com/android/internal/os/ZygoteInit.javaè il codice di avvio per ogni runtime apk. Interagisce con il codice C nativo trovato nella dalvikstruttura di directory che contiene istruzioni specifiche del chipset per interpretare il bytecode all'interno dell'apk al set di istruzioni della CPU nativa. ARMv6 è praticamente una versione compromessa di ARMv5 (che era il chipset originale nelle versioni precedenti di Android prima di Eclair), quindi non vedrai ARMv6 nella fonte AOSP da google. CyanogenMod avrà quel ARMv6 nella loro fonte.


Per il bene di questa discussione, supponiamo che stiamo parlando di una versione ufficiale di CM7. Vorrei iniziare dicendo che non ho mai, mai cancellato la mia cache di Dalvik e non ho mai avuto problemi che sarebbero stati risolti facendo così. Poiché non è odexato, non è possibile che siano presenti più file (o) dex, pertanto all'avvio il vecchio file viene sostituito da uno appena generato. Oh, e se è davvero un grosso problema, perché gli sviluppatori non aggiungono questo nello script di aggiornamento? Verificherò la fonte, grazie.
RR

1
Puoi effettivamente inserirlo esplicitamente nello script di aggiornamento, ma questo può far incazzare gli altri quando lampeggiano perché "Oh merda, ho perso le mie impostazioni / dati" e CM probabilmente non voleva essere bruciato dalle domande / risposte della fiamma come in " Perché hai cancellato la mia cache durante il flashing di una nuova versione di CM? " - forse è responsabilità di CM, quindi hai dato questa opzione all'utente finale? E rimettendolo su di loro in modo che se lampeggiassero senza strofinare, e si lamentassero sui forum come "Hey la mia app si sta bloccando", CM può girarsi e dire "Hai cancellato?"
t0mm13b,

Non intendevo data/datama data\dalvik-cache. Forse solo quelli di sistema.
RR

1
Le ROM AOSP disponibili sono odexate, CM ha modificato il sistema di compilazione per usare il deodex .... solo dicendo;)
t0mm13b

2
Grazie per la risposta dettagliata t0mm13b. Solo così sono chiaro ... Sembra che la semplice risposta alla domanda pubblicata sia "Non lo fai. Viene cancellata per impostazione predefinita all'avvio." Corretta?
GollyJer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.