Che tipo di ottimizzazioni delle app eseguono le versioni più recenti di Android al primo riavvio?


28

Ho ricevuto dal mio operatore telefonico, Vodafone IT, l'aggiornamento OTA ufficiale di Google ad Android Ice Cream Sandwich 4.0.4 sul mio Nexus S. Al riavvio automatico per la prima volta dopo l'aggiornamento, il sistema ha visualizzato un avviso in cui si affermava che stava ottimizzando il app installate. Che tipo di ottimizzazione fa Android 4.0+ al primo riavvio?

Risposte:


40

Scavando nella classe PackageManagerService su grepCode (avviso: questo file di classe è enorme, il tuo browser potrebbe bloccarsi un po 'quando lo esegue il rendering), il messaggio di ottimizzazione viene visualizzato nel seguente contesto:

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);
                }
            }
        }
    }
}


Qui il valore di com.android.internal.R.string.android_upgrading_apkè la stringa "Ottimizzazione dell'applicazione". In parole povere, scorre attraverso ogni applicazione sul dispositivo, aggiorna il messaggio sullo schermo chiamando showBootMessage()e quindi chiama performDexOptLI()l'applicazione. Quindi, naturalmente, la prossima domanda è "Cosa fa performDexOptLI()?" Bene, ecco come appare:

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;
}

Quindi questo invoca l' dexoptutilità su tutte le applicazioni che ne hanno bisogno. È difficile trovare una semplice documentazione relativa dexopt, ma qui è disponibile una panoramica di alto livello . Basti dire che viene utilizzato dal compilatore Just In Time (JIT) per creare file .dex ottimizzati che aiutano a migliorare le prestazioni delle app sul dispositivo e le invia nella cache della VM. Il motivo per cui memorizza i file .dex nella cache è perché altrimenti dovrebbe riestrarli ogni volta che si desidera eseguire l'app (.apk è solo un archivio, non è un file eseguibile!). Pertanto, ha senso tenerli nella /data/dalvik-cachedirectory per riutilizzarli ed dexopteseguire alcune ottimizzazioni durante l'estrazione iniziale mentre è presente.


TL; DR (o riepilogo non programmatore, immagino): sta ricostruendo la cache di Dalvik.


Questo è davvero il messaggio che ho visto quando il sistema ha attraversato tutte le app installate. Grazie per la magnifica risposta.
Paolo Amoroso,
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.