Які оптимізації додатків роблять новіші версії Android під час першого перезавантаження?


28

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


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


Це справді повідомлення, яке я бачив, коли система переглядала всі встановлені програми. Дякую за чудову відповідь.
Паоло Аморосо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.