感谢您的阅读与点赞!欢迎点击右上角关注:「大猫玩程序」
微信公众号:大猫玩程序
前几节已经讲完了Android10.0的Init启动过程以及Zygote的架构。
Android 10.0系统源码取经之路——启动篇Android系统架构浅析-「Android取经之路」Android是怎么启动的-「Android取经之路」
Android 10.0系统启动之init进程(一)-「Android取经之路」Android 10.0系统启动之init进程(二)-「Android取经之路」Android 10.0系统启动之init进程(三)-「Android取经之路」
Android 10.0系统启动之init进程(四)-「Android取经之路」Android 10.0系统启动之Zygote进程(一)-「Android取经之路」
Android 10.0系统启动之Zygote进程(二)-「Android取经之路」
Android 10.0系统启动之Zygote进程(三)-「Android取经之路」
这一节开始针对于Zygote的一些问题进行分析。
Zygote架构
5.问题分析
5.1 为什么SystemServer和Zygote之间通信要采用Socket
进程间通信我们常用的是binder,为什么这里要采用socket呢。
主要是为了解决fork的问题:
1.UNIX上C++程序设计守则3:多线程程序里不准使用fork
2.Binder通讯是需要多线程操作的,代理对象对Binder的调用是在Binder线程,需要再通过Handler调用主线程来操作。
比如AMS与应用进程通讯,AMS的本地代理IApplicationThread通过调用ScheduleLaunchActivity,调用到的应用进程ApplicationThread的ScheduleLaunchActivity是在Binder线程,
需要再把参数封装为一个ActivityClientRecord,sendMessage发送给H类(主线程Handler,ActivityThread内部类)
主要原因:害怕父进程binder线程有锁,然后子进程的主线程一直在等其子线程(从父进程拷贝过来的子进程)的资源,但是其实父进程的子进程并没有被拷贝过来,造成死锁,
所以fork不允许存在多线程。而非常巧的是Binder通讯偏偏就是多线程,所以干脆父进程(Zgote)这个时候就不使用binder线程
5.2为什么一个java应用一个虚拟机?
- android的VM(vm==Virtual Machine )也是类似JRE的东西,当然,各方面都截然不同,不过有一个作用都是一样的,为app提供了运行环境
- android为每个程序提供一个vm,可以使每个app都运行在独立的运行环境,使稳定性提高。
- vm的设计可以有更好的兼容性。android apk都被编译成字节码(bytecode),在运行的时候,vm是先将字节码编译真正可执行的代码,否则不同硬件设备的兼容是很大的麻烦。
- android(非ROOT)没有windows下键盘钩子之类的东西,每个程序一个虚拟机,各个程序之间也不可以随意访问内存,所以此类木马病毒几乎没有。
5.3 什么是Zygote资源预加载
预加载是指在zygote进程启动的时候就加载,这样系统只在zygote执行一次加载操作,所有APP用到该资源不需要再重新加载,减少资源加载时间,加快了应用启动速度,一般情况下,系统中App共享的资源会被列为预加载资源。
zygote fork子进程时,根据fork的copy-on-write机制可知,有些类如果不做改变,甚至都不用复制,子进程可以和父进程共享这部分数据,从而省去不少内存的占用。
5.4 Zygote为什么要预加载
应用程序都从Zygote孵化出来,应用程序都会继承Zygote的所有内容。
如果在Zygote启动的时候加载这些类和资源,这些孵化的应用程序就继承Zygote的类和资源,这样启动引用程序的时候就不需要加载类和资源了,启动的速度就会快很多。
开机的次数不多,但是启动应用程序的次数非常多。
5.5 Zygote 预加载的原理是什么?
zygote进程启动后将资源读取出来,保存到Resources一个全局静态变量中,下次读取系统资源的时候优先从静态变量中查找。
6.总结
至此,Zygote启动流程结束,Zygote进程共做了如下几件事:
- 解析init.zygote64_32.rc,创建AppRuntime并调用其start方法,启动Zygote进程。
- 创建JavaVM并为JavaVM注册JNI.
- 通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层。
- 通过ZygoteServer创建服务端Socket,预加载类和资源,并通过runSelectLoop函数等待如ActivityManagerService等的请求。
- 启动SystemServer进程。
推荐阅读:寻找我的iphone在哪里
-
世界互联网大会就在这里,互联网之光博览中心抢
10月20日-22日,第六届世界互联网大会将在浙江乌镇召开,本次大会以“智能互联 开放合作——携手共建网络空间命运共同体”为主题,为各方提供碰撞思想、营造共识、...
2019-10-17 -
中芯国际量产14nm制程芯片,这是AIoT时
“中国芯”迎来技术新突破。中芯国际近日表示,通过加大研发投入,14nm制程工艺芯片已经实现量产,并将于2021年正式出货。继去年8月中芯国际首次宣布14nm芯片...
2019-10-17 -
美科技巨头"败走"中国市场:曾垄断国内20年
美科技巨头败走中国市场:曾垄断国内20年,如今败给阿里巴巴编辑按:众所周知,美国的科技公司因为基础好、技术实力雄厚,所以在与别的对手竞争时,总会占的上风。尤其是...
2019-10-17 -
员工更信任机器人?研究表明:82%的人认为人
据外国媒体10月15日报道,根据美国科技公司甲骨文(Oracle)和研究公司“未来工作场所”(Future Work place)最新发布的一项全球研究显示,员...
2019-10-17 -
第六届世界互联网大会发布无线电设备使用管理通
中关村在线消息:在世界互联网大会期间,各类无线设备的使用必然是一个高峰拥挤的状态,为保障大会期间各类无线电频率有序使用,无线电台(站)、设备正常工作,大会官方出...
2019-10-17 -
华为发布2019年Q3财报 前三季度手机出货
10月16日,华为正式公布2019年第三季度经营业绩。截至第三季度,华为实现销售收入6108亿人民币,同比增长24.4%,净利润率8.7%。同时华为也公布了5G...
2019-10-17 -
腾讯云进入智慧社区新流量战场,强调数据归属和
社区正成为互联网巨头竞争的新流量战场。数据统计,全国总计约250多个城市提出或在建智慧城市,总计划投资规模高达万亿元。作为智慧城市的关键一环,智慧社区可围绕社区...
2019-10-17 -
百度CTO王海峰携百度飞桨出席世界科技与发展
中新网10月16日电 10月16日,首届世界科技与发展论坛在北京举办。百度首席技术官王海峰出席论坛,并向现场来自全球20多个国家和地区的200多名院士、诺贝尔奖...
2019-10-17