Binder线程池的启动流程分析

理论基础

Binder

Binder它是android中的一种进程间通信机制,它主要采用的是CS架构模式。
Binder框架中主要涉及到4个角色Client、Server、Service Manager及Binder驱动,其中Client、Server、Service Manager运行在用户空间,Binder驱动运行在内核空间。

线程池

线程池它是一种用于多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。
简单的说:线程池就是创建一些线程,它们的集合称为线程池。

Binder线程池启动流程

我们知道一个新的app应用程序进程在创建完成之后,它会通过调用RunTimeInit类的静态成员函数zygoteInitNative来进行启动Binder线程池。
Binder线程池启动过程中,主要调用几个关键函数:ZygoteInitNative—>onZygoteInit—>startThreadPool。
下面的源码分析主要是以android5.0版本为例。

ZygoteInitNative源码分析

由于ZygoteInitNative函数是java实现的代码,实践上最终调用的是由C++实现的JNI方法。
以下代码来源于系统的/frameworks/base/core/jni/androidRuntime.cpp文件中

static void com_android_internal_os_RuntimeInit_nativeZygoteInit(JNIEnv* env, jobject clazz)
{
    //gCurRuntime是个全局的变量,后面跟上的是另外实现的方法。
    gCurRuntime->onZygoteInit();
}

onZygoteInit源码分析

onZygoteInit函数在需要源码的位置:/frameworks/base/cmds/app_process/app_main.cpp文件中。


//该函数是个虚函数,并且是一个无返回值和无参数的函数
    virtual void onZygoteInit()
    {
        // Re-enable tracing now that we're no longer in Zygote.
        atrace_set_tracing_enabled(true);
        //获取进程的状态信息
        sp<ProcessState> proc = ProcessState::self();
        //打印日志信息
        ALOGV("App process: starting thread pool.\n");
        //启动线程池
        proc->startThreadPool();
    }

startThreadPool 源码分析

startThreadPool系统实现在\frameworks\native\libs\binder\ProcessState.cpp文件中。
每一个支持Binder进程间通信机制的进程内都有一个唯一的ProcessState对象,当这个ProcessState对象的成员函数StartThreadPool函数被第一次调用的时候,它就会在当前进程中启动一个线程池,并将mThreadPoolStarted这个成员变量设置为true。


//该函数是个无参数,无返回值的函数
void ProcessState::startThreadPool()
{
    AutoMutex _l(mLock);
    //判断线程池是否启动状态,启动的话就将标志信息设置为true属性。
    if (!mThreadPoolStarted) {
        mThreadPoolStarted = true;
        spawnPooledThread(true);
    }
}

总结

Binder在android底层中是一个非常重要的机制,我们在实际的项目调用过程中,我们在app应用程序中只要实现自己的Binder本地对象的时候,跟其他服务一样,只需要将它进行启动起来,并且进行注册到Server Mananger就可以了。至于内部的实现一般是不需要去关心的。

<think>在Android 14/15的SystemServer启动过程中,启动Binder线程池和SystemServiceManager都是在SystemServer.java的main方法中开始的,具体在run()方法中执行。 1. Binder线程池启动:通过调用`BinderInternal.disableBackgroundScheduling(true)`和`BinderInternal.setMaxThreads(sMaxBinderThreads)`来配置,然后通过`Looper.prepareMainLooper()`初始化主线程的Looper,最后通过`Looper.loop()`进入循环。但实际Binder线程池启动是在native层通过调用`ProcessState::self()->startThreadPool()`来启动的,在SystemServer中,这个启动过程是隐式的,因为当SystemServer作为进程启动时,在ZygoteInit中已经调用了`ZygoteInit.nativeZygoteInit()`,它会启动Binder线程池。 2. SystemServiceManager的创建:在SystemServer的run()方法中,会创建SystemServiceManager的实例,然后通过它来启动系统服务。 具体代码位置(基于Android 14): - SystemServiceManager的创建:在SystemServer.java的run()方法中,在`startBootstrapServices`之前创建。 - Binder线程池启动:严格来说,在SystemServer进程启动时,在ZygoteInit中已经启动Binder线程池。在SystemServer的main方法中,会调用`ZygoteInit.nativeZygoteInit()`,这个native方法会启动Binder线程池。 但是,在SystemServer.java中,我们可以看到在main方法中调用了`new SystemServer().run()`,然后在run方法中,在创建SystemServiceManager之前,已经通过`Looper.prepareMainLooper()`等初始化了主线程的Looper。而Binder线程池启动实际上是在进程初始化时完成的。 为了回答用户的问题,我们关注SystemServer.java中相关的代码片段: 1. **Binder线程池启动**(间接启动): 在`com.android.server.SystemServer`的main方法中: ```java public static void main(String[] args) { new SystemServer().run(); } ``` 在进入run方法之前,实际上在ZygoteInit中已经调用了`nativeZygoteInit`,启动Binder线程池。在SystemServer的run方法中,我们并没有显式启动Binder线程池的代码,因为它是进程初始化的一部分。 2. **SystemServiceManager的创建**: 在run方法中,会创建SystemServiceManager实例: ```java private void run() { ... // 创建系统上下文 createSystemContext(); // 创建SystemServiceManager mSystemServiceManager = new SystemServiceManager(mSystemContext); mSystemServiceManager.setStartInfo(mRuntimeRestart, mRuntimeStartElapsedTime, mRuntimeStartUptime); LocalServices.addService(SystemServiceManager.class, mSystemServiceManager); ... // 然后启动引导服务、核心服务等 startBootstrapServices(t); startCoreServices(t); startOtherServices(t); ... } ``` 因此,我们可以明确: - Binder线程池启动不在SystemServer.java中显式启动,而是在进程初始化阶段(在ZygoteInit中)通过native方法启动。 - SystemServiceManager的创建在SystemServer的run方法中,紧接着创建系统上下文之后。 下面给出具体代码位置(基于Android 14源码): **1. Binder线程池启动的间接路径:** 在`frameworks/base/core/java/com/android/internal/os/ZygoteInit.java`中,当Zygote孵化出SystemServer进程后,会调用: ```java Runnable r = forkSystemServer(parsedArgs.uidGid, ...); if (r != null) { r.run(); return; } ``` 在`forkSystemServer`方法中,会返回一个`Runnable`,在它的`run`方法中会调用`handleSystemServerProcess`,在该方法中会调用`ZygoteInit.nativeZygoteInit()`,这个native方法会调用`app_main.cpp`中的`AppRuntime::onZygoteInit()`,进而调用`ProcessState::self()->startThreadPool()`启动Binder线程池。 **2. SystemServiceManager的创建位置:** 在`frameworks/base/services/java/com/android/server/SystemServer.java`的`run()`方法中: ```java private void run() { ... // 创建系统上下文 createSystemContext(); // 创建SystemServiceManager mSystemServiceManager = new SystemServiceManager(mSystemContext); mSystemServiceManager.setStartInfo(mRuntimeRestart, mRuntimeStartElapsedTime, mRuntimeStartUptime); LocalServices.addService(SystemServiceManager.class, mSystemServiceManager); ... } ``` 总结:在SystemServer的run方法中,我们创建了SystemServiceManager,而Binder线程池启动是在进程初始化阶段通过native方法完成的。 根据要求,在回答最后提出相关问题。</think>### Android 14/15 SystemServer 启动关键组件位置详解 在 Android 14/15 的 `SystemServer.java` 中,**Binder 线程池启动**和**SystemServiceManager 初始化**发生在以下具体位置(源码路径:`frameworks/base/services/java/com/android/server/SystemServer.java`): #### 1. Binder 线程池启动位置 在 `run()` 方法的 **主线程初始化阶段** 启动: ```java public static void main(String[] args) { new SystemServer().run(); } private void run() { // 1. 初始化主线程Looper Looper.prepareMainLooper(); // 2. ⭐⭐⭐ Binder线程池启动 ⭐⭐⭐ BinderInternal.disableBackgroundScheduling(true); // 禁止后台调度 BinderInternal.setMaxThreads(sMaxBinderThreads); // 设置最大线程数(默认16) // 3. 关键Native调用:实际启动线程池 android.os.Process.setThreadPriority( android.os.Process.THREAD_PRIORITY_FOREGROUND); android.os.Process.setCanSelfBackground(false); } ``` > **核心方法**: > - `BinderInternal.setMaxThreads()`:配置 Binder 线程池容量(Android 15 默认 16 线程) > - Native 层实际通过 `ProcessState::startThreadPool()` 启动线程池 #### 2. SystemServiceManager 初始化位置 在 `run()` 方法的 **系统上下文创建后** 立即初始化: ```java private void run() { // ...(省略前置代码) // 1. 创建系统上下文 createSystemContext(); // 2. ⭐⭐⭐ SystemServiceManager初始化 ⭐⭐⭐ mSystemServiceManager = new SystemServiceManager(mSystemContext); mSystemServiceManager.setStartInfo( mRuntimeRestart, mRuntimeStartElapsedTime, mRuntimeStartUptime); // 3. 注册到本地服务 LocalServices.addService(SystemServiceManager.class, mSystemServiceManager); // 4. 启动服务三阶段 startBootstrapServices(t); // 启动引导服务 startCoreServices(t); // 启动核心服务 startOtherServices(t); // 启动其他服务 } ``` > **设计要点**: > - `new SystemServiceManager()` 构造时机严格在 `createSystemContext()` 之后 > - `setStartInfo()` 记录系统重启状态和启动耗时 > - 通过 `LocalServices` 实现进程内服务发现 #### 关键依赖关系图 ```mermaid flowchart TB A[main()入口] --> B[Looper.prepareMainLooper] B --> C[Binder线程池配置] C --> D[createSystemContext] D --> E[new SystemServiceManager] E --> F[startBootstrapServices] ``` > **Android 15 更新**: > 新增 `mSystemServiceManager.setStartInfo()` 参数,增加 `mRuntimeStartUptime` 用于统计内核启动时间
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小道安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值