Optimalisasi aplikasi seperti apa yang dilakukan versi Android yang lebih baru saat reboot pertama?

28

Saya menerima dari operator telepon saya, Vodafone IT, pembaruan Google OTA resmi untuk Android Ice Cream Sandwich 4.0.4 pada Nexus S. Ketika saya melakukan booting ulang secara otomatis untuk pertama kalinya setelah pembaruan, sistem menampilkan pemberitahuan yang menyatakan bahwa ia mengoptimalkan aplikasi yang diinstal. Optimalisasi apa yang dilakukan Android 4.0+ saat reboot pertama?

Paolo Amoroso
sumber

Jawaban:

40

Menggali ke dalam kelas PackageManagerService di grepCode (peringatan: file kelas ini sangat besar, peramban Anda mungkin sedikit lebih baik saat merendernya), pesan pengoptimalan ditampilkan dalam konteks berikut:

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


Di sini nilai com.android.internal.R.string.android_upgrading_apkadalah string "Mengoptimalkan aplikasi". Dalam istilah awam, itu loop melalui setiap aplikasi pada perangkat, memperbarui pesan di layar dengan memanggil showBootMessage()dan kemudian memanggil performDexOptLI()aplikasi. Jadi secara alami, pertanyaan selanjutnya adalah "Apa fungsinya performDexOptLI()?" Nah begini tampilannya:

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

Jadi ini memanggil dexoptutilitas pada semua aplikasi yang membutuhkannya. Sulit untuk menemukan dokumentasi sederhana mengenai hal ini dexopt, tetapi ada ikhtisar tingkat tinggi di sini . Cukuplah untuk mengatakan, itu sedang digunakan oleh kompiler Just In Time (JIT) untuk membuat file .dex yang dioptimalkan yang membantu meningkatkan kinerja aplikasi pada perangkat Anda dan menghasilkannya ke dalam cache VM. Alasan ia menyimpan file .dex di cache adalah karena jika tidak, ia harus mengekstraknya kembali setiap kali Anda ingin menjalankan aplikasi (.apk hanyalah arsip, itu bukan file yang dapat dieksekusi!). Dengan demikian, masuk akal untuk menyimpannya di /data/dalvik-cachedirektori untuk menggunakannya kembali, dan dexoptmelakukan beberapa optimasi selama ekstraksi awal saat itu.


TL; DR (atau ringkasan non-programmer, saya kira): Ini membangun kembali cache Dalvik.

eldarerathis
sumber
Itu memang pesan yang saya lihat ketika sistem melewati semua aplikasi yang diinstal. Terima kasih atas jawabannya.
Paolo Amoroso