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

28

Recibí de mi proveedor de telefonía, 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 el aplicaciones instaladas ¿Qué tipo de optimización hace Android 4.0+ en el primer reinicio?

Paolo Amoroso
fuente

Respuestas:

40

Excavando en la clase PackageManagerService en grepCode (advertencia: este archivo de clase es enorme, su navegador puede funcionar un poco cuando lo procesa), 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 "Optimización de la aplicació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, así es como se ve:

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 esto dexopt, pero aquí hay una descripción general de alto nivel . Baste decir que lo está utilizando el compilador Just In Time (JIT) para crear archivos .dex optimizados que ayudan a mejorar el rendimiento de las aplicaciones en su dispositivo y las envía al caché de VM. La razón por la que almacena los archivos .dex en la memoria caché es porque, de lo contrario, tendría que volver a extraerlos cada vez que desee ejecutar la aplicación (¡.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 dexoptrealiza algunas optimizaciones durante la extracción inicial mientras está en ello.


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

eldarerathis
fuente
Ese es el mensaje que vi cuando el sistema pasó por todas las aplicaciones instaladas. Gracias por la gran respuesta.
Paolo Amoroso