PackageParser.Package.ApplicationInfo 类
Application 是PackageParser.Package 的一个成员
一 . 调用情况:
1.PackageParser.parseBaseApk() :
1. 解析指定路径apk的AndroidManifest.xml文件,遇到tag为”application”时,会调用parseBaseApplication()方法来完成接下来的节点解析工作;
2 .parseBaseApplication()最后的解析结果都会存放在传入其函数的参数owner中,它是PackageParser.Package类型。也就是所有ApplicationInfo信息的来源均是从这个传出的Package得来;
2 . PackageManagerService.scanPackageLI():
PKMS.scanPackageLI ()
---> PackageParser.parsePackage ()
--->PackageParser.parseBaseApk()
... ...
--->PKSM.scanPackageLI (PackageParser.Package…)
---> PKMS.scanPackageDirtyLI() {
...
mPackages.put(pkg.applicationInfo.packageName, pkg);
... }
pkg信息录入PKMS.mPackages 中
3 . PackageManagerService.installPackageLI()
外部调用PackageManager的方法installPackage()时,走到PackageManagerService内部会走到的方法,最后还是走到PackageManagerService.scanPackageLI(),这样新安装的apk对应的Package也会被添加到PackageManagerService的mPackages中去。
PackageManagerService.installPackageLI()
---> PKMS.installNewPackageLI()
---> PKMS.scanPackageLI(PackageParser.Package…)
二 .传出Application 的方法
所有应用的ApplicationInfo均是存放在PackageManagerService的mPackages成员中,所以要取得某个应用的ApplicationInfo必须通过mPackages.get(packageName);先取到该packageName的Package. 这样就可以在PackageManagerService中查找有哪些地方这样调用了。
1.PKMS.getApplicationInfo()
public ApplicationInfo getApplicationInfo(String packageName, int flags, int userId)
{
synchronized (mPackages) {
PackageParser.Package p = mPackages.get(packageName);
......
return PackageParser.generateApplicationInfo(p, flags, ps.readUserState(userId), userId);
......
if ("android".equals(packageName) || "system".equals(packageName)) {
return mAndroidApplication;
}
}
}
取mPackages中Key为传入的包名对应的Value, 然后用PackageParser.generateApplicationInfo()方法来生成ApplicationInfo并返回。
generateApplicationInfo()方法中主要有一句: ApplicationInfo ai = new ApplicationInfo(p.applicationInfo); 传给外部的是一份拷贝,而不是直接传递给外部p.applicationInfo, 当然也有特殊情况.
2.PKMS.getInstalledApplications(int flags, int userId)
取出mPackages中所有的Package,然后通过PackageParser.generateApplicationInfo()传出每个Package的applicationInfo成员;
3.PKMS.getPersistentApplications(int flags)
返回具有常驻属性的ApplicationInfo,如果p的applicationInfo.flags有ApplicationInfo.FLAG_PERSISTENT属性,就把它加入到结果列表中,当然对于每一个符合条件的Package, 也是通过PackageParser.generateApplicationInfo()分别传出其applicationInfo成员
三. new Application
最后
以上就是灵巧西装最近收集整理的关于PackageManagerService 源码分析 (3) ApplicationInfo 相关PackageParser.Package.ApplicationInfo 类的全部内容,更多相关PackageManagerService内容请搜索靠谱客的其他文章。
发表评论 取消回复