เมื่อขุดเข้าไปในคลาส PackageManagerService บน grepCode (คำเตือน: ไฟล์คลาสนี้มีขนาดใหญ่เบราว์เซอร์ของคุณอาจจะใช้งานได้ดีเมื่อทำการแสดงผล) ข้อความการปรับให้เหมาะสมจะแสดงในบริบทต่อไปนี้:
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
แต่มีภาพรวมระดับสูงที่นี่ พอจะพูดได้ว่ามันถูกใช้โดยคอมไพเลอร์ Just In Time (JIT) เพื่อสร้างไฟล์. dex ที่ได้รับการปรับปรุงซึ่งช่วยปรับปรุงประสิทธิภาพของแอพในอุปกรณ์ของคุณและมันจะส่งออกไปยังแคช VM เหตุผลที่เก็บไฟล์. dex ไว้ในแคชเป็นเพราะมิฉะนั้นจะต้องแตกไฟล์ใหม่ทุกครั้งที่คุณต้องการเรียกใช้แอพ (.apk เป็นเพียงไฟล์เก็บถาวรเท่านั้นไม่ใช่ไฟล์ที่เรียกใช้งานได้!) ดังนั้นจึงเหมาะสมที่จะเก็บไว้ใน/data/dalvik-cache
ไดเรกทอรีเพื่อนำมาใช้ใหม่และdexopt
ดำเนินการปรับให้เหมาะสมบางอย่างในระหว่างการแยกเริ่มต้นในขณะที่อยู่ในนั้น
TL; DR (หรือบทสรุปที่ไม่ใช่โปรแกรมเมอร์, ฉันเดา): กำลังสร้างแคช Dalvik ขึ้นใหม่