Warum muss ich den Dalvik-Cache löschen?


46

Wenn ich ein benutzerdefiniertes ROM aktualisiere, gibt es immer eine Anweisung, den Dalvik-Cache zu löschen . Ich sehe keinen Grund, warum dies notwendig ist.

Wenn ich den Logcat beobachte, während das System bootet, kann ich klar erkennen, dass eine geänderte App ihre dexDatei ungültig macht und dann neu generiert. Dennoch, wenn ich das irgendwo erwähne, bin ich auf Stille gestoßen. Als ob dies nicht einmal einigen ROM-Entwicklern bewusst wäre und sie dies nur tun, weil es alle anderen tun.

Also die Fragen:

  • Gab es eine Android-Version, in der Dalvik-Dateien beim Booten nicht ungültig wurden?
  • Gibt es einen Vorteil, wenn Sie dies selbst tun, anstatt das System die Arbeit machen zu lassen, die es tun soll?

Eine ideale Antwort würde Verweise auf den relevanten Code enthalten, sodass ich beim nächsten Aufrufen einen Verweis hätte.

Antworten:


43

Um Ihre Fragen zu beantworten:

  • Mir ist keine Android-Version bekannt, bei der der Dalvik beim Booten nicht ungültig wurde. Vielleicht hatte die ursprüngliche Version 1.0, die ich wirklich nicht kenne, Eclair, Froyo, Gingerbread, Ice Cream Sandwich durchgegangen. Sie müssen in den Quelltextbaum schauen und ihn auf CupCake oder Donut (1.5 bzw. 1.6) zurücksetzen.

  • Der detaillierte Grund :)

Der Grund, warum der Wipe-Cache verwendet werden muss, ist, dass an alle Apks, einschließlich System-Apks, eine Dex- Datei angehängt ist. Wenn das ROM zum ersten Mal gestartet wird, durchläuft der Dalvik von Android jede einzelne dieser Apks und extrahiert sie die Dex-Datei daraus und legen Sie sie in den Cache, /data/dalvik-cachewodurch die Ausführung der App selbst beschleunigt wird.

Die meisten ROMs haben Apks, die odexed sind , der Cache wird in der Apk selbst als externe Datei gebündelt.

Viele benutzerdefinierte ROM-Modder haben diese Apks deodex 'd, was bedeutet, dass die Dex-Datei ersetzt und neu gepackt wird, um das Designen / Ändern einer Apk zu vereinfachen.

Wenn Sie ein benutzerdefiniertes ROM flashen und den Cache nicht geleert haben, ist an die apk- Datei des neueren benutzerdefinierten ROM eine andere Dex- Datei angehängt. Wenn der Dalvik diese durchläuft, wird die im Verzeichnis und gespeicherte Dex-Datei angezeigt Überspringt es, wird beim Ausführen der App garantiert, dass die Anwendung geschlossen wird oder ANR (Application Not Responding).

Sie verlieren keine Daten per se, wenn Sie ClockWorkMod Recovery verwenden und Daten löschen ausgewählt haben. Ja, alle Einstellungen in Bezug auf die Apps werden sauber gelöscht /data/app.

Sie können also den Cache löschen, aber nicht die Daten löschen. Das, was effektiv gemacht wird, wird in die neueren Apks eingefügt, in denen die Einstellungen beibehalten werden. Dies war ein weit verbreitetes Szenario bei CyanogenMod-Nightlies, bei dem ein unstable / testing-ROM-Build geflasht wird und die Einstellungen beim Löschen des Caches beibehalten werden. Der Kilometerstand hängt davon ab, welche Apps vom Markt heruntergeladen wurden (die Einstellungen hätten sich mit hoher Wahrscheinlichkeit je nach Version geändert).

Für beste Ergebnisse ist es ratsam, sowohl Wipe Data als auch Wipe Cache auszuführen , um die Integrität und keine Programmfehler in der App selbst sicherzustellen.

Ja, das würde bedeuten, dass die Startzeit langsamer sein würde, aber der anfängliche einmalige Moment. Danach würde es schneller booten. Kurz gesagt, das explizite Löschen des Caches selbst über CWM beschleunigt ihn tatsächlich und stellt sicher, dass keine Rückstände aus der vorherigen Version vorhanden sind, die eingedrungen sein könnten Android hat festgestellt, dass der Cache beim Booten beim Flashen eines neuen ROMs nicht entwertet wird.)

Nehmen Sie die Quelle Luke ernst! : D

frameworks/base/core/java/com/android/internal/os/ZygoteInit.javaist der Boot-Code für jede apk-Laufzeit. Es interagiert mit dem nativen C-Code im dalvikVerzeichnisbaum, der spezifische Chipset-Anweisungen enthält, um den Bytecode im Befehlssatz von apk to native CPU zu interpretieren. ARMv6 ist so ziemlich eine gehackte Version von ARMv5 (das war der ursprüngliche Chipsatz in den älteren Android-Versionen vor Eclair), so dass Sie ARMv6 in der AOSP-Quelle von Google nicht sehen werden. CyanogenMod wird dieses ARMv6 in seiner Quelle haben.


Für diese Diskussion nehmen wir an, dass es sich um ein offizielles CM7-Release handelt. Lassen Sie mich zunächst sagen, dass ich niemals meinen Dalvik-Cache geleert habe und niemals Probleme hatte, die dadurch gelöst würden. Da es nicht odexed ist, gibt es keine Möglichkeit, dass mehrere (o) dex-Dateien vorhanden sind, und daher wird beim Booten die alte Datei durch eine neu generierte Datei ersetzt. Oh, und wenn es eine große Sache ist, warum fügen die Entwickler dies nicht zum Updater-Skript hinzu? Ich werde die Quelle überprüfen, danke.
RR

1
Sie können das zwar explizit in das Updater-Skript einfügen, aber das kann andere beim Flashen verärgern, weil "Oh Mist, ich habe meine Einstellungen / Daten verloren" und CM wahrscheinlich nicht von den Flammenfragen / -antworten wie in "verbrannt werden wollte. Warum haben Sie meinen Cache geleert, als Sie eine neue Version von CM flashen? " - Vielleicht liegt es in der Verantwortung von CM, dem Endbenutzer diese Option zu geben? Und lege es wieder auf sie, damit CM sich umdrehen und sagen kann, wenn sie blinken, ohne zu wischen, und in den Foren jammern: "Hey, meine App stürzt ab."
t0mm13b

Ich wollte nicht , data/dataaber data\dalvik-cache. Möglicherweise nur die des Systems.
RR

1
AOSP-ROMs sind auf Lager, CM hat das Build-System modifiziert, um Deodex zu verwenden .... nur zu sagen;)
t0mm13b

2
Danke für die ausführliche Antwort t0mm13b. Nur damit ich klar bin ... Es scheint, dass die einfache Antwort auf die gestellte Frage "Sie nicht. Es wird standardmäßig beim Booten gelöscht." Ist. Richtig?
GollyJer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.