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

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

27 голосов | спросил Paolo Amoroso 10 PMpTue, 10 Apr 2012 19:20:51 +040020Tuesday 2012, 19:20:51

1 ответ


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, которые помогают повысить производительность приложений на вашем устройстве и выводит их в кэш VM. Причина, по которой он хранит файлы .dex в кеше, заключается в том, что в противном случае он должен был бы повторно извлекать их в любое время, когда вы хотите запустить приложение (.apk - это просто архив, это не запускаемый файл!). Таким образом, имеет смысл просто сохранить их в каталоге /data/dalvik-cache, чтобы повторно использовать их, а dexopt выполняет некоторые оптимизации во время первоначального извлечения, пока он находится на нем.


TL; DR (или, как я полагаю, резюме не-программиста): этовосстановление кэша Дальвика.

ответил eldarerathis 10 PMpTue, 10 Apr 2012 20:57:46 +040057Tuesday 2012, 20:57:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132