(5)扫描APK文件并解析
private void scanDirLI(File dir, int flags, int scanMode, long currentTime) {
String[] files = dir.list();
if (files == null) {
Log.d(TAG, "No files in app dir " + dir);
return;
}
if (DEBUG_PACKAGE_SCANNING) {
Log.d(TAG, "Scanning app dir " + dir);
}
int i;
for (i = 0; i < files.length; i++) {
File file = new File(dir, files[i]);
// 放过非apk文件
if (!isPackageFilename(files[i])) {
// Ignore entries which are not apks
continue;
}
//此方解析出Package实例
PackageParser.Package pkg = scanPackageLI(file, flags
| PackageParser.PARSE_MUST_BE_APK, scanMode, currentTime,
null);
// Dont mess around with apps in system partition.
if (pkg == null
&& (flags & PackageParser.PARSE_IS_SYSTEM) == 0
&& mLastScanError == PackageManager.INSTALL_FAILED_INVALID_APK) {
// Delete the apk
Slog.w(TAG, "Cleaning up failed install of " + file);
file.delete();
}
}
}
实际上,在解析APK的过程中涉及到多各层次的方法的调用,并最终生成了Package实例:

有一点需要注意,我省略了一个重载的方法parsePackage(),经过以上的流程,一个APK的AndroidManifest文件就被成功解析成PackageParser.Package实例了。
从以上源码分析可以看出来,当安装一个apk的时候首先要做的就是将其AndroidMainfest.xml文件进行解析。解析其中注册的所有权限和组件等。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-38912-4.html
一吨水1000L