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");
-
proc->startThreadPool();
-
}
-
}
-
-
......
-
};
这里它就是调用ProcessState::startThreadPool启动线程池了,这个线程池中的线程就是用来和Binder驱动程序进行交互的了。
Step 11. ProcessState.startThreadPool
这个函数定义在frameworks/base/libs/binder/ProcessState.cpp文件中:
Step 11. ProcessState.startThreadPool
这个函数定义在frameworks/base/libs/binder/ProcessState.cpp文件中:
-
void ProcessState::startThreadPool()
-
{
-
AutoMutex _l(mLock);
-
if (!mThreadPoolStarted) {
-
mThreadPoolStarted = true;
-
spawnPooledThread(true);
-
}
-
}
ProcessState类是Binder进程间通信机制的一个基础组件,它的作用可以参考
浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
、
Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
和
Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析
这三篇文章。这里它调用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);
-
char buf[32];
-
sprintf(buf, "Binder Thread #%d", s);
-
LOGV("Spawning new pooled thread, name=%s\n", buf);
-
sp<Thread> t = new PoolThread(isMain);
-
t->run(buf);
-
}
-
}
这里它会创建一个PoolThread线程类,然后执行它的run函数,最终就会执行PoolThread类的threadLoop函数了。
Step 13. PoolThread.threadLoop
这个函数定义在frameworks/base/libs/binder/ProcessState.cpp文件中:
-
class PoolThread : public Thread
-
{
-
public:
-
PoolThread(bool isMain)
-
: mIsMain(isMain)
-
{
-
}
-
-
protected:
-
virtual bool threadLoop()
-
{
-
IPCThreadState::self()->joinThreadPool(mIsMain);
-
return false;
-
}
-
-
const bool mIsMain;
-
};
这里它执行了IPCThreadState::joinThreadPool函数进一步处理。IPCThreadState也是Binder进程间通信机制的一个基础组件,它的作用可以参考
浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
、
Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
和
Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析
这三篇文章。
Step 14. IPCThreadState.joinThreadPool
这个函数定义在frameworks/base/libs/binder/IPCThreadState.cpp文件中:
-
void IPCThreadState::joinThreadPool(bool isMain)
-
{
-
......
-
-
mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);
-
-
......
-
-
status_t result;
-
do {
-
int32_t cmd;
-
-
......
-
-
// now get the next command to be processed, waiting if necessary
-
result = talkWithDriver();
-
if (result >= NO_ERROR) {
-
size_t IN = mIn.dataAvail();
-
if (IN < sizeof(int32_t)) continue;
-
cmd = mIn.readInt32();
-
......
-
-
result = executeCommand(cmd);
-
}
-
-
......
-
} while (result != -ECONNREFUSED && result != -EBADF);
-
-
......
-
-
mOut.writeInt32(BC_EXIT_LOOPER);
-
talkWithDriver(false);
-
}
这个函数首先告诉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(false);
我们再来看看talkWithDriver函数的实现。
本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966508,如需转载请自行联系原作者