Какую оптимизацию приложений выполняют новые версии Android при первой перезагрузке?

28

Я получил от своего оператора мобильной связи Vodafone IT официальное обновление OTA Google для Android Ice Cream Sandwich 4.0.4 на моем Nexus S. При первой автоматической перезагрузке после обновления система отображала уведомление о том, что она оптимизирует установленные приложения. Какую оптимизацию выполняет Android 4.0+ при первой перезагрузке?

Паоло Аморосо
источник

Ответы:

40

При копании в класс PackageManagerService на grepCode (предупреждение: этот файл класса огромен, ваш браузер может потерять немного при его рендеринге), оптимизирующее сообщение отображается в следующем контексте:

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


Здесь значением com.android.internal.R.string.android_upgrading_apkявляется строка «Оптимизирующее приложение». С точки зрения непрофессионала, он просматривает каждое приложение на устройстве, обновляет сообщение на экране, вызывая его, showBootMessage()а затем вызывает performDexOptLI()приложение. Естественно, следующий вопрос «Что делает performDexOptLI()?» Ну вот как это выглядит:

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

Так что это вызывает dexoptутилиту во всех приложениях, которые в ней нуждаются. Трудно найти какую-либо простую документацию dexopt, но здесь есть общий обзор . Достаточно сказать, что он используется компилятором Just In Time (JIT) для создания оптимизированных файлов .dex, которые помогают повысить производительность приложений на вашем устройстве, и выводит их в кэш виртуальной машины. Причина, по которой он хранит файлы .dex в кеше, заключается в том, что в противном случае ему придется заново извлекать их в любое время, когда вы захотите запустить приложение (.apk - это просто архив, а не исполняемый файл!). Таким образом, имеет смысл просто хранить их в /data/dalvik-cacheкаталоге, чтобы повторно использовать их, и dexoptвыполняет некоторые оптимизации во время первоначального извлечения, пока оно у него есть.


TL; DR (или не программирование, я думаю): это перестройка кеша Dalvik.

eldarerathis
источник
Это действительно сообщение, которое я увидел, когда система проверила все установленные приложения. Спасибо за отличный ответ.
Паоло Аморосо