本文共 2695 字,大约阅读时间需要 8 分钟。
Step 10. AppRuntime.onZygoteInit 这个函数定义在frameworks/base/cmds/app_process/app_main.cpp文件中: -
class AppRuntime : public AndroidRuntime -
-
-
-
virtual void onZygoteInit() -
-
sp<ProcessState> proc = ProcessState::self(); -
if (proc->supportsProcesses()) { -
LOGV("App process: starting thread pool.\n"); -
-
-
-
-
-
这里它就是调用ProcessState::startThreadPool启动线程池了,这个线程池中的线程就是用来和Binder驱动程序进行交互的了。
Step 11. ProcessState.startThreadPool
这个函数定义在frameworks/base/libs/binder/ProcessState.cpp文件中: -
void ProcessState::startThreadPool() -
-
-
if (!mThreadPoolStarted) { -
mThreadPoolStarted = true; -
-
-
ProcessState类是Binder进程间通信机制的一个基础组件,它的作用可以参考 、 和 这三篇文章。这里它调用spawnPooledThread函数进一步处理。 Step 12. ProcessState.spawnPooledThread 这个函数定义在frameworks/base/libs/binder/ProcessState.cpp文件中: -
void ProcessState::spawnPooledThread(bool isMain) -
-
if (mThreadPoolStarted) { -
int32_t s = android_atomic_add(1, &mThreadPoolSeq); -
-
sprintf(buf, "Binder Thread #%d", s); -
LOGV("Spawning new pooled thread, name=%s\n", buf); -
sp<Thread> t = new PoolThread(isMain); -
-
-
这里它会创建一个PoolThread线程类,然后执行它的run函数,最终就会执行PoolThread类的threadLoop函数了。 Step 13. PoolThread.threadLoop 这个函数定义在frameworks/base/libs/binder/ProcessState.cpp文件中: -
class PoolThread : public Thread -
-
-
-
-
-
-
-
-
virtual bool threadLoop() -
-
IPCThreadState::self()->joinThreadPool(mIsMain); -
-
-
-
-
这里它执行了IPCThreadState::joinThreadPool函数进一步处理。IPCThreadState也是Binder进程间通信机制的一个基础组件,它的作用可以参考 、 和 这三篇文章。 Step 14. IPCThreadState.joinThreadPool 这个函数定义在frameworks/base/libs/binder/IPCThreadState.cpp文件中: -
void IPCThreadState::joinThreadPool(bool isMain) -
-
-
-
mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER); -
-
-
-
-
-
-
-
-
-
-
result = talkWithDriver(); -
if (result >= NO_ERROR) { -
size_t IN = mIn.dataAvail(); -
if (IN < sizeof(int32_t)) continue; -
-
-
-
result = executeCommand(cmd); -
-
-
-
} while (result != -ECONNREFUSED && result != -EBADF); -
-
-
-
mOut.writeInt32(BC_EXIT_LOOPER); -
-
这个函数首先告诉Binder驱动程序,这条线程要进入循环了: -
mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);
然后在中间的while循环中通过talkWithDriver不断与Binder驱动程序进行交互,以便获得Client端的进程间调用: -
result = talkWithDriver();
获得了Client端的进程间调用后,就调用excuteCommand函数来处理这个请求: -
result = executeCommand(cmd);
最后,线程退出时,也会告诉Binder驱动程序,它退出了,这样Binder驱动程序就不会再在Client端的进程间调用分发给它了: -
mOut.writeInt32(BC_EXIT_LOOPER); -
我们再来看看talkWithDriver函数的实现。 转载地址:http://kuuwl.baihongyu.com/