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.