文档开发者中心
我的

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(systemcoreinit.c),该进程会首先加载一个init.rc配置文件,代码如下:


微信图片_20190805142346.png

2、进程的启动方式

微信图片_201908051423461.png

3、 zygote的作用及启动

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

(2) zygote的启动流程

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

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

(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服务查询安装的应用,然后显示到桌面。

微信图片_201908051423467.png

四、binder机制通信流程

1、binder机制通信流程图


微信图片_201908051423468.png

2、servicemanager的启动和作用:

(1)启动进程

(2)启动binder机制

(3)发布自己的服务

(4)等待并相应请求

主要代码分析:

入口函数:

微信图片_201908051423469.png

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


微信图片_2019080514234610.png

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

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

surfaceflinger进程入口函数:


微信图片_2019080514234611.png

defaultServiceManager()函数实现:

微信图片_2019080514234612.png

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

微信图片_2019080514234613.png

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


微信图片_2019080514234615.png

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


微信图片_2019080514234616.png

---------------------
作者:仕伟
来源:CSDN
原文:
版权声明:本文为博主原创文章,转载请附上博文链接!

点赞
13
收藏
13
回复
14
分享
举报
浏览3758 发布于2019-08-05 06:31未知归属地
全部评论
最多点赞
最新发布
最早发布

这个问题我答不了,占位等雷锋。


14楼回复于2019-08-11 01:46 未知归属地

楼主加油,争取早日成为社区牛人!


13楼回复于2019-08-10 03:26 未知归属地

原来是这样啊,学习到了


12楼回复于2019-08-08 03:12 未知归属地

大师在民间啊,膜拜一下!


11楼回复于2019-08-08 03:09 未知归属地

微微一顶以表敬意。。。


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

百善回帖为先!楼下接着我。。


9楼回复于2019-08-06 08:22 未知归属地

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


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

赶上直播,真是幸运的呢


7楼回复于2019-08-06 07:21 未知归属地

贫僧路过此贴、见到楼主不但吹牛,且妖惑众生、唾沫横飞。老纳唯有捡起一根树枝对着楼主胸前猛刺过去口中念念有词:施主、我顶你个肺


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

看个标题就走了, 别留我。。


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

我要发帖子

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