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. }  
 
        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函数的实现。






本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966508,如需转载请自行联系原作者
目录
相关文章
|
12天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
21天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
45 15
Android 系统缓存扫描与清理方法分析
|
8天前
|
运维 JavaScript jenkins
鸿蒙5.0版开发:分析CppCrash(进程崩溃)
在HarmonyOS 5.0中,CppCrash指C/C++运行时崩溃,常见原因包括空指针、数组越界等。系统提供基于posix信号机制的异常检测能力,生成详细日志辅助定位。本文详解CppCrash分析方法,涵盖异常检测、问题定位思路及案例分析。
29 4
|
8天前
|
运维 监控 JavaScript
鸿蒙next版开发:分析JS Crash(进程崩溃)
在HarmonyOS 5.0中,JS Crash指未处理的JavaScript异常导致应用意外退出。本文详细介绍如何分析JS Crash,包括异常捕获、日志分析和典型案例,帮助开发者定位问题、修复错误,提升应用稳定性。通过DevEco Studio收集日志,结合HiChecker工具,有效解决JS Crash问题。
25 4
|
1月前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
|
2月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
136 3
|
1月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。
|
1月前
|
NoSQL Linux 程序员
进程管理与运行分析
进程管理与运行分析
23 0
|
2月前
|
并行计算 API 调度
探索Python中的并发编程:线程与进程的对比分析
【9月更文挑战第21天】本文深入探讨了Python中并发编程的核心概念,通过直观的代码示例和清晰的逻辑推理,引导读者理解线程与进程在解决并发问题时的不同应用场景。我们将从基础理论出发,逐步过渡到实际案例分析,旨在揭示Python并发模型的内在机制,并比较它们在执行效率、资源占用和适用场景方面的差异。文章不仅适合初学者构建并发编程的基础认识,同时也为有经验的开发者提供深度思考的视角。
|
Android开发
Android源代码下载与编译 - 2019
Android源代码的下载和编译 2019版
8764 0

相关实验场景

更多