Android Framework源码-PMS

Android Handler随记_暮冬一十四的博客-CSDN博客

Android Binder随记_暮冬一十四的博客-CSDN博客

Android Zygote随记_暮冬一十四的博客-CSDN博客

SystemServer:

        Android一切服务的启动者;

  1. 开机时,板子引导芯片启动引导程序
  2. 引导程序启动PID为0的linux内核进程
  3. linux系统启动init脚本,启动PID永远为1的init进程
  4. init进程启动SystemManager进程;
  5. SystemManager进程启动完后;
  6. init进程启动zygote进程(native进程)
  7. zygote调用SystemServer.java的main函数,frok出SystemServer进程(java进程)
  8. SystemServer.java的main函数里执行SystemServer的run方法,main函数里只有一句代码:new SystemServer().run();
  9. run方法中启动服务进程,AMS、PMS等

ps:SystemManager: 是SystemServer的叔叔,SystemServer把所有服务都交给了SystemManager管理;

  1. AMS、PMS自身创建后,自身对象会添加到SystemManager中,addService("key",AMS/PMS)
  2. getService()时,取的是个binder;

PMS(PackageManagerService):

在SystemServer的进程中,是SystemServer中的一个对象;

有一个缓存中心:mPackages;是一个Map,key为应用的包名,value为每个应用的Package;

在手机启动的时候,做了三件事,且只做一次:

  1. 遍历所有app文件
  2. 解压每个apk文件
  3. dom解析AndroidMnifest.xml,并缓存;

作用:只解析每个Apk中的AndroidMnifest.xml中的信息,而不是去解析节点中每个xxxActivity.java文件;解析到的信息缓存到mPackages中,相当于“注册表”,方便之后AMS快速定位到相应的APP;

  1. PackageManagerService.java中会去两个目录做扫描scanDirTracedLI:用户安装的所有APP目录sAppInstallDir:data/app/;和系统应用所有APP的目录systemAppDir:System/app/
  2. 6.0-8.0都是单线程扫描,9.0和10.0是用线程池进行扫描,扫描到的apk文件信息,new PackageParse(),赋值给包解析工具类PackageParse;
  3. 解压Apk文件,9.0和10.0解析时会去判断缓存中是否有,有则用缓存,6.0-8.0没有使用缓存;
  4. 使用工具类PackageParse解析AndroidMnifest.xml,xml解析完会返回Package对象,每个APK对应一个Package对象,得到这个Package对象后,缓存到PackageManagerService的mPackages这个ArrayMap里;key为应用的包名,value为应用的Package;
  5. Package对象中有解析出的对应App中的四大组件标签、权限标签等等,放入各自的List中,如:activites、services、revicers、providers、权限list等等;activites这些list存的只是一个javabean,而不是存的具体的应用层的Activity;

解析AndroidMnifest.xml流程:

  1. 打开AndroidMnifest.xml
  2. 获取版本号、版本名称
  3. 判断tagname=="applacation"
  4. 判断tagname=="activity","reciver","service","provide"等等
  5. 走到对应的解析parseActivity,parseActivity(reciver和activity的结构一样,就用同样的javabean接收),parseService,parseProvide
  6. 解析完添加到Package的对应的list中;

Android Framework源码-AMS随记_暮冬一十四的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值