zoukankan      html  css  js  c++  java
  • Android PackageManager基础知识

    一、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。

  • 相关阅读:
    POJ 2823 Sliding Window 单调队列
    Java常见面试题汇总(一)
    5.4 heapq--堆队列算法
    使用 rman duplicate from active database 搭建dataguard 手记--系列二
    [LeetCode]Delete Node in a Linked List
    webstorm中使用java的块凝视
    Gradle 1.12用户指南翻译——第三十二章. JDepend 插件
    iOS上如何让按钮(UIbutton)文本左对齐展示
    【matlab】:matlab中不断的出现计算过程怎么办
    apk 签名
  • 原文地址:https://www.cnblogs.com/yuanchongjie/p/4550797.html
Copyright © 2011-2022 走看看