답변:
grepCode 에서 PackageManagerService 클래스를 파고 (경고 :이 클래스 파일이 커서 브라우저가 렌더링 할 때 약간의 비트가 발생할 수 있음) 최적화 메시지가 다음 컨텍스트에 표시됩니다.
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
"최적화 응용 프로그램"문자열입니다. layman의 용어로, 장치의 각 응용 프로그램을 반복하고 호출하여 화면의 메시지를 업데이트 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
,하지만 거기에 여기에 높은 수준의 개요가 . JIT (Just In Time) 컴파일러가 장치의 앱 성능을 개선하는 데 도움이되는 최적화 된 .dex 파일을 생성하여 VM 캐시로 출력하는 것으로 충분합니다. 캐시에 .dex 파일을 저장하는 이유는 그렇지 않으면 앱을 실행할 때마다 파일을 다시 추출 해야하기 때문입니다 (.apk는 아카이브 일 뿐이며 실행 파일이 아닙니다!). 따라서 /data/dalvik-cache
다시 사용하기 위해 디렉토리에 보관하고 dexopt
초기 추출 중에 일부 최적화를 수행하는 것이 좋습니다.
TL; DR (또는 프로그래머가 아닌 요약), Dalvik 캐시를 다시 작성하고 있습니다.