28 votes

Quel type d'optimisation des applications les versions Android les plus récentes effectuent-elles au premier redémarrage ?

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

40voto

David Negron Points 971

Creuser dans le Classe PackageManagerService sur grepCode (avertissement : ce fichier de classe est énorme, votre navigateur risque d'être un peu bousculé lors de son rendu), le message d'optimisation est affiché 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_apk est la chaîne "Optimisation de l'application". En termes simples, il boucle à travers chaque application sur l'appareil, met à jour le message sur l'écran en appelant showBootMessage() et appelle ensuite performDexOptLI() sur l'application. Donc, naturellement, la question suivante est "Que fait le performDexOptLI() faire ?" Et bien voilà à 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;
}

Donc cela invoque le dexopt 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 . En bref, il est utilisé par le compilateur Just In Time (JIT) pour créer des fichiers .dex optimisés qui contribuent à améliorer les performances des applications sur votre appareil et il les sort dans le cache de la VM. La raison pour laquelle il stocke les fichiers .dex dans le cache est qu'autrement il devrait réextraire à chaque fois que vous souhaitez lancer l'application (le fichier .apk est juste une archive, ce n'est pas un fichier exécutable !) Ainsi, il est logique de les conserver dans le répertoire /data/dalvik-cache pour les réutiliser, et dexopt effectue quelques optimisations lors de l'extraction initiale pendant qu'il y est.


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

0 votes

C'est en effet le message que j'ai vu lorsque le système a passé en revue toutes les applications installées. Merci pour cette excellente réponse.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X