Yeni Android sürümleri ilk yeniden başlatmada ne tür uygulama optimizasyonları yapar?


28

OTA Google’ın resmi şirketi olan Nexus S’imdeki Android Ice Cream Sandwich 4.0.4’e güncelleyen telefon operatörüm Vodafone IT’den aldım. yüklü uygulamalar Android 4.0+ ilk yeniden başlatmada ne tür bir optimizasyon yapıyor?

Yanıtlar:


40

İçine Kazı grepCode üzerinde PackageManagerService sınıfının : optimize ileti aşağıdaki bağlamda gösterilir (uyarı onu işlerken bu sınıf dosyası çok büyük, tarayıcınız adil biraz çuf olabilir):

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


Burada değeri com.android.internal.R.string.android_upgrading_apk"Uygulama optimize" dizesidir. Layman'ın terimiyle, cihazdaki her bir uygulama boyunca dolaşır, ekrandaki çağrıyı arayarak mesajı günceller showBootMessage()ve ardından performDexOptLI()uygulamayı çağırır . Doğal olarak, bir sonraki soru "Ne yapar performDexOptLI()?" Peki işte şöyle görünüyor:

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

Bu nedenle dexopt, ihtiyacı olan tüm uygulamalarda yardımcı programı çağırır . Hakkında basit bir belge bulmak zor dexopt, ancak burada üst düzey bir genel bakış var . Bunu söylemek yeterlidir, Just In Time (JIT) derleyicisi tarafından, cihazınızdaki uygulamaların performansını artırmaya yardımcı olan optimize edilmiş .dex dosyaları oluşturmak için kullanılır ve bunları VM önbelleğine gönderir. .Dex dosyalarını önbellekte saklamasının nedeni, aksi halde uygulamayı çalıştırmak istediğiniz zaman onları yeniden çıkarmak zorunda kalmasıdır (.apk sadece bir arşivdir, çalıştırılabilir bir dosya değildir!). Bu nedenle, onları /data/dalvik-cacheyeniden kullanmak üzere dizinde tutmaları dexoptve ilk çıkartma sırasında bazı optimizasyonlar yapmaları mantıklıdır .


TL; DR (veya programcı olmayan özeti, sanırım): Dalvik önbelleğini yeniden oluşturuyor.


Bu gerçekten, sistem yüklü tüm uygulamaları gözden geçirdiğinde gördüğüm mesajdı. Harika cevap için teşekkürler.
Paolo Amoroso
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.