Quel type d'optimisation d'application les nouvelles versions d'Android font-elles au premier redémarrage?


28

J'ai reçu de mon opérateur de téléphonie, Vodafone IT, la mise à jour officielle OTA de Google pour Android Ice Cream Sandwich 4.0.4 sur mon Nexus S. Lors du redémarrage automatique pour la première fois après la mise à jour, le système a affiché un avis indiquant qu'il optimisait la applications installées. Quel type d'optimisation fait Android 4.0+ au premier redémarrage?

Réponses:


40

En creusant dans la classe PackageManagerService sur grepCode (avertissement: ce fichier de classe est énorme, votre navigateur peut bouger un peu lors du rendu), le message d'optimisation s'affiche dans le contexte suivant:

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


Ici, la valeur de com.android.internal.R.string.android_upgrading_apkest la chaîne "Optimizing application". En termes simples, il parcourt chaque application sur l'appareil, met à jour le message à l'écran en appelant showBootMessage(), puis appelle performDexOptLI()l'application. Alors naturellement, la question suivante est "Que fait performDexOptLI()-on?" Eh bien voici à quoi ça ressemble:

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

Cela appelle donc l' dexoptutilitaire sur toutes les applications qui en ont besoin. Il est difficile de trouver une documentation simple concernant dexopt, mais il y a un aperçu de haut niveau ici . Il suffit de dire qu'il est utilisé par le compilateur Just In Time (JIT) pour créer des fichiers .dex optimisés qui aident à améliorer les performances des applications sur votre appareil et les exporte dans le cache de la machine virtuelle. La raison pour laquelle il stocke les fichiers .dex dans le cache est parce qu'autrement, il devrait les ré-extraire chaque fois que vous souhaitez exécuter l'application (le .apk est juste une archive, ce n'est pas un fichier exécutable!). Ainsi, il est logique de simplement les conserver dans le /data/dalvik-cacherépertoire pour les réutiliser et d' dexopteffectuer certaines optimisations lors de l'extraction initiale pendant qu'il y est.


TL; DR (ou résumé non programmeur, je suppose): Il reconstruit le cache Dalvik.


C'est en effet le message que j'ai vu lorsque le système a parcouru toutes les applications installées. Merci pour la bonne réponse.
Paolo Amoroso
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.