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

Paolo Amoroso

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


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


 eldarerathis

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_apk est 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() sur l’application. Alors naturellement, la question suivante est « Que fait performDexOptLI() ? » 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’utilitaire 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 . 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 n’est qu’une archive, ce n’est pas un fichier exécutable!). Ainsi, il est logique de simplement les conserver dans le /data/dalvik-cache pour les réutiliser, et dexopt effectue 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.

Paolo Amoroso

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.

 

#au, d’Android, d’application, d’optimisation, font-elles, Les, nouvelles, premier, Quel, redémarrage?, type, versions

 

wiki

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *