नए Android संस्करण पहले रीबूट में किस तरह के ऐप ऑप्टिमाइज़ेशन करते हैं?


28

मैंने अपने फोन वाहक, वोडाफोन आईटी, आधिकारिक ओटीए Google अपडेट को अपने एंड्रॉइड एस पर एंड्रॉइड आइसक्रीम सैंडविच 4.0.4 से प्राप्त किया। जब अपडेट के बाद पहली बार स्वचालित रूप से रिबूट हो रहा है, तो सिस्टम ने एक नोटिस प्रदर्शित किया जिसमें कहा गया था कि यह अनुकूलन कर रहा था। इंस्टॉल किए गए ऐप्स। एंड्रॉइड 4.0+ पहले रीबूट पर किस तरह का अनुकूलन करता है?

जवाबों:


40

GrepCode पर PackageManagerService वर्ग में खुदाई करना (चेतावनी: यह वर्ग फ़ाइल बहुत बड़ी है, आपका ब्राउज़र इसे रेंडर करते समय काफी हद तक चुग सकता है), अनुकूलन संदेश निम्न संदर्भ में प्रदर्शित होता है:

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, लेकिन यहाँ एक उच्च-स्तरीय अवलोकन है । यह कहने के लिए पर्याप्त है, इसका उपयोग अनुकूलित .dex फ़ाइलों को बनाने के लिए जस्ट इन टाइम (JIT) कंपाइलर द्वारा किया जा रहा है जो आपके डिवाइस पर ऐप्स के प्रदर्शन को बेहतर बनाने में मदद करता है और यह उन्हें VM कैश में आउटपुट करता है। कारण यह कैश में .dex फ़ाइलें संग्रहीत करता है, क्योंकि अन्यथा यह करना होगा फिर से निकालने के लिए उन्हें किसी भी समय आप अनुप्रयोग चलाने के लिए चाहते हैं (.apk अभी-अभी संग्रह है, यह एक निष्पादन योग्य फ़ाइल नहीं है!)। इस प्रकार, यह उन्हें फिर /data/dalvik-cacheसे उपयोग करने के लिए उन्हें निर्देशिका में रखने के लिए समझ में आता है , और dexoptप्रारंभिक निष्कर्षण के दौरान कुछ अनुकूलन करता है , जबकि यह उस पर है।


टीएल; डीआर (या गैर-प्रोग्रामर सारांश, मुझे लगता है): यह डालविक कैश का पुनर्निर्माण कर रहा है।


यह वास्तव में वह संदेश है जो मैंने देखा था जब सिस्टम सभी इंस्टॉल किए गए एप्लिकेशन से गुजरा था। महान जवाब के लिए धन्यवाद।
पाओलो अमोरोसो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.