一、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. Jquery:Jquery中的DOM操作<二>

    由于昨天晚上回来的晚,写的有点匆忙,所以昨天的学习笔记中出现了多处错误的地方,幸好有各位园友帮忙指出,在这里谢过各位了!今天继续学习关于Jquery中DOM的操作,其实是昨天随笔的延续,求围观!!! ...

  2. IIS 7管理API——Microsoft.Web.Administration介绍

    原文:http://www.cnblogs.com/dflying/archive/2006/04/17/377276.html 本文翻译整理自Carlos Aguilar Mares的blog文章: ...

  3. hdu3714 三分

    Error Curves Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  4. linux里忘记root密码解决办法

    1:打开虚拟机,点‘启动’按钮, 2:出现上面这个界面时,键盘输入’i’,出现grub界面: 3:键盘输入e,出现如下界面: 4:选择第二行(kernel……) 5:键盘输入e,出现如下界面: 6:在 ...

  5. keil c51中C程序的启动过程

    汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和链接.下面看看它和main()函数是 ...

  6. 《Programming WPF》翻译 第8章 1.动画基础

    原文:<Programming WPF>翻译 第8章 1.动画基础 动画包括在一段时间内改变用户界面的某些可见的特征,如它的大小.位置或颜色.你可以做到这一点,非常困难的通过创建一个tim ...

  7. WPF利用Image实现图片按钮

    之前有一篇文章也是采用了Image实现的图片按钮,不过时间太久远了,忘记了地址.好吧,这里我进行了进一步的改进,原来的文章中需要设置4张图片,分别为可用时,鼠标悬浮时,按钮按下时,按钮不可用时的图片, ...

  8. shell操作mysql

    参考: http://blog.csdn.net/hbcui1984/article/details/5125387

  9. cygwin--简单备忘

    cygwin是windows上使用linux的一个东东 linux中可以apt-get来安装软件,在cygwin中则使用apt-cyg来安装软件 具体怎么玩的呢: 1.下载cygwin 2.下载并且修 ...

  10. C#优秀开源资料收集

    1. 把对命令行程序的调用封装起来,通过程序里进行输入,调用命令行程序的输出显示在程序中 http://www.codeproject.com/Articles/335909/Embedding-a- ...