Welche Art von App-Optimierungen führen neuere Android-Versionen beim ersten Neustart durch?

Ich habe von meinem Telefonanbieter, Vodafone IT, das offizielle OTA-Update von Google auf Android Ice Cream Sandwich 4.0.4 auf meinem Nexus S erhalten. Beim ersten automatischen Neustart nach dem Update zeigte das System einen Hinweis an, dass es das optimiert installierte Anwendungen. Welche Art von Optimierung führt Android 4.0+ beim ersten Neustart durch?

Antworten (1)

Wenn Sie sich die PackageManagerService-Klasse auf grepCode ansehen (Warnung: Diese Klassendatei ist riesig, Ihr Browser kann beim Rendern ein bisschen tuckern), wird die Optimierungsmeldung 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 von com.android.internal.R.string.android_upgrading_apkdie Zeichenfolge „Optimizing application“. Laienhaft ausgedrückt durchläuft es jede Anwendung auf dem Gerät, aktualisiert die Nachricht auf dem Bildschirm durch Aufrufen showBootMessage()und ruft dann performDexOptLI()die Anwendung auf. Die nächste Frage ist natürlich "Was macht performDexOptLI()?" 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 dexoptDienstprogramm in allen Anwendungen aufgerufen, die es benötigen. Es ist schwierig, eine einfache Dokumentation zu zu finden dexopt, aber hier gibt es einen allgemeinen Überblick . Es genügt zu sagen, dass es vom Just In Time (JIT)-Compiler verwendet wird, um optimierte .dex-Dateien zu erstellen, die dazu beitragen, die Leistung der Apps auf Ihrem Gerät zu verbessern, und es in den VM-Cache ausgibt. Der Grund, warum die .dex-Dateien im Cache gespeichert werden, ist, dass sie sie sonst jedes Mal neu extrahieren müssten, wenn Sie die App ausführen möchten (die .apk-Datei ist nur ein Archiv, keine ausführbare Datei!). Daher ist es sinnvoll, sie einfach im /data/dalvik-cacheVerzeichnis zu belassen, um sie wiederzuverwenden, und dexoptwährend der ersten Extraktion einige Optimierungen durchzuführen, während sie dabei ist.


TL;DR (oder Zusammenfassung für Nicht-Programmierer, denke ich): Es baut den Dalvik-Cache neu auf.

Das ist in der Tat die Nachricht, die ich gesehen habe, als das System alle installierten Apps durchgegangen ist. Danke für die tolle Antwort.