28 votos

¿Qué tipo de optimización de aplicaciones hace Ice Cream Sandwich en el primer reinicio?

Recibí de mi teléfono operador, Vodafone IT, la actualización oficial de Google OTA para Android Ice Cream Sandwich 4.0.4 en mi Nexus S. Al reiniciar automáticamente por primera vez después de la actualización, el sistema mostró un aviso indicando que estaba optimizando las aplicaciones instaladas. ¿Qué tipo de optimización hace Android 4.0+ en el primer reinicio?

40voto

David Negron Puntos 971

Escarbando en el PackageManagerClase de servicio en grepCode (advertencia: este archivo de clase es enorme, su navegador puede resoplar un poco al renderizarlo), 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_apk es la cadena "Optimización de la aplicación". En términos sencillos, hace un bucle a través de cada aplicación del dispositivo, actualiza el mensaje en la pantalla llamando a showBootMessage() y luego llama performDexOptLI() en la solicitud. Así que, naturalmente, la siguiente pregunta es "¿Qué es lo que performDexOptLI() hacer?" 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;
}

Así que esto invoca a la dexopt utilidad en todas las aplicaciones que la necesitan. Es difícil encontrar cualquier documentación simple sobre dexopt pero hay una visión general de alto nivel aquí . Basta con decir que está siendo utilizado por el compilador Just In Time (JIT) para crear archivos .dex optimizados que ayudan a mejorar el rendimiento de las aplicaciones de tu dispositivo y los envía a la caché de la VM. La razón por la que almacena los archivos .dex en la caché es porque de otra manera tendría que re-extraer en cualquier momento que quieras ejecutar la aplicación (el .apk es sólo un archivo, no es un archivo ejecutable!). Por lo tanto, tiene sentido mantenerlos en el /data/dalvik-cache para reutilizarlos, y dexopt realiza algunas optimizaciones durante la extracción inicial mientras está en ello.


TL;DR (o un resumen no programado, supongo): Está reconstruyendo el caché de Dalvik.

0 votos

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

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X