当前位置: 首页 > news >正文

Android中应用进程中Binder创建机制

一、Zygote Fork 与 Binder 线程池创建机制

1. Zygote Fork 子进程时传递了什么?
  • 继承资源

    • /dev/binder 设备文件的文件描述符 (FD):这是进程进行 Binder IPC 的底层通道(由 Linux 内核的 Binder 驱动提供)。

    • 预加载的 Binder 相关库:如 libbinder.so(包含 ProcessStateIPCThreadState 等关键类)。

  • 未继承的资源

    • Binder 线程池本身:Zygote 自身的 Binder 线程池 不会 被复制到子进程。

    • 活跃的 Binder 线程:子进程启动时没有现成的 Binder 线程。

2. Binder 线程池何时创建?

首次 Binder IPC 请求触发创建!
当子进程(应用进程)第一次收到或发起 Binder 调用时,系统会动态初始化 Binder 线程池:

3. 关键代码流程(Native层)
步骤关键类/方法说明
1. 应用进程启动App_main.cpp: main()进程入口,调用AndroidRuntime
2. 初始化JVMAndroidRuntime::start()启动Java虚拟机
3. 初始化Binder基础ProcessState::self()->startThreadPool()创建Binder主线程,但此时线程池尚未扩展
4. 首次收到Binder调用IPCThreadState::joinThreadPool()线程进入Binder循环
5. 驱动命令触发线程创建IPCThreadState::executeCommand(BR_SPAWN_LOOPER)收到BR_SPAWN_LOOPER后,创建新Binder线程
6. 新线程加入线程池ProcessState::spawnPooledThread(true)线程池扩展至默认上限(16线程)

二、 ApplicationThread 如何与 Binder 线程池关联?

  1. 创建时机
    ActivityThread 在 attach() 方法中创建 ApplicationThread 实例:

    final ApplicationThread mAppThread = new ApplicationThread();
  2. 注册到AMS
    ActivityManager.getService().attachApplication(mAppThread) 将 ApplicationThread 的 Binder 对象传递给 AMS。

  3. IPC 请求处理
    当 AMS 调用 ApplicationThread.scheduleLaunchActivity() 时:

    • 执行线程:Binder 驱动从应用进程的 Binder 线程池中随机选择一个空闲线程处理该调用。

    • 线程切换:此时代码运行在 Binder 线程(非主线程),需通过 mH(Handler) 将消息转发到主线程。


三、总结

Q:Zygote fork 子进程时会创建 Binder 线程池吗?ApplicationThread 在哪个线程运行?

A

  1. Zygote fork 时 不创建 Binder 线程池

    • 子进程继承的是 Binder 通信的底层能力(如 /dev/binder 的文件描述符和预加载的库)。

    • 真正的 Binder 线程池是在首次收到 Binder IPC 请求时动态创建的(由 Binder 驱动发送 BR_SPAWN_LOOPER 命令触发)。

  2. ApplicationThread 的运行线程

    • 它是 ActivityThread 的内部 Binder 对象。

    • 实际执行代码在 Binder 线程池的随机线程中(非主线程),通过 Handler 将任务转发到主线程执行。

  3. 设计意义

    • 懒加载优化:避免进程启动时立即创建16个线程浪费资源。

    • 动态扩展:根据 IPC 压力自动增减线程(上限16个)。

    • 线程隔离:确保系统服务调用不阻塞主线程。

  4. ApplicationThread 在 Binder 线程池中运行吗?

    需要区分对象和执行上下文:

    1. ApplicationThread 对象本身是 ActivityThread 的成员,存在于 Java 堆中,不属于特定线程。

    2. 但它的 Binder 接口方法(如 scheduleLaunchActivity)在被 AMS 调用时:

      • 由系统从 Binder 线程池中动态分配一个空闲线程执行

      • 该线程负责解析 IPC 数据并转发任务到主线程


四、核心机制对比表

阶段Binder线程池状态关键事件
Zygote fork 完成时未创建仅持有 /dev/binder FD
进程首次接收IPC请求创建主线程收到 BR_SPAWN_LOOPER 命令
后续IPC请求增多动态创建新线程(≤16个)由Binder驱动自动调度
ApplicationThread调用由Binder线程池的线程执行通过Handler转发到主线程

http://www.xdnf.cn/news/1203463.html

相关文章:

  • VUE2 学习笔记11 脚手架
  • 从0到500账号管理:亚矩阵云手机多开组队与虚拟定位实战指南
  • 数据结构之顺序表链表栈
  • 分享一个脚本,从mysql导出数据csv到hdfs临时目录
  • CFIHL: 水培生菜的多种叶绿素 a 荧光瞬态图像数据集
  • 雷达系统设计学习:自制6GHz FMCW Radar
  • 深入解析 Spring 获取 XML 验证模式的过程
  • 可以组成网络的服务器 - 华为OD统一考试(JavaScript 题解)
  • 速度革命 Kingston FURY PCIe 5.0 NVMe装机体验
  • 第四章:分析 Redis 性能高原因和核心字符串类型命令
  • 15-C语言:第15天笔记
  • Nginx 四层(stream)反向代理 + DNS 负载均衡
  • Java面试深度剖析:从JVM到云原生的技术演进
  • JVM 内存共享区域详解
  • 解决cordova编译安卓提示Cloud not find XXXX.aar
  • windows内核研究(异常-CPU异常记录)
  • C++ 内存管理
  • 图像轮廓与凸包
  • 数据赋能(345)——数据整合——全面集成原则
  • 《 服务注册发现原理:从 Eureka 到 Nacos 的演进》
  • Vue、微信小程序、Uniapp 面试题整理最新整合版
  • 博士申请 | 荷兰阿姆斯特丹大学 招收计算机视觉(CV)方向 全奖博士生
  • JAVA后端开发——用 Spring Boot 实现定时任务
  • Spring与SpringBoot:从手动挡到自动挡的Java开发进化论
  • JAVA:Spring Boot 集成 Protobuf 的技术指南
  • Office-PowerPoint-MCP-Server – 基于MCP的开源PPT生成与编辑工具
  • 基于AFLFast的fuzz自动化漏洞挖掘(1)
  • 【Linux系统】Ext2文件系统 | 软硬链接
  • 6种将iPhone照片传输到Windows 10电脑的方法
  • 最小二乘法拟合椭圆