Android 应用是如何启动 binder 机制的?
文章目录
- 应用是什么时候支持 binder 机制的
- 应用大致启动流程是什么
- 总结问题
应用是什么时候支持 binder 机制的
- binder 都知道是用来做跨进程服务的,应用内可以通过binder 跟系统组件进行交互。如 AMS Service aidl 等
- 那么可以思考一下,当 Activity onCreate() 的时候,甚至是 Application 的 onCreate() 的时候都可以获取的到系统服务,所以此时 binder 机制一定是初始化好了的。
应用大致启动流程是什么
当系统启动一个组件时,发现其进程未启动会通过 AMS 向 Zygote 发送请求启动应用,zygote 启动应用好了以后,应用会告知 AMS 启动完成,所以,应用通过binder进行通信最早应该是启动好后就已经和 AMS 通信了。所以可以看看再之前启动进程过程中是否启动了 binder 机制。
- 进程启动流程
之前有说过 zygote 进程启动之后会调用 zygoteServer.runSelectLoop(abiList); 开启 loop 等待和处理创建应用的消息。所以我们看看 loop 中获取到消息以后会处理哪些东西;
Android 9.0 当消息到来的时候会执行 Runnable processOneCommand() 方法
Runnable processOneCommand(ZygoteServer zygoteServer) {String args[];Arguments parsedArgs = null;FileDescriptor[] descriptors;try {// 先读取 AMS 发送过来的参数列表args = readArgumentList();descriptors = mSocket.getAncillaryFileDescriptors();} catch (IOException ex) {throw new IllegalStateException("IOException on command socket", ex);}/// 略......int pid = -1;// 通过 forkAndSpecialize 创建应用的进程pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,parsedArgs.runtimeFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,parsedArgs.niceName, fdsToClose, fdsToIgnore, parsedArgs.startChildZygote,parsedArgs.instructionSet, parsedArgs.appDataDir);/// 略......try {// pid == 0 代表子进程if (pid == 0) {// in childzygoteServer.setForkChild();zygoteServer.closeServerSocket();IoUtils.closeQuietly(serverPipeFd);serverPipeFd = null;// handleChildProc 内部会关闭 socket 后执行 ZygoteInit.zygoteInit() 函数return handleChildProc(parsedArgs, descriptors, childPipeFd,parsedArgs.startChildZygote);} else {return null;}} finally {}
}
ZygoteInit.zygoteInit() 函数如下
public static final Runnable zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) {if (RuntimeInit.DEBUG) {Slog.d(RuntimeInit.TAG, "RuntimeInit: Starting application from zygote");}Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ZygoteInit");RuntimeInit.redirectLogStreams();// 做一些常规的初始化RuntimeInit.commonInit();ZygoteInit.nativeZygoteInit();return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);}
- ZygoteInit.nativeZygoteInit();
这个是 native 方法 private static final native void nativeZygoteInit(); 调用的是 AndroidRuntime.cpp中的方法
static void com_android_internal_os_ZygoteInit_nativeZygoteInit(JNIEnv* env, jobject clazz)
{gCurRuntime->onZygoteInit();
}
virtual void onZygoteInit(){sp<ProcessState> proc = ProcessState::self();ALOGV("App process: starting thread pool.\n");proc->startThreadPool();}
- ProcessState::self(); 函数
// ProcessState 这是一个单例
sp<ProcessState> ProcessState::self()
{Mutex::Autolock _l(gProcessMutex);if (gProcess != NULL) {return gProcess;}gProcess = new ProcessState("/dev/binder");return gProcess;
}
ProcessState::self() 函数创建了一个 ProcessState() 对象并传入了 “/dev/binder” 参数,然后看一下ProcessState构造函数。
ProcessState::ProcessState(const char *driver): mDriverName(String8(driver)), mDriverFD(open_driver(driver)), mVMStart(MAP_FAILED)// ...., mThreadPoolStarted(false), mThreadPoolSeq(1)
{if (mDriverFD >= 0) {// mmap the binder, providing a chunk of virtual address space to receive transactions.mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);if (mVMStart == MAP_FAILED) {// *sigh*ALOGE("Using %s failed: unable to mmap transaction memory.\n", mDriverName.c_str());close(mDriverFD);mDriverFD = -1;mDriverName.clear();}}LOG_ALWAYS_FATAL_IF(mDriverFD < 0, "Binder driver could not be opened. Terminating.");
}
上面方法主要有两个 第一个 定义了 mDriverFD(open_driver(driver)) ,通过open_driver() 赋值,open_driver() 就是打开 binder驱动,如果 mDriverFD > 0 则代表有效的,则通过 mmap 映射到对用的内存空间。所以启动binder机制是在进程启动之后初始化ProcessState中启动的
- onZygoteInit() 方法在打开 binder驱动之后会在调用 proc->startThreadPool(); 函数。线程池中只有一个线程,标记成binder线程,然后开启循环一直等待 binder 启动的操作指令进行执行命令。
总结问题
binder机制是如何启动的
- 打开 binder 驱动
- 映射内存分配缓冲区
- 注册binder线程
- 进入binder loop
Android 应用是如何启动 binder 机制的?相关推荐
- Android之最好理解的Binder机制
转载:http://weishu.me/2016/01/12/binder-index-for-newer/ Binder学习指南 发表于 2016-01-12 | 92条评论 | 3 ...
- Android进阶(六)Binder机制
一.进程通信 1.进程隔离: 进程隔离是为保护操作系统中进程互不干扰而设计的一组不同硬件和软件的技术.进程数据不共享,进程A的虚拟地址和进程B的虚拟地址不同,这样就防止进程A将数据信息写入进程B,保证 ...
- 牛笔了!干了5年Android开发还没掌握binder机制?完整PDF
前言 之前我有个学弟,应届毕业生,秋招拿了一些 offer,这几天非常纠结. offer 要考虑的因素太多了,盲目地搜索了几天,网上各种各样的声音都有,收获不多.为此咨询我一下,面对这种情况应该如何选 ...
- 膜拜大佬!干了5年Android开发还没掌握binder机制?终局之战
一.架构师专题 想要掌握复杂的技术,必须要理解其原理和架构.本模块结合实际一线互联网大型项目理解架构思维,抽丝剥茧,层层深入,帮助大家成为Android架构师,在思想上对架构认识有一次升华,并知其所以 ...
- Android Binder机制----实现自定义的系统服务
一.基于源码分析Binder机制: Binder机制是Android系统中实现跨进程通信(IPC)的一种重要机制.可以说,Binder机制在android系统中无处不在,所以,要研究android源码 ...
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
原文地址: http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder ...
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析(1)
在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路中,介绍了在Android系统中Binder进程间通信机 ...
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析(3)
Service Manager被唤醒之后,就进入while循环开始处理事务了.这里wait_for_proc_work等于1,并且proc->todo不为空,所以从proc->todo列表 ...
- 理解 Android 的 Binder 机制
Binder机制的工作流程 1.客户端获取服务端的代理对象(proxy).我们需要明确的是客户端进程并不能直接操作服务端中的方法,如果要操作服务端中的方法,那么有一个可行的解决方法就是在客户端建立一个 ...
- aidl使用_借助 AIDL 理解 Android Binder 机制——Binder 来龙去脉
AIDL 是 Android Interface Definition Language(Android 接口定义语言)的缩写,它是 Android 进程间通信的接口语言.由于 Android 系统的 ...
最新文章
- 鸿蒙系统画饼,任正非说在三年内华为鸿蒙系统即可媲美苹果!真的不是“画饼”?...
- 修改admin的Django站点管理标题
- thinkphp图片加载_标题栏ico展示
- 画春天的景色计算机教案,大班绘画春天来了教案
- Android 系统(91)---Android 平台调试
- 基于SpringBoot,来实现MySQL读写分离技术
- Pytorch forward()的简单理解与用法
- spring mvc 解决后台传递值乱码问题
- 在pcduino开发板上写驱动控制板载LED的闪烁
- LabWindows 读写 Excel
- CCF计算机职业资格认证系列一CCF软件能力认证
- mPEG2000-PHOS,磷酸盐修饰的单功能线性PEG,mPEG2000-Phosphate
- 研华运动控制卡接线图_ADVANTECH研华PCI-1245S运动控制卡4轴DSP架构脉冲型 步进/伺服电机SCARA控制通用PCI卡...
- 可见光通信 调制解调技术 家庭机器人 可见光通信应用 原理及硬件方案
- 2019年了,中国汽车行业还有多少黑洞?
- vmware虚拟机出现此电脑无法运行win11,虚拟机中安装win11系统教程
- 163企业邮箱注册申请,外贸企业邮箱首选什么邮箱呢?
- Windows经典播放器Winamp回归 功能界面迎来全新改革
- 【TCP/IP网络编程】(01):什么是网络编程
- 【十一、wordpress优化之六:CDN加速,以腾讯CDN为例】2021最详细wordpress博客建站教程(2021.03.03更新)