PackageManager的主要功能:
1.权限处理,包括对系统和应用定义的Permission和Permission Group信息的增加、删除、查询和检查
2.包处理,包括扫描并安装和卸载APK包,查询包的UID、GID、包名、系统默认程序等信息
3.比较两个包的Signatures信息是否相同
4.查询Activity、Provider、Receiver、Service信息
5.查询Application、Package、Resource、Shared Library、Feature信息
6.Intent匹配
体系结构
三层体系结构:应用层、中间层、服务层
应用层:安装界面
中间层:PackageManager及其子类,adb和pm命令
服务层:PackageManagerService及其相关类
应用层调用中间层PackageManager提供的API接口,一般通过以下代码:
PackageManager packagemange = getContext().getPackageManager();
获取了BinderProxy
PackageManager是一个抽象类,有两个直接子类:ApplicationPackageManager和MockPackageManager,其中MockPackageManager及其子类是测试框架的一部分,应用层对PackageManager的调用是在ApplicationPackageManager中实现
PackageManagerService是在Android启动的init2阶段启动的Java系统服务,ServerThread在run方法中直接调用PackageManagerService的main方法,并传递两个关键参数:factoryTest和onlyCore。factoryTest表示是否是工厂测试启动模式,onlyCore表示是否只加载核心应用程序。若未指定这两个值,默认都是false。创建完成后,在ServiceManager中注册。
PackageManagerService的启动流程
1.创建并初始化Settings对象,Settings对象保存包的运行信息
1)调用Setting的构造函数初始化
主要初始化5个全局文件目录
/data/system/packages.xml 记录系统中所有已安装的APK的运行信息
/data/system/packages-backup.xml packages.xml 的备份文件,安装卸载APK时备份
/data/system/packages.list 记录系统中所有已安装APK的简略信息
/data/system/packages-stopped.xml 记录强制stop的应用程序信息(已废弃)
/data/system/packages-stopped-backup.xml 记录强制stop的应用程序信息的备份文件(已废弃)
2)调用addSharedUserLPw(String name,int uid,int pkgFlags)方法添加4个默认共享用户ID
“android.uid.system”,"android.uid.phone","android.uid.log","android.uid.nfc"
Settings提供mSharedUsers、mUserIds和mOtherUserIds三个成员变量用于存储共享用户信息
mSharedUsers为HashMap<String,SharedUserSetting>
mUserIds为ArrayList<Object> UID大于或等于FIRST_AOOLICATION_UID (10000)
mOtherUserIds为ArrayList<Object> UID小于FIRST_AOOLICATION_UID(10000)
2.获取系统默认配置,用于配置dexopt操作、odex优化、asset和resource匹配等
1)获取属性系统配置:主要读取ro.build.type和debug.separate_process
2)获取系统默认显示参数
3.启动PackageHandler
4.创建data目录并初始化UserManager
初始化data信息包含初始化
mAppDataDir:/data/data
mAsecInternalPath:/data/app-asec
mUserAppDataDir:/data/user
mDrmAppPrivateInstallDir:/data/app-private
创建UserManager
1)创建/data/system/users目录和/data/system/users/0文件
2)抵用readUserList()方法解析userlist.xml文件,创建UserIndo存入UserManager.mUsers中
Android定义了三种用户:私有用户,管理员用户,guest用户,用户由用户名、用户ID和用户类型标记三部分组成
5.解析系统permission和feature信息
通过调用readPermission()方法解析设备上system/etc/permission目录下的所有XML文件,这些XML文件包括platform.xml和系统支持的各种软硬件特性feature配置文件,解析后,将其内容存入PackageManagerService和mSettings的成员变量中
6.解析packages文件
解析系统中以下4个packages文件
/data/system/packages.xml 记录系统中所有已安装的APK的运行信息
/data/system/packages-backup.xml packages.xml 的备份文件,安装卸载APK时备份
/data/system/packages-backup.xml packages.xml 的备份文件,安装卸载APK时备份
/data/system/packages-stopped.xml 记录强制stop的应用程序信息(已废弃)
/data/system/packages-stopped-backup.xml 记录强制stop的应用程序信息的备份文件(已废弃)
7.检查dexopt优化判定,对于需要DEX优化的压缩包,进行优化
8.启动FileObserver监控APK文件的目录
system/framwork
system/app
vendor/app
data/app
data/app-private
9.调用scanDirLI方法扫描并安装APK包
调用scanDirLI方法扫描并安装目录中的系统级安装包
system/framwork
system/app
system/app
vendor/app
如果mOnlyCore为false,则继续扫描并安装
data/app 中的一般APK安装包
data/app-private中的FORWARD_LOCK安装包
PackageMangerService启动过程使用的核心组件
1.java层的Installer
2.Daemon Service Installd