前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >应用是怎么启动Binder机制的

应用是怎么启动Binder机制的

作者头像
码农帮派
发布2020-12-29 09:49:29
1.2K0
发布2020-12-29 09:49:29
举报
文章被收录于专栏:码农帮派
  • 了解Binder是用来做什么的?
  • 应用里面哪些地方用到了Binder机制?
  • 应用的大致启动流程是怎么样的?
  • 一个进程是怎么启动Binder机制的?

我们在Activity.onCreate甚至更早的Application.onCreate里面就可以调用Binder机制了,这说明应用启动Binder比Application的生命周期更早。

上图是应用进程启动的流程,AMS在组件启动的过程中要是发现组件所在的进程尚未启动,就会通过本地socket通知Zygote启动进程,Zygote在应用进程启动完成之后会将启动的子进程的pid返回给AMS,应用进程启动完成之后,就会通过Binder通知AMS已经启动完成,并将自己的Binder句柄在AMS中注册。

从应用进程启动的流程中,我们可以看到在应用进程启动完成之后,应用进程的Binder机制就已经启动了,在Zygoto通过fork之后,对进程资源进行初始化的过程中完成了Binder的启动。

下面首先来看看Zygoto启动进程的流程

我们知道Zygote是有init进程启动的,Zygote启动之后,就会进入Loop循环读取本地socket传递来的消息,Zygote处理消息的函数runOnce:

首先Zygote通过readArgumentList读取socket里面的参数,然后通过fork的方式创建一个子进程,pid等于0表示当前是在子进程中,在子进程中通过handleChildProc来初始化子进程的相关资源。

其中在nativeZygoteInit函数中,通过open("/dev/binder")来启动binder驱动,binder驱动启动成功之后,就会将binder驱动映射到当前进程的内存空间,当前进程中就可以通过binder机制进行跨进程交互了。

完整的binder启动流程是,Zygote在fork出子进程之后,在子进程中进行进程的初始化,首先启动binder驱动,binder驱动启动成功之后,会通过mmap将binder驱动映射到当前进程的内存空间中,然后注册一个单列的binder线程,并在binder线程中启动loop循环,不断的与binder驱动进行交互。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农帮派 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档