Android Handler随记_暮冬一十四的博客-优快云博客
Android Binder随记_暮冬一十四的博客-优快云博客
Android Zygote随记_暮冬一十四的博客-优快云博客
SystemServer:
Android一切服务的启动者;
- 开机时,板子引导芯片启动引导程序
- 引导程序启动PID为0的linux内核进程
- linux系统启动init脚本,启动PID永远为1的init进程
- init进程启动SystemManager进程;
- SystemManager进程启动完后;
- init进程启动zygote进程(native进程)
- zygote调用SystemServer.java的main函数,frok出SystemServer进程(java进程)
- SystemServer.java的main函数里执行SystemServer的run方法,main函数里只有一句代码:new SystemServer().run();
- run方法中启动服务进程,AMS、PMS等
ps:SystemManager: 是SystemServer的叔叔,SystemServer把所有服务都交给了SystemManager管理;
- AMS、PMS自身创建后,自身对象会添加到SystemManager中,addService("key",AMS/PMS)
- getService()时,取的是个binder;
PMS(PackageManagerService):
在SystemServer的进程中,是SystemServer中的一个对象;
有一个缓存中心:mPackages;是一个Map,key为应用的包名,value为每个应用的Package;
在手机启动的时候,做了三件事,且只做一次:
- 遍历所有app文件
- 解压每个apk文件
- dom解析AndroidMnifest.xml,并缓存;
作用:只解析每个Apk中的AndroidMnifest.xml中的信息,而不是去解析节点中每个xxxActivity.java文件;解析到的信息缓存到mPackages中,相当于“注册表”,方便之后AMS快速定位到相应的APP;
- PackageManagerService.java中会去两个目录做扫描scanDirTracedLI:用户安装的所有APP目录sAppInstallDir:data/app/;和系统应用所有APP的目录systemAppDir:System/app/
- 6.0-8.0都是单线程扫描,9.0和10.0是用线程池进行扫描,扫描到的apk文件信息,new PackageParse(),赋值给包解析工具类PackageParse;
- 解压Apk文件,9.0和10.0解析时会去判断缓存中是否有,有则用缓存,6.0-8.0没有使用缓存;
- 使用工具类PackageParse解析AndroidMnifest.xml,xml解析完会返回Package对象,每个APK对应一个Package对象,得到这个Package对象后,缓存到PackageManagerService的mPackages这个ArrayMap里;key为应用的包名,value为应用的Package;
- Package对象中有解析出的对应App中的四大组件标签、权限标签等等,放入各自的List中,如:activites、services、revicers、providers、权限list等等;activites这些list存的只是一个javabean,而不是存的具体的应用层的Activity;
解析AndroidMnifest.xml流程:
- 打开AndroidMnifest.xml
- 获取版本号、版本名称
- 判断tagname=="applacation"
- 判断tagname=="activity","reciver","service","provide"等等
- 走到对应的解析parseActivity,parseActivity(reciver和activity的结构一样,就用同样的javabean接收),parseService,parseProvide
- 解析完添加到Package的对应的list中;