Wenn Sie in die PackageManagerService-Klasse von grepCode eintauchen (Warnung: Diese Klassendatei ist riesig, Ihr Browser kann beim Rendern ein wenig tuckern), wird die Optimierungsnachricht im folgenden Kontext angezeigt:
public void performBootDexOpt() {
ArrayList<PackageParser.Package> pkgs = null;
synchronized (mPackages) {
if (mDeferredDexOpt.size() > 0) {
pkgs = new ArrayList<PackageParser.Package>(mDeferredDexOpt);
mDeferredDexOpt.clear();
}
}
if (pkgs != null) {
for (int i=0; i<pkgs.size(); i++) {
if (!isFirstBoot()) {
try {
ActivityManagerNative.getDefault().showBootMessage(
mContext.getResources().getString(
com.android.internal.R.string.android_upgrading_apk,
i+1, pkgs.size()), true);
} catch (RemoteException e) {
}
}
PackageParser.Package p = pkgs.get(i);
synchronized (mInstallLock) {
if (!p.mDidDexOpt) {
performDexOptLI(p, false, false);
}
}
}
}
}
Hier ist der Wert com.android.internal.R.string.android_upgrading_apk
der Zeichenfolge "Optimizing application". In Laienbegriffen durchläuft es jede Anwendung auf dem Gerät, aktualisiert die Meldung auf dem Bildschirm durch Aufrufen showBootMessage()
und ruft dann performDexOptLI()
die Anwendung auf. Die nächste Frage lautet also natürlich "Was macht performDexOptLI()
das?" Nun, so sieht das aus:
private int performDexOptLI(PackageParser.Package pkg, boolean forceDex, boolean defer) {
boolean performed = false;
if ((pkg.applicationInfo.flags&ApplicationInfo.FLAG_HAS_CODE) != 0) {
String path = pkg.mScanPath;
int ret = 0;
try {
if (forceDex || dalvik.system.DexFile.isDexOptNeeded(path)) {
if (!forceDex && defer) {
mDeferredDexOpt.add(pkg);
return DEX_OPT_DEFERRED;
} else {
Log.i(TAG, "Running dexopt on: " + pkg.applicationInfo.packageName);
ret = mInstaller.dexopt(path, pkg.applicationInfo.uid,
!isForwardLocked(pkg));
pkg.mDidDexOpt = true;
performed = true;
}
}
} catch (...) {
//I've trimmed out a bunch of exception handling here, it basically just writes to
//the log and sets the return value
}
}
return performed ? DEX_OPT_PERFORMED : DEX_OPT_SKIPPED;
}
Dadurch wird das dexopt
Dienstprogramm für alle Anwendungen aufgerufen, die es benötigen. Es ist schwierig, eine einfache Dokumentation zu finden dexopt
, aber hier finden Sie eine allgemeine Übersicht . Es genügt zu sagen, dass es vom JIT-Compiler (Just In Time) verwendet wird, um optimierte DEX-Dateien zu erstellen, mit deren Hilfe die Leistung der Apps auf Ihrem Gerät verbessert und im VM-Cache ausgegeben wird. Der Grund, warum die .dex-Dateien im Cache gespeichert werden, ist, dass sie sonst erneut extrahiert werden müssten jedes Mal wenn Sie die App ausführen möchten (die .apk ist nur ein Archiv, sie ist keine ausführbare Datei!). Daher ist es sinnvoll, sie nur im /data/dalvik-cache
Verzeichnis zu belassen, um sie wiederzuverwenden, und dexopt
einige Optimierungen während der anfänglichen Extrahierung vorzunehmen, während sie ausgeführt werden.
TL; DR (oder Nicht-Programmierer-Zusammenfassung, denke ich): Es baut den Dalvik-Cache neu auf.