step1: PackageManagerService.java/main()
call PackageManagerService m = new PackageManagerService(context, factoryTest)进行安装apk,在构造函数中进行安装。
step2: PackageManagerService.java/PackageManagerService()
call scanDirLI(xxxxx, PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR,
scanMode | SCAN_NO_DEX, 0)来扫描以下五个目录的APK文件:/system/framework, /system/app, /vendor/app, /data/app, /data/app-private.
step3: PackageManagerService.java/scanDirLI()
call String[] files = dir.list()取出目录下的所有文件 call if (!isPackageFilename(files[i]))判断是否是apk结尾的文件
call PackageParser.Package pkg = scanPackageLI(file,
flags|PackageParser.PARSE_MUST_BE_APK, scanMode, currentTime)进入到scanPackageLI(file)中进一步处理.
step4: PackageManagerService.java/scanPackageLI(file)
call final PackageParser.Package pkg = pp.parsePackage(scanFile,
scanPath, mMetrics, parseFlags)进入parsePackage(file)中处理
step5: PackageParser.java/parsePackage(file)
call parseParckage(res)进一步处理解释tag
step6: PackageParser.java/parsePackage(res)
call String pkgName = parsePackageName(parser, attrs, flags, outError)解析出apk的manifest中的包名
进入一个while循环解析该apk的Androidmanifest.xml文件的tag.解析完层层返回,返回到scanPackageLI(file)中
step7: PackageManagerService.java/scanPackageLI(res)
call return scanPackageLI(pkg, parseFlags, scanMode | SCAN_UPDATE_SIGNATURE, currentTime)对解析出来的内容保存起来。