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,如需转载请自行联系原作者
目录
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1398 4
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
12月前
|
弹性计算 运维 监控
基于进程热点分析与系统资源优化的智能运维实践
智能服务器管理平台提供直观的可视化界面,助力高效操作系统管理。核心功能包括运维监控、智能助手和扩展插件管理,支持系统健康监控、故障诊断等,确保集群稳定运行。首次使用需激活服务并安装管控组件。平台还提供进程热点追踪、性能观测与优化建议,帮助开发人员快速识别和解决性能瓶颈。定期分析和多维度监控可提前预警潜在问题,保障系统长期稳定运行。
512 17
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
941 21
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
251 8
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
528 4
|
运维 JavaScript jenkins
鸿蒙5.0版开发:分析CppCrash(进程崩溃)
在HarmonyOS 5.0中,CppCrash指C/C++运行时崩溃,常见原因包括空指针、数组越界等。系统提供基于posix信号机制的异常检测能力,生成详细日志辅助定位。本文详解CppCrash分析方法,涵盖异常检测、问题定位思路及案例分析。
566 4
|
运维 监控 JavaScript
鸿蒙next版开发:分析JS Crash(进程崩溃)
在HarmonyOS 5.0中,JS Crash指未处理的JavaScript异常导致应用意外退出。本文详细介绍如何分析JS Crash,包括异常捕获、日志分析和典型案例,帮助开发者定位问题、修复错误,提升应用稳定性。通过DevEco Studio收集日志,结合HiChecker工具,有效解决JS Crash问题。
659 4
|
5月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
792 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
5月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
695 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡