Android 应用是如何启动 binder 机制的?

article/2025/10/28 21:48:58

文章目录

    • 应用是什么时候支持 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

http://chatgpt.dhexx.cn/article/RWOeaqgK.shtml

相关文章

Android Binder机制介绍

转载于&#xff1a;http://www.cnblogs.com/zc9527/p/5638688.html 备注&#xff1a;该博客简单介绍类型的 做过Android开发的同学可能有些体会&#xff0c;入门初期&#xff0c;工作内容主要是实现各式各样的UI界面&#xff0c;以及实现应用的业务逻辑。在这个阶段&#xff0c…

Android跨进程通信Binder机制与AIDL实例

文章目录 进程通信1.1 进程空间划分1.2 跨进程通信IPC1.3 Linux跨进程通信1.4 Android进程通信 Binder跨进程通信2.1 Binder简介2.2 Binder驱动2.3 Binder原理 AIDL编程Demo3.1 服务端3.2 客户端 在操作系统中&#xff0c;进程与进程间的内存和数据都是不共享的。这样做的目的&…

Android-Binder机制

Binder机制是什么&#xff1a; Binder机制是​ Android系统中进程间通讯&#xff08;IPC&#xff09;的一种方式&#xff0c;Android中ContentProvider、Intent、aidl都是基于Binder。 为什么要用Binder机制&#xff1a; 在提及Binder之前&#xff0c;我们先看看我们平时开发…

深入理解Binder机制

Binder框架 Binder是什么 1.Binder是一种进程间通信机制&#xff1b; 2.Binder是一个虚拟物理设备驱动&#xff1b; 3.Binder是一个能发起通信的Java类&#xff1b; Binder与传统IPC对比 Binder共享内存Socket性能内存拷贝一次无需拷贝内存拷贝两次特点基于C/S架构 易用性高…

Android Binder机制原理

一 Android与Linux通信机制的比较 虽然Android继承使用Linux的内核&#xff0c;但Linux与Android的通信机制不同。 在Linux中使用的IPC通信机制如下&#xff1a; 1.管道&#xff08;Pipe&#xff09;&#xff1a;点对点通信&#xff0c;因为采用存储转发方式&#xff0c;需要拷…

Android——Binder机制

1.简介 Binder是什么&#xff1f; 机制&#xff1a;Binder是一种进程间通信的机制 驱动&#xff1a;Binder是一个虚拟物理设备驱动 应用层&#xff1a;Binder是一个能发起进程间通信的JAVA类 Binder就是Android中的血管&#xff0c;在Android中我们使用Activity,Service等组…

Android Binder机制之一(简介)

目录 前言 一、Android 进程间通信方式 二、Binder架构图 三、Binder涉及角色 3.1 Binder驱动 3.2 Binder实体 3.3 Binder引用 3.4 远程服务 3.5 ServiceManager守护进程 四、涉及源码 前言 这是本人第N次看Binder 相关知识了&#xff0c;其实每次看都有新的收获&…

binder机制原理android,Binder机制1---Binder原理介绍

1.Binder通信机制介绍 这篇文章会先对比Binder机制与Linux的通信机制的差别&#xff0c;了解为什么Android会另起炉灶&#xff0c;采用Binder。接着&#xff0c;会根据 Binder的机制&#xff0c;去理解什么是Service Manager&#xff0c;在C/S模型中扮演什么角色。最后&#x…

理解Binder机制

前言 ​ Android中Binder机制的重要性不言而喻&#xff0c;从IPC角度来看&#xff0c; Binder是一种跨进程通信方式&#xff0c;Binder也可以理解为一种虚拟的物理设备&#xff0c;它的设备驱动是/dev/binder&#xff1b;从Android framework角度来说&#xff0c;Binder是Serv…

Android--Binder机制

Android--Binder机制 1.简介 Binder是什么&#xff1f; 机制&#xff1a;Binder是一种进程间通信的机制 驱动&#xff1a;Binder是一个虚拟物理设备驱动 应用层&#xff1a;Binder是一个能发起进程间通信的JAVA类 Binder就是Android中的血管&#xff0c;在Android中我们使用…

Binder 机制

Binder 是 Android 系统进程间通信&#xff08;IPC&#xff1a;Internet Process Connection&#xff09;方式之一。Linux 已经拥有的 IPC 手段包括&#xff1a; 管道&#xff08;Pipe&#xff09;、信号&#xff08;Signal&#xff09;、跟踪&#xff08;Trace&#xff09;、插…

Android Binder机制

Android Binder机制 什么是BinderBinder一般的IPC原理动态内核可加载模块内存映射运行机制四大角色注册服务使用服务 对象的传递Binder通信 什么是Binder 要理解binder&#xff0c;先要知道IPC&#xff0c;Inter-process communication ,也就是进程中相互通信&#xff0c;Bind…

Binder机制

直观来讲&#xff0c;Binder是Android中的一个类&#xff0c;它实现了IBinder接口。从IPC角度来看&#xff0c;Binder是Android中一种跨进程通信方式&#xff0c;Binder还可以理解为一种虚拟的物理设备&#xff0c;它的设备驱动是/dev/binder&#xff0c;该通信方式在Linux中没…

Binder机制原理

前言 本篇文章记录本人对Binder的学习&#xff0c;因为本人能力有限&#xff0c;若有错误&#xff0c;还请批评指正。 binder的使用文章推荐 1.Binder是什么&#xff1f; 可以理解是为Android的血管。是一种进程间通信的机制。比如Activity&#xff0c;Service需要和AMS通信…

Binder机制(非常好理解)

Binder是一种进程间通信机制&#xff0c;用来实现不同进程之间的通信。 Binder机制主要由四大块组成&#xff0c;分别是客户空间的client、server&#xff0c;serverManager&#xff0c;还有内核的Binder驱动。 下面我先看下图&#xff0c;利于理解Binder内部工作机制&#x…

Android进程间通信之一:Binder机制学习

Binder机制学习 Binder驱动Binder核心APILinux 使用两级保护机制&#xff1a;0 级供系统内核使用&#xff0c;3 级供用户程序使用。 Linux 下的传统 IPC 通信原理Linux 下的传统 IPC 通信原理Binder通信过程ServiceManager进程启动MMAP Binder驱动 binder驱动在以misc设备进行注…

Android跨进程通信:图文详解 Binder机制 原理

前言 如果你接触过 跨进程通信 &#xff08;IPC&#xff09;&#xff0c;那么你对Binder一定不陌生虽然 网上有很多介绍 Binder的文章&#xff0c;可是存在一些问题&#xff1a;浅显的讨论Binder机制 或 一味讲解 Binder源码、逻辑不清楚&#xff0c;最终导致的是读者们还是无…

操作系统实验五--存储管理

文章目录 操作系统实验五--存储管理一、实验目的二、实验内容三、设计原理及相关算法四、结果分析五、源代码 操作系统实验五–存储管理 一、实验目的 1、了解虚拟存储技术的特点&#xff0c;掌握请求页式存储管理的主要页面置换算法原理。 2、掌握请求页式存储管理中页面置…

操作系统实验—存储管理

操作系统实验—存储管理 所有实验源码&#xff1a; gitee&#xff1a;https://gitee.com/infiniteStars/os-project github&#xff1a;https://github.com/helloworldzsq/OSproject 1.实验内容 设计一个虚拟存储区和内存工作区&#xff0c;并使用下述方法计算访问命中率。 ①…

操作系统实验——磁盘调度算法

文章目录 前言一、实验目的二、实验内容和要求三、实验程序四、运行结果运行结果截图 五、思考和分析程序实现(思路)&#xff1a;分析几种算法&#xff1a; 附 前言 提示&#xff1a;本次实验在Linux(Ubuntu)中运行&#xff0c;程序中读取的文件需放在与c文件同一个文件夹中&a…