PackageManagerService 源码分析 (3) ApplicationInfo 相关

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

猜你喜欢

转载自blog.csdn.net/pirionFordring/article/details/83577321