Đi sâu vào lớp PackageManagerService trên grepCode (cảnh báo: tệp lớp này rất lớn, trình duyệt của bạn có thể tạo ra một chút công bằng khi hiển thị nó), thông báo tối ưu hóa được hiển thị trong ngữ cảnh sau:
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);
}
}
}
}
}
Ở đây giá trị của com.android.internal.R.string.android_upgrading_apk
là chuỗi "Tối ưu hóa ứng dụng". Theo thuật ngữ của giáo dân, nó lặp qua từng ứng dụng trên thiết bị, cập nhật tin nhắn trên màn hình bằng cách gọi showBootMessage()
và sau đó gọi performDexOptLI()
trên ứng dụng. Vì vậy, một cách tự nhiên, câu hỏi tiếp theo là "Làm gì performDexOptLI()
?" Vâng, đây là những gì trông giống như:
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;
}
Vì vậy, điều này gọi dexopt
tiện ích trên tất cả các ứng dụng cần nó. Thật khó để tìm thấy bất kỳ tài liệu đơn giản nào liên quan dexopt
, nhưng có một cái nhìn tổng quan cấp cao ở đây . Có thể nói, nó đang được trình biên dịch Just In Time (JIT) sử dụng để tạo các tệp .dex được tối ưu hóa giúp cải thiện hiệu suất của các ứng dụng trên thiết bị của bạn và nó đưa chúng vào bộ đệm VM. Lý do nó lưu trữ các tệp .dex trong bộ đệm là vì nếu không, nó sẽ phải giải nén lại bất cứ khi nào bạn muốn chạy ứng dụng (.apk chỉ là một tệp lưu trữ, nó không phải là tệp thực thi!). Vì vậy, thật hợp lý khi chỉ giữ chúng trong /data/dalvik-cache
thư mục để sử dụng lại chúng và dexopt
thực hiện một số tối ưu hóa trong quá trình trích xuất ban đầu trong khi đó.
TL; DR (hoặc tóm tắt không phải lập trình viên, tôi đoán vậy): Nó đang xây dựng lại bộ đệm Dalvik.