Android应用程序进程启动过程的源代码分析(3)

        Step 10. AppRuntime.onZygoteInit
        这个函数定义在frameworks/base/cmds/app_process/app_main.cpp文件中:
 
[cpp]  view plain copy
  1.  
    class AppRuntime : public AndroidRuntime  
  2. {  
  3.     ......  
  4.   
  5.  
        virtual void onZygoteInit()  
  6.     {  
  7.         sp<ProcessState> proc = ProcessState::self();  
  8.  
            if (proc->supportsProcesses()) {  
  9.  
                LOGV("App process: starting thread pool.\n");  
  10.             proc->startThreadPool();  
  11.         }  
  12.     }  
  13.   
  14.     ......  
  15. };  
        这里它就是调用ProcessState::startThreadPool启动线程池了,这个线程池中的线程就是用来和Binder驱动程序进行交互的了。
        Step 11. ProcessState.startThreadPool
        这个函数定义在frameworks/base/libs/binder/ProcessState.cpp文件中:
[cpp]  view plain copy
  1.  
    void ProcessState::startThreadPool()  
  2. {  
  3.     AutoMutex _l(mLock);  
  4.  
        if (!mThreadPoolStarted) {  
  5.  
            mThreadPoolStarted = true;  
  6.  
            spawnPooledThread(true);  
  7.     }  
  8. }  
        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文件中:
[cpp]  view plain copy
  1.  
    void ProcessState::spawnPooledThread(bool isMain)  
  2. {  
  3.  
        if (mThreadPoolStarted) {  
  4.         int32_t s = android_atomic_add(1, &mThreadPoolSeq);  
  5.  
            char buf[32];  
  6.  
            sprintf(buf, "Binder Thread #%d", s);  
  7.  
            LOGV("Spawning new pooled thread, name=%s\n", buf);  
  8.  
            sp<Thread> t = new PoolThread(isMain);  
  9.         t->run(buf);  
  10.     }  
  11. }  
        这里它会创建一个PoolThread线程类,然后执行它的run函数,最终就会执行PoolThread类的threadLoop函数了。
        Step 13. PoolThread.threadLoop
        这个函数定义在frameworks/base/libs/binder/ProcessState.cpp文件中:
[cpp]  view plain copy
  1.  
    class PoolThread : public Thread  
  2. {  
  3.  
    public:  
  4.  
        PoolThread(bool isMain)  
  5.         : mIsMain(isMain)  
  6.     {  
  7.     }  
  8.   
  9.  
    protected:  
  10.  
        virtual bool threadLoop()  
  11.     {  
  12.         IPCThreadState::self()->joinThreadPool(mIsMain);  
  13.  
            return false;  
  14.     }  
  15.   
  16.  
        const bool mIsMain;  
  17. };  
        这里它执行了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文件中:
[cpp]  view plain copy
  1.  
    void IPCThreadState::joinThreadPool(bool isMain)  
  2. {  
  3.     ......  
  4.   
  5.     mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);  
  6.   
  7.     ......  
  8.   
  9.     status_t result;  
  10.  
        do {  
  11.         int32_t cmd;  
  12.   
  13.         ......  
  14.   
  15.  
            // now get the next command to be processed, waiting if necessary  
  16.         result = talkWithDriver();  
  17.  
            if (result >= NO_ERROR) {  
  18.  
                size_t IN = mIn.dataAvail();  
  19.  
                if (IN < sizeof(int32_t)) continue;  
  20.             cmd = mIn.readInt32();  
  21.             ......  
  22.   
  23.             result = executeCommand(cmd);  
  24.         }  
  25.   
  26.         ......  
  27.  
        } while (result != -ECONNREFUSED && result != -EBADF);  
  28.   
  29.     ......  
  30.       
  31.     mOut.writeInt32(BC_EXIT_LOOPER);  
  32.  
        talkWithDriver(false);  
  33. }  
        这个函数首先告诉Binder驱动程序,这条线程要进入循环了:
[cpp]  view plain copy
  1.  
    mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);  
        然后在中间的while循环中通过talkWithDriver不断与Binder驱动程序进行交互,以便获得Client端的进程间调用:
[cpp]  view plain copy
  1.  
    result = talkWithDriver();  
        获得了Client端的进程间调用后,就调用excuteCommand函数来处理这个请求:
[cpp]  view plain copy
  1.  
    result = executeCommand(cmd);  
        最后,线程退出时,也会告诉Binder驱动程序,它退出了,这样Binder驱动程序就不会再在Client端的进程间调用分发给它了:
[cpp]  view plain copy
  1.  
    mOut.writeInt32(BC_EXIT_LOOPER);  
  2.  
    talkWithDriver(false);  
        我们再来看看talkWithDriver函数的实现。
 
 

你可能感兴趣的:(android,应用程序,启动过程,源代码分析)