#1 楼
深入研究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
的值是字符串“ Optimizing application”。用外行的话讲,它循环遍历设备上的每个应用程序,通过调用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)编译器正在使用它来创建优化的.dex文件,这些文件有助于提高设备上应用程序的性能,并将其输出到VM缓存中。它将.dex文件存储在缓存中的原因是,否则它将在您希望运行应用程序的任何时间重新提取它们(.apk只是一个存档,不是可执行文件!)。因此,将它们保留在/data/dalvik-cache
目录中以重用它们是很有意义的,并且dexopt
在初始提取过程中对其进行了一些优化。TL; DR(或非我猜是程序员摘要):它正在重建Dalvik缓存。
评论
这确实是我在系统通过所有已安装的应用程序时看到的消息。感谢您的出色回答。
– Paolo Amoroso
2012-4-10 17:58