Package Manager 的机制与实现

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-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
        vendor/app
    如果mOnlyCore为false,则继续扫描并安装
         data/app 中的一般APK安装包
        data/app-private中的FORWARD_LOCK安装包
  
PackageMangerService启动过程使用的核心组件  
1.java层的Installer
2.Daemon Service Installd
   



















猜你喜欢

转载自blog.csdn.net/u013531215/article/details/45843533