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

28

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

Paolo Amoroso
quelle

Antworten:

40

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_apkder 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 dexoptDienstprogramm 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-cacheVerzeichnis zu belassen, um sie wiederzuverwenden, und dexopteinige 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.

eldarerathis
quelle
Das ist in der Tat die Nachricht, die ich sah, als das System alle installierten Apps durchlief. Danke für die tolle Antwort.
Paolo Amoroso