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()
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' dexopt
utilitaire 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-cache
répertoire pour les réutiliser et d' dexopt
effectuer 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.