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

Android PackageManager基础知识的更多相关文章

  1. android图形基础知识

    Android核心分析(23)-----Andoird GDI之基本原理及其总体框架 2010-06-13 22:49 18223人阅读 评论(18) 收藏 举报 AndroidGDI基本框架 在An ...

  2. Android 应用基础知识和应用组件

    应用基础知识 安装到设备后,每个 Android 应用都运行在自己的安全沙箱内: Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户: 默认情况下,系统会为每个应 ...

  3. Appium+python自动化(十五)- Android 这些基础知识,你知多少???(超详解)

    简介 前边具体操作和实战已经讲解和分享了很多了,但是一些android的一些基础知识,你又知道多少了,你都掌握了吗?这篇就由宏哥给小伙伴们既是一个分享,又是对前边的一次总结.为什么要对这些做一个简单的 ...

  4. android屏幕基础知识

    首先,先来上一张图,看看android屏幕分辨率的占比情况 什么是dp,dip,dpi,sp.px ?之间的关系是什么? px:构成图像的最小单位 dp/dip:密度无关像素 以160dpi为基准 1 ...

  5. android一些基础知识

    android应用基于JAVA, 支持SQL,由于底层是LINUX,所以支持C/C++ 目前有两种编程:基于ADT的JAVA编程,基于NDK的C编程 Android编程环境需要哪些:官方推荐用JDK+ ...

  6. Android自动化测试基础知识——MONKEY测试工具(转的)

    本周开始启动手机输入法simeiji的自动化测试,同时开始接触手机浏览器自动化测试.接下来会对android自动化测试工具和方法做一个专题研究. 第一篇介绍monkey测试工具. 1 自动化测试背景 ...

  7. 安卓(Android)开发基础知识

    .aar文件 .aar是一种压缩文件,和.jar类似,不过它可以包含资源文件,例如图片.drawable.xml资源 .jar文件 在软件领域,JAR文件(Java归档,英语:Java ARchive ...

  8. Android Service基础知识你知道多少?

    Android四大组件-Service 多次调用startService会怎样?会执行多次onCreate吗? StopService在哪里调用?stopSelf在哪调用? 怎样使Service被ki ...

  9. Android的基础知识

    一.adb 的简单命令 1. adb devices  :   连接当前手机的设备 2.adb kill-server : 杀死当前的adbmingling 3.adb start-server : ...

随机推荐

  1. oracle时间戳转换

    select (to_date('2013-04-09 14:02:15','yyyy-mm-dd hh24:mi:ss') - to_date('1970-01-01','yyyy-mm-dd')) ...

  2. JS中的for和for in循环

    1.for循环通常用来遍历数组或类数组对象 模式1:长度缓存 for(var i=0,max=arr.length;i<max;i++){ //your code } 模式2:逐减,与零比较比与 ...

  3. struts2 MessageStoreInterceptor 拦截器的使用

    MessageStoreInterceptor 拦截器可以把和该 Action 相关的 messages, errors 和 field errors(下称 "消息") 保存到 s ...

  4. 洛谷 P1896 互不侵犯King

    P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...

  5. 【干货】.NET开发通用组件发布(四) 日志记录组件

    组件介绍和合作开发 http://www.cnblogs.com/MrHuo/p/MrHuoControls.html 日志记录组件功能介绍 通过基类Logger,实现了文本记录日志和数据库记录日志两 ...

  6. JSON.stringify 语法实例讲解 字符串

    语法: JSON.stringify(value [, replacer] [, space]) var student = new Object(); student.name = "La ...

  7. excel筛选两列值是否相同,如果相同返回第三列值

    见图:

  8. Android 隐藏输入软键盘

    //隐藏输入键盘 ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)) .hideSoftInputFromWindow(BshTo ...

  9. MySQL导出数据文件

    SELECT * INTO OUTFILE '/root/a.txt' FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' FROM t_log_in ...

  10. QDataStream类参考(串行化数据,可设置低位高位,以及版本号),还有一个例子

    QDataStream类提供了二进制数据到QIODevice的串行化. #include 所 有成员函数的列表. 公有成员 QDataStream () QDataStream ( QIODevice ...