¿Qué tipo de optimizaciones de aplicaciones hacen las versiones más nuevas de Android en el primer reinicio?

Recibí de mi operador de telefonía, Vodafone IT, la actualización OTA oficial de Google para Android Ice Cream Sandwich 4.0.4 en mi Nexus S. Cuando se reinicia automáticamente por primera vez después de la actualización, el sistema muestra un aviso que indica que está optimizando el aplicaciones instaladas. ¿Qué tipo de optimización hace Android 4.0+ en el primer reinicio?

Respuestas (1)

Al profundizar en la clase PackageManagerService en grepCode (advertencia: este archivo de clase es enorme, su navegador puede fallar un poco al procesarlo), el mensaje de optimización se muestra en el siguiente contexto:

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


Aquí el valor de com.android.internal.R.string.android_upgrading_apkes la cadena "Aplicación de optimización". En términos simples, recorre cada aplicación en el dispositivo, actualiza el mensaje en la pantalla llamando showBootMessage()y luego llama performDexOptLI()a la aplicación. Entonces, naturalmente, la siguiente pregunta es "¿Qué hace performDexOptLI()?" Bueno, esto es lo que parece:

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

Entonces esto invoca la dexoptutilidad en todas las aplicaciones que la necesitan. Es difícil encontrar documentación simple sobre dexopt, pero hay una descripción general de alto nivel aquí . Baste decir que el compilador Just In Time (JIT) lo está utilizando para crear archivos .dex optimizados que ayudan a mejorar el rendimiento de las aplicaciones en su dispositivo y los envía a la memoria caché de la máquina virtual. La razón por la que almacena los archivos .dex en el caché es porque, de lo contrario, tendría que volver a extraerlos cada vez que desee ejecutar la aplicación (¡el .apk es solo un archivo, no es un archivo ejecutable!). Por lo tanto, tiene sentido simplemente mantenerlos en el /data/dalvik-cachedirectorio para reutilizarlos y dexoptrealizar algunas optimizaciones durante la extracción inicial mientras está en eso.


TL; DR (o resumen de no programador, supongo): está reconstruyendo el caché de Dalvik.

De hecho, ese es el mensaje que vi cuando el sistema revisó todas las aplicaciones instaladas. Gracias por la gran respuesta.