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_apk
adalah 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 dexopt
utilitas 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-cache
direktori untuk menggunakannya kembali, dan dexopt
melakukan beberapa optimasi selama ekstraksi awal saat itu.
TL; DR (atau ringkasan non-programmer, saya kira): Ini membangun kembali cache Dalvik.