zoukankan      html  css  js  c++  java
  • PackageManager源码分析

    在android 4.4源码上进行的分析。

    一、PackageManager如何产生的?

    我们平时在代码中使用的context.getPackageManager()

    那么这个PackageManager是怎样一步一步生成的呢?

    context.getPackageManager()->ContextImpl.getPackageManager()

    通过查看ContextImpl源码发现返回的是ApplicationPackageManager的对象,

    ApplicationPackageManager 是继承 抽象类PackageManager

    ApplicationPackageManager只是一个装饰类,真正的实现类是通过ActivityThread.getPackageManager()来获取的

    看看ActivityThread源码(这里说一句,我们app的启动入口也在ActivityThread里面)

    真正的实现类是通过ServiceManager返回的binder对象而来,

    这个实现接口的类就是PackageManagerService

    二、PackageManagerService如何工作的?

    PackageManagerService是如何创建的呢?

    SystemServer.main() -> initAndLoop()

    创建后做了啥?

    1.首先 扫描安装“system/framework”目录下的jar包

    2.扫描 安装系统system/app的应用程序

    3.制造商的目录下/vendor/app应用包

    4.扫描“data/app”目录,即用户安装的第三方应用

    5.扫描" data/app-private"目录,即安装DRM保护的APK文件(一个受保护的歌曲或受保 护的视频是使用 DRM 保护的文件)

     

    1. 从apk, xml中载入pacakge信息, 存储到内部成员变量中, 用于后面的查找. 关键的方法是scanPackageLI().
    2. 各种查询操作, 包括query Intent操作.
    3. install package和delete package的操作. 还有后面的关键方法是installPackageLI(). 

    4. 广播通知

    未完待续

  • 相关阅读:
    连接池的实现 redis例子
    XSS的防御
    element-UI使用中:el-input type为textarea时@change无法触发?
    textarea高度自适应(转载)
    友盟统计单页面应用vue
    axios formData提交数据 && axios设置charset无效???
    解锁技能:sass + node-sass多页面应用编译(转载)
    css3新单位vw、vh、vmin、vmax的使用详解(转载)
    移动端bug集合
    Python3之Memcache使用
  • 原文地址:https://www.cnblogs.com/lzl-sml/p/5320222.html
Copyright © 2011-2022 走看看