Que tipo de otimizações de aplicativo as versões mais recentes do Android fazem na primeira reinicialização?

28

Recebi da minha operadora de telefonia, Vodafone IT, a atualização oficial do OTA do Google para o Android Ice Cream Sandwich 4.0.4 no meu Nexus S. Ao reiniciar automaticamente pela primeira vez após a atualização, o sistema exibia um aviso informando que estava otimizando o aplicativos instalados. Que tipo de otimização o Android 4.0+ faz na primeira reinicialização?

Paolo Amoroso
fonte

Respostas:

40

Cavando a classe PackageManagerService em grepCode (aviso: esse arquivo de classe é enorme, seu navegador pode ser um pouco lento ao renderizá-lo), a mensagem de otimização é exibida no seguinte 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);
                }
            }
        }
    }
}


Aqui o valor de com.android.internal.R.string.android_upgrading_apké a sequência "Otimizando o aplicativo". Nos termos do leigo, ele percorre cada aplicativo no dispositivo, atualiza a mensagem na tela chamando showBootMessage()e depois chama performDexOptLI()o aplicativo. Então, naturalmente, a próxima pergunta é "O que performDexOptLI()faz?" Bem, aqui está o 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;
}

Portanto, isso chama o dexoptutilitário em todos os aplicativos que precisam dele. É difícil encontrar qualquer documentação simples dexopt, mas há uma visão geral de alto nível aqui . Basta dizer que está sendo usado pelo compilador Just In Time (JIT) para criar arquivos .dex otimizados que ajudam a melhorar o desempenho dos aplicativos em seu dispositivo e os envia para o cache da VM. A razão pela qual armazena os arquivos .dex no cache é porque, caso contrário, teria que extraí- los novamente a qualquer momento em que você deseja executar o aplicativo (o .apk é apenas um arquivo morto, não é um arquivo executável!). Portanto, faz sentido apenas mantê-los no /data/dalvik-cachediretório para reutilizá-los, e dexoptrealiza algumas otimizações durante a extração inicial enquanto estiver nele.


TL; DR (ou resumo de não programador, eu acho): Está reconstruindo o cache do Dalvik.

eldarerathis
fonte
Essa é realmente a mensagem que vi quando o sistema passou por todos os aplicativos instalados. Obrigado pela ótima resposta.
Paolo Amoroso