文档开发者中心
我的

Android系统启动及binder机制启动流程分析(转载)

一、Binder是什么、能做什么?

Binder是android系统里面的进程间通信机制。androd系统中,不同的app运行在不同的进程中,同一个app的不同组件也可能运行在不同的进程中(androidManifest文件中android:process)。当一个进程想为其它进程提供服务时,就需要通过进程间通信的方式来提供服务。

二、 为什么使用Binder

  Android系统是基于Linux系统的,理论上应该使用Linux内置的IPC方式。Linux中的IPC方式有管道、信号量、共享内存、消息队列、Socket,Android使用的Binder机制不属于Linux。Android不继承Linux中原有的IPC方式,而选择使用Binder,说明Binder具有一定的优势。

1、采用C/S的通信模式。而在linux通信机制中,目前只有socket支持C/S的通信模式,但socket有其劣势,

socket:是一个通用接口,导致其传输效率低,开销大;

2、管道和消息队列:因为采用存储转发方式,所以至少需要拷贝2次数据,效率低;

3、共享内存:虽然在传输时没有拷贝数据,但其控制机制复杂(比如跨进程通信时,需获取对方进程的pid,得多种机制协同操作,也不能即时通讯);

4、安全性更高。Linux的IPC机制在本身的实现中,并没有安全措施,得依赖上层协议来进行安全控制。而Binder机制的 UID/PID是由Binder机制本身在内核空间添加身份标识,安全性高;并且Binder可以建立私有通道,这是linux的通信机制所无法实现的 (Linux访问的接入点是开放的)。

  综上,Binder是一种基于Client-Server通信模式的通信方式,传输过程只需要一次拷贝,可以为发送方添加UID/PID身份,支持实名Binder和匿名Binder,安全性高。

三、Android系统的启动流程

1、首先Bootloader引导程序启动完Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统,同时会加载用户级别的第一个进程init(system\core\init.c),该进程会首先加载一个init.rc配置文件,代码如下:


微信图片_20190801131557.png

2、进程的启动方式

微信图片_201908011315571.png

3、 zygote的作用及启动

(1)zygote的作用:孵化应用进程和启动systemserver

(2) zygote的启动流程



4、systemserver进程的启动流程及作用:

(1)systemserver进程的启动流程:

微信图片_201908011315574.png

(2)systemserver进程的作用:

SystemServer进程是Android系统的核心之一,大部分Android提供的服务都在该进程中,SystemServer中运行的进程共有六十多种,主要包括:ActivityManagerService(AMS),WindowManagerService(WMS),PackagManagerService(PMS)等。

5、桌面的启动:

当System Server进程开启的时候,就会初始化ActivityManagerService(AMS),同时,会加载本地系统的服务库,创建系统上下文,创建ActivityThread及开启各种服务等等。而在这之后,就会开启系统的Launcher程序,完成系统界面的加载与显示。srartHomeActivitylcokd()方法启动桌面的activity:launcher,在launcher的concrete方法里创建一个loadertask类,该类会去PackagManagerService服务查询安装的应用,然后显示到桌面。

四、binder机制通信流程

1、binder机制通信流程图


微信图片_201908011315575.png

微信图片_201908011315576.png

2、servicemanager的启动和作用:

(1)启动进程

(2)启动binder机制

(3)发布自己的服务

(4)等待并相应请求

主要代码分析:

入口函数:

微信图片_201908011315577.png

打开binder驱动函数binder_open()和发布自己的服务binder_become_context_manager()

微信图片_201908011315578.png

等待并响应请求函数binder_loop():把BC_ENTER_LOOPER指令写入binder驱动,注册为binder线程


微信图片_2019080113155711.png

3、进程如何启动binder机制,这里以surfaceflinger进程为例说明

surfaceflinger进程入口函数:

微信图片_2019080113155712.png

defaultServiceManager()函数实现:

微信图片_2019080113155713.png

addService()函数实现: remote()返回bpBinder,在调到binder驱动的transact方法:

继续看servicemanager端的处理请求函数:

4、一次完整的client端调用server端流程图:

微信图片_2019080113155717.png

具体源码分析,下篇博客分享!☺
---------------------
作者:仕伟
来源:CSDN
原文:
版权声明:本文为博主原创文章,转载请附上博文链接!

点赞
14
收藏
15
回复
16
分享
举报
浏览4134 发布于2019-08-01 05:25未知归属地
全部评论
最多点赞
最新发布
最早发布

看着楼主这么潇洒的样子, 我笑而不语


16楼回复于2019-08-07 04:38 未知归属地

希望学习前沿技术,大家多多指教


15楼回复于2019-08-07 04:28 未知归属地

涨姿势了,这是要火的节奏哦


14楼回复于2019-08-06 08:20 未知归属地

飘过,烧纸,点蜡,上香,没动静;


12楼回复于2019-08-06 07:48 未知归属地

飘过,烧纸,点蜡,上香,没动静;


11楼回复于2019-08-06 07:20 未知归属地

希望学习前沿技术,大家多多指教


10楼回复于2019-08-06 07:17 未知归属地

精彩转载 感谢分享

9楼编辑于2019-08-06 11:11 未知归属地

好像很很牛B的样子~~


8楼回复于2019-08-06 07:02 未知归属地

顶上去大家都看到


7楼回复于2019-08-06 05:42 未知归属地

楼主继续加油啊,我先闪了


6楼回复于2019-08-06 05:12 未知归属地
共2页
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。