PackageManagerService——掌管APP的安装、卸载和查询

1、vold.decrypt系统属性可以指定android设备是否加密,如果加密(即该属性值为1或者“trigger_restart_min_framework”),onlyCore设置为true,那么PackageManagerService将只会扫描系统库;

2、SystemServer判断系统是否初次启动,是调用了PKMS的isFirstBoot()函数,由于PKMS启动后会生成一些文件(data/system目录),所以isFirstBoot函数就是通过读取这些文件(Settings的readLPw函数)判断是否首次启动的;

3、SystemServer会调用PKMS的performBootDexOpt()函数,实现dex优化(但当通过系统属性ro.build.type得知此系统为eng版本时,将不对package做dex优化);

4、PKMS的构造函数需要比较长的执行时间,这也是Android系统启动费时的主要原因之一。PKMS会扫描系统几个目标文件夹的APK,并建立各种便于管理和查询的数据结构,完成APK包信息从物理文件到内存数据的加载过程。工作的过程无非就是扫描解析,比较简单,但这些用来存储解析结果的数据结构,以及它们之间的相互关系非常复杂;

5、PKMS的成员变量mSdkVersion,在定义时便取系统属性ro.build.version.sdk的值进行初始化,如果没有定义,APK将无法知道自己运行在Android的哪个版本上;

6、据说UserManager对象,按照google的设想,将实现每个user安装自己的应用,使得手机支持多个user,为企业版android打基础;

7、/system/etc/permissions目录存放了许多xml文件,都是系统权限相关的配置文件,如platform.xml建立了权限名与gid的映射关系;

8、/system/frameworks/framework-res.apk,定义了系统常用的资源,还有几个重要的Activity,如长按Power键后弹出的选择框;

9、PKMS除了负责系统中apk的安装、升级、卸载之外,对外提供统一的查询信息是其主要职责,包括查询系统中匹配某Intent的Activity、BroadcastReceiver或service;

10、PKMS的构造函数中传递了一个Installer类型的参数,java层的Installer类通过socket和后台服务installd交互,托付installd完成一些dex优化等操作,这里是一个通过socket实现跨进程交互的很好范例。

    原文作者:Android-大雄
    原文地址: https://blog.csdn.net/qiandaxiong/article/details/72172536
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞