PackageManagerService主要负责Android系统的应用管理,它提供对各种APK文件的安装、卸载、优化和查询服务。PackageManagerService在系统启动时会扫描所有存在的APK文件和Jar包信息,并将它们读取、保存起来;这样系统在运行时,就能很快的查询到各种应用和相关组件的信息。

一、 PackageManagerService初始化

参数介绍:

Installer=>负责与installd通讯的客户端

实例化在systemServer中

FactoryTest=>是否当前系统进去的是工厂模式,这里假设走false

OnlyCore=>是否处理系统核心应用,假设走false

对应的核心应用在哪里指定:

1. 构造函数—1

添加几种SharedUserId对象到Settings中,sharedUserId属性相同的package可以运行在同一个进程中,或者相互读取资源;

Settings可以看做是一个数据动态管理类,它主要会管理packages.xml文件中的信息;

  • packages.xml:记录了系统中所有安装应用的基本信息,如果签名、权限等等
  • packages-backup.xml:packages.xml文件的备份
  • packages-stopped.xml:记录系统中所有被强制停止运行的应用的信息(如我们在系统设置中,选择某个应用,并将它强制停止)
  • packages-stopped-back.xml:packages-stopped.xml文件的备份
  • packages.list:保存了应用的数据目录和UID等信息

Android系统在修改packages.xml、packages-stopped.xml之前,会先对它们进行备份。当对它们的修改操作正常完成,则会删掉之前建立的备份文件。如果,在修改过程中系统出现问题重启了,会再次去读取这两个文件。

2. 构造函数—2

SystemConfig是一个工具类,它负责读取系统中全局的某些权限、特性信息,展开SystemConfig,看做了什么:

通过readPermissions()读取指定/system/etc/、/oem/etc/等目录下的permission xml文件,解析其中的内容。

我们列举一些其中的文件的内容,来大致看下配置文件的内容:

platform.xml

plateform.xml中出现的标签种类则较为多样,它们的含义分别是:

  • <permission >标签:把属性name所描述的权限赋予给<group>标签中属性gid所表示的用户组
  • <assign-permission>标签:把属性name所描述的权限赋予给uid属性所表示的用户
  • <library>标签:除framework中动态库以外的,所有系统会自动加载的动态库

最后将上面xml解析出来的数据做如下存储:

  • <group>标签gid属性的值会存放在mGlobalGids数组中;
  • <permission>标签,解析得到的值会存放在mPermissions集合中;
  • <assign-permission>标签解析得到的值会存放在mSystemPermissions中;
  • <library>标签解析得到的值会存放在mSharedLibraries中;
  • 3. 构造函数—3

  • 该部分介绍apk扫描过程

  • PackageManagerService(PKMS)构造中触发APK扫描的函数调用是:scanDirTracedLI(),它会遍历我们传入的文件路径,然后循环解析其中存在的APK文件,并将信息解析出来存入PKMS内部,供后续的运行时信息管理。PKMS这一部分的函数调用很深,我们这里只看其中的几个关键函数调用,以此来熟悉APK扫描工作的基本内容。

  • PKMS解析APK文件主要依靠PackageParser实现.

    其中,PackageParser::Package信息是最丰富的。说是解析APK文件,其实主要是解析应用的Androidmanifest.xml配置文件;因为配置文件中描述了所有有关该应用的组件、权限、包名等信息。对它的解析过程,就是我们获取APK信息的过程。

    PackageParser::parseBaseApkCommon()负责Androidmanifest.xml的解析,将生成的信息保存到PMS的相关变量中

  • 我们只看里面关于application标签的解析。

  • 调用parseBaseApplicaton()函数解析<application>标签。

  • 我们从代码中看到了对Application中声明的Android四大组件的解析调用,它们的解析过程类似:都是调用XmlPullParser解析器解析各个节点的内容并保存。我们以解析Activity为例,来看它是如何解析<activity>节点、并保存其各个节点的信息的,以<intent-filter>节点的内容;我们设置的intent内容都包含在<intent-filter>节点内,PMS对外提供了组件查询的业务,它主要就是根据这里的intent来查找的。:

  • 解析到了Intent信息会保存到Activity实例内部的intents集合中;这一部分对Service/Provider/Receiver的解析都是一样的;<activity>标签解析完后,返回的activity实例又会被保存到Package类的activities中。其他三大组件的处理也跟此类似,所以这里就略过它们的解析过程了。

    parseBaseApplication()函数执行完毕后,我们得到了一个保存有绝大部分APK信息的Package实例;得到了Package实例,我们还需要把它的信息整合到PMS中,让PMS统一管理;这个过程由PMS::scanPackageDirtyLI()处理。scanPackageDirtyLI()函数的处理较长,这里不做详细分析。

    经过了scanPackageDirtyLI(),我们解析到的一个APK的Package实例添加到了PMS中,并且它所有重要组件也已经由PMS统一管理。这样PMS就能很好的管理这个APK的信息了。

    到这里,APK扫描所涉及到的主要函数调用分析也就结束了。

    二、 apk安装

    不管是三方市场,或系统自带的packageInstaller,其实到后面的动作都是一样的,我们这里以最复杂的adb install来分析流程。

    在android中,adbd以后台进程运行。当我们输入"adb install"命令时,/syste/core/adb/目录下commandline.cpp文件会被执行,其中adb_commandline()函数会接受该条指令,并进行处理,这里只看install命令的执行:

  • 然后,流程会去执行pm脚本进行安装操作。手机的端的adbd程序接收到客户机发送的shell pm命令后,会开启一个shell去执行pm脚本。pm脚本的内容如下:

  • frameworks\base\cmds\pm\src\com\android\commands\pm\Pm.java

  • 最终还是调用到PMS里面,层层调用,最后来到installPackageAsUser()

  • 进入handleStartCopy后:

  • 首先会进行一些安装标志的判断
  • 调用DCS::getMinimalPackageInfo()方法获取该apk安装需要的大小及其他信息
  • 如果检测到当前的目录下的大小不足以安装应用,还回去进行cache的清理工作
  • 随后会以当前的InstallParams实例,创建FileInstallArgs对象,并保存一份到InstallParams对象的mArgs字段中
  • 后续是一段组件校验工作,这里不做分析
  • 最后FileInstallArgs::copyApk()函数,进行下一步处理
  • handleStartCopy最终调用到doCopyApk,完成下面动作:

  • 通过PackageInstallService为要安装的apk在/data/app/下生成一个零时文件tempDir
  • 为该tempDir创建IParcelFileDescriptorFactory文件描述符,它可以在进程间传递
  • 调用DefaultContainerService::copyPackage()方法执行apk临时文件的复制
  • 最后再将apk中包含的一些库文件提取出来,放置到对应的lib/目录下
  • 如果一切过程都正常,至此,APK安装的第一部分的工作:APK文件的拷贝,就结束了,接着处理下一步:

  • processPendingInstall->installPackageTracedLI

    ->installPackageLI->installNewPackageLIF->scanPackageTracedLI

    ->scanPackageLI->scanPackageDirtyLI  完成信息的整合

    在Android系统中,PackageManagerService用于管理系统中的所有安装包信息及应用程序的安装卸载,但是应用程序的安装与卸载并非PackageManagerService来完成,而是通过PackageManagerService来访问installd服务来执行程序包的安装与卸载的。

  • Android O上面installd与PMS直接的通讯已经由socket换为binder了。

    Installd服务的启动在systemServer中:

    相关实现在:

    frameworks\native\cmds\installd\installd.cpp

    frameworks\native\cmds\installd\InstalldNativeService.cpp

    frameworks\base\services\core\java\com\android\server\pm\Installer.java

  • frameworks\native\cmds\installd\installd.rc

    service installd /system/bin/installd
        class main

    相关执行最终在installd中完成。

  • 处理结束后,发送相关广播通知其他应用,如launcher收到广播后,通过PMS查找先关activity,显示图标等信息。

  • 到此apk安装结束。

PackageManagerService安装应用流程相关推荐

  1. 一般家用监控多少钱_家用煤气灶价格一般是多少 燃气灶安装的流程

    阅读本文前,请您先点击上面的蓝色字体,再点击"关注",这样您就可以继续免费收到最新文章了.每天都有分享.完全是免费订阅,请放心关注.注:本文转载自网络,不代表本平台立场,仅供读者参 ...

  2. oracle rac war配置,Oracle RAC安装配置流程

    系统部分 1.建立用户 2.设定IP 3.每个节点的IP解析 4.SSH的配置 为用户等效性配置SSH(在所有节点上执行) 在安装Oracle RAC 10g期间,OUI需要把文件复制到集群中的其他主 ...

  3. 安装zephyr流程与问题解决

    安装zephyr流程与问题解决 参考教程:https://docs.zephyrproject.org/latest/getting_started/index.html 两边对比着看,不要刻舟求剑! ...

  4. 阿里云服务器上安装rabbitmq流程

    阿里云服务器上安装rabbitmq流程 1.一定要注意版本问题 rabbitmq+erlang+centos的版本得都得考虑 Erlang24和centos7不能一起用,el7对应centos7,el ...

  5. Android 安装apk流程,Android PMS(二)-Apk安装流程

    原创内容,转载请注明出处,多谢配合. 一.APK组成 在APK的安装流程,在此之前先简单了解下APK组成: 目录/文件 描述 assert 存放的原生资源文件,通过AssetManager类访问. l ...

  6. (一)Ubuntu安装详细教程(从镜像制作到NVIDIA驱动安装全流程)——超详细的图文教程

    Ubuntu安装详细教程(从下载镜像到安装NVIDIA驱动) 1.下载镜像文件 2.制作硬盘镜像 2.1 安装UltraISO并打开ISO文件 2.2 制作硬盘镜像 2.3 检查是否成功 3.划分磁盘 ...

  7. CentOS7.5.1804安装yum流程

    CentOS7.5.1804安装yum流程 1.卸载现有的python 强制删除已安装程序及其关联 rpm -qa|grep python|xargs rpm -ev --allmatches --n ...

  8. R语言Bioconductor安装全流程

    R语言Bioconductor安装全流程 作为一只生物狗,R语言对于生物数据分析真的很重要!如果你翻翻生物专业研究生的朋友圈,你的感觉一定是: 满世界都在学R语言: 满世界都在吐槽R包难装! 下面给大 ...

  9. 阿里云服务器域名http升级为https访问,SSL证书下载安装全流程

    阿里云服务器域名http升级为https访问,SSL证书下载安装全流程 目录 阿里云服务器域名http升级为https访问,SSL证书下载安装全流程 1.背景 2.阿里云下载安装SSL证书流程 2.1 ...

最新文章

  1. SQL Server 2014 许可证(五)降级与升级
  2. linux7 显示登陆,centos7 查看,修改登录日志
  3. 把软件架构演进体现在栈上
  4. 仿即刻的点赞滚动放大波纹图标
  5. .NET项目修改文件夹
  6. vbseltext_VB编程技巧之selstart, sellength,seltext属性
  7. java hashmap扩容大小_HashMap的扩容机制以及默认大小为何是2次幂
  8. tensorboard ckpt pb 模型的输出节点_FlyAI小课堂:Tensorflow-模型和数据的保存和载入...
  9. it精英挑战赛的规则 校区内部评选 2020
  10. 杭电2112(SPFA)
  11. [POJ2096] Collecting bugs
  12. python消费kafka逻辑处理导致cpu升高_Kafka 消费迟滞监控工具 Burrow
  13. 安装Firefly错误-Unable to find vcvarsall.bat
  14. 有无3C认证的电源价格差别说明什么?
  15. 文件导入工具类--利用反射自动转换为list对象
  16. 形式化方法 | Proof Engineering for Predicate Logic——Coq tatics 在谓词逻辑证明中的应用
  17. echarts 正负条形图
  18. 什么是BIM开发?这篇文章可以告诉你
  19. 中科院大学计算机科学与技术王伟强,王伟强-中国科学院大学-UCAS
  20. 产生虚假的用于欺骗的IP数据包程序实践——Teardrop

热门文章

  1. 一起用Python做个自动化短视频生成脚本,实现热门视频流水线生产!
  2. 4、selenium3的安装
  3. 不知原谅什么,诚觉世事尽可原谅
  4. 游戏服务器为什么老被攻击?被攻击了的一些常见的处理方法
  5. 常用外贸群发邮件模板,海外邮件
  6. 监控服务器网卡上传和下载网速的脚本
  7. linux系统自动获取ip地址,Linux系统下设置静态IP或自动获取动态IP的简单方法
  8. python写一个飞花令程序
  9. 什么是埋点?埋点的意义是什么?有哪些用途?
  10. breakpoint