Android PackageManager基础知识

时间:2021-12-20 10:19:05

一、PackageManagerService启动过程

SystemServer首先启动,创建一个ServerThread线程来启动所有Android核心服务,其中PackageManagerService.main方法启动了PackageManagerService。

main方法中就是实例化PackageManagerService对象,并注册到ServiceManager中。

PackageManagerService的构造过程设计到几个重要的操作:
    1、创建Settings对象,向其中添加SharedUser,在android清单文件中定义的SharedUserId,例如android.uid.system就是在这里定义的。Settings的构造方法中还创建了一系列的目录和文件,例如/data/system目录。
        android中UID范围:
        SYSTEM_UID = 1000;
        非系统应用10000~19999;
        隔离沙箱进程99000~99999;
    2、创建应用安装器Installer。
    3、启动消息处理线程——一个名为PackageManager的HandlerThread。
    4、创建用户管理对象UserManager。
    5、通过readPermissions()方法读取并解析/etc/permissions下的xml文件,包括指定UID拥有的权限,feature标签下的硬件信息和系统库的配置信息。
    6、读取安装包信息,包括以下重要文件:
        /data/system/packages.xml 系统中安装的Package信息。
        /data/system/packages-stopped.xml 记录系统中强制停止的Package信息。
        /data/system/packages.list 保存系统中所有非系统自带的APK信息。
    7、监控和扫描系统包安装目录:
        /system/framework 系统库
        /system/app 默认的系统应用
        /vendor/app 厂商定制的应用
    8、扫描非系统apk信息:
        /data/app/
        /system/preloadapp/
        /data/app-private/

二、PackageManager框架
    android的PackageManager框架是一个典型的AIDL框架。代码路径DIR=framework/base/core/java/android/。
    IPackageManager.aidl文件在DIR/content/pm/IPackageManager.aidl处,按照android标准的aidl处理模式,会生成一个存根IPackageManager.Stub和一个代理IPackageManager.Stub.Proxy.
    存根的具体实现就是PackageManagerService,而代理的具体实现其实是ApplicationPackageManager,PackageManager是它的父类。
    ApplicationPackageManager路径是DIR/app/ApplicationPackageManager.java。
    PackageManager路径是DIR/content/pm/PackageManager.java。
    在调用Context.getPackageManager()方法时,实际调用的是ContextImpl中的方法,该方法从ActivityThread中取出一个IPackageManager的代理对象,用这个代理实例化了ApplicationPackageManager。