PackageManagerService 源码分析 (3) ApplicationInfo 相关

本文深入探讨了Android系统中ApplicationInfo的生成与使用过程,包括PackageParser如何解析AndroidManifest.xml中的application节点,以及PackageManagerService如何管理和提供这些信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值