【笔记】 PackageManagerService 分析

1.Settings  类:Settings主要用于保存一些信息,实际上它确实是用于管理Android系统运行过程中的一些设置信息
  1.成员变量:
    1.settings 类初始化时 生成/创建/data/system/ 下的packages.xml , packages-backup.xml 和 packages.list 文件; 
       
    2.packages.xml和package-backup.xml为一组,用于描述系统所安装的Package信息,其中packages-backup.xml是package.xml的备份。
    
      pkg的权限状态,codePath,nativeLibraryPath , privateFlags 等;
    
    3.packages-list用于描述系统中存在的所有非系统自带的apk信息及UID大于10000的apk。当这些APK有变化时,PackageManagerService就会更新该文件
    
      【packages-list:com.android.bluetooth 1002 0 /data/user_de/0/com.android.bluetooth platform:targetSdkVersion=27 3002,1023,1015,3003,3001,3007,1002,3010,3011,3005,1016】
    
    4.在Android中每一个应用都有一个UID,两个相同的UID的应用可以运行在同一个进程中,所以为了让两个应用运行在一个进程中,往往会在AndroidManifest.xml文件中设置shareUserId这个属性
       =====》 1.Android中每一个应用都有一个UID,uid 相同的2个app可以运行在同一进程
               2.运行在同一进程了才可以进行数据交换
               
               
    5. ShareUserSetting :【记录某一特定UID下所有PKG共有的权限 和 其中单个PKG 不同于其他PKG 自己特有的权限】
       1.Settings 的一个成员变量, 是已一个特定的UID为key值创建。
       2.ShareUserSetting的成员变量packageSettings 代表单个PKG,记录此PKG的**独有**的权限;
       3.ShareUserSetting的成员变量permissionState就记录了 同一个UID下所有PKG 的共有权限;
       4.不同的UID 对应不同的ShareUserSetting成员变量
    
    6.SystemConfig :
      PKMS创建的SystemConfig负责解析系统的xml配置文件,最终将形成数据结构,在此之后,PKMS取出并保存了SystemConfig中的权限和feature等信息.

     PKMS 构造函数中调用mGlobalGids = systemConfig.getGlobalGids(); 获取系统UID 合集,实际上systemConfig.getGlobalGids()函数是读取”etc/permissions/platform.xml“ 来得到uid 合集的。
    7.PackageManageService启动的时候会将PackageHandler和ServiceThread进行绑定。ServiceThread其实就是PackageManageService的工作线程,PackageManageService的各种操作都将利用PackageHandler分发到HandlerThread去处理
               
               
               
               
    ==============================================PKMS 流程======================================================================
    PackageManager在启动时会
    1.扫描所有的APK文件和jar包,然后把他们的信息读取出来,保存在内存中(SystemConfig类中),这样系统运行时就能迅速找到各种应用和组件的信息。
    2.扫描中如果遇到没有优化过的文件还要进行优化工作(dex格式转换成oat格式(Android 5.0以前是odex)),优化后的文件放在/data/dalvik-cache/下面
     
    初始化:
    1.new Settings()对象
      增加共享用户组信息;
    
    2.获取默认的设备展示信息
      // 创建一个Installer对象,该对象和Native进程installd交互
    
    3.创建PackageHandler()对象
      处理安装或者卸载命令
      
    4.创建UserManagerService 对象
      解析user相关信息
      
    5.readPermission()
      解析/system/etc/permissions/目录下的文件
      
    6.调用Settins.readLPW()
       解析/data/system/ 下的4个文件
      
    7.进行dex优化操作
    
    8.调用ScanDirLI扫描文件

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