`
daojin
  • 浏览: 690430 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

android核心机制之Zygote启动流程

 
阅读更多

1.先说一下android中的服务,一种是系统服务,系统服务通过getSystemService方法获得,所有的系统服务运行在一个进程中.

 

2.还有一种是自定义Service,也就是通过startService启动. 这种服务是单独一个进程.

 

Zygote实际上是一个进程繁殖器,通过socket的select模型进行繁殖.类似命令的方式来进行Fork.

下面绘制了其流程图.

 

可以看到:

启动完ServiceManager后,启动Zygote和SystemServer进程。

1.Zygote服务实际上是一种Select服务模型.

2.为了启动java代码,进行了一次androidRuntime的打开和关闭.

3.启动的SystemServer进程,此进程启动了一个线程注册了很多服务之后,开启了手机的HOME(也就是桌面),然后开始服务循环.(注意:此服务是Binder服务,Binder服务一启动就是俩线程。可能是因为是两个CPU吧。

代码如下:

4.Zygote进入select循环系统,开始服务.

5.此服务是很简单的,而且是通用的服务代码。(也就是取数据,传输数据,与SOCKET有些类似)。上层必须基于此服务原型来写相应的代码。

 

ProcessState::self()->startThreadPool();//启动一个。
IPCThreadState::self()->joinThreadPool();//把此线程也加入。

 

    case BR_TRANSACTION:
        {
            binder_transaction_data tr;
            result = mIn.read(&tr, sizeof(tr));
            LOG_ASSERT(result == NO_ERROR,
                "Not enough command data for brTRANSACTION");
            if (result != NO_ERROR) break;
            
            Parcel buffer;
            buffer.ipcSetDataReference(
                reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
                tr.data_size,
                reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
                tr.offsets_size/sizeof(size_t), freeBuffer, this);
            
            const pid_t origPid = mCallingPid;
            const uid_t origUid = mCallingUid;
            
            mCallingPid = tr.sender_pid;
            mCallingUid = tr.sender_euid;
            
            int curPrio = getpriority(PRIO_PROCESS, mMyThreadId);
            if (gDisableBackgroundScheduling) {
                if (curPrio > ANDROID_PRIORITY_NORMAL) {
                    // We have inherited a reduced priority from the caller, but do not
                    // want to run in that state in this process.  The driver set our
                    // priority already (though not our scheduling class), so bounce
                    // it back to the default before invoking the transaction.
                    setpriority(PRIO_PROCESS, mMyThreadId, ANDROID_PRIORITY_NORMAL);
                }
            } else {
                if (curPrio >= ANDROID_PRIORITY_BACKGROUND) {
                    // We want to use the inherited priority from the caller.
                    // Ensure this thread is in the background scheduling class,
                    // since the driver won't modify scheduling classes for us.
                    // The scheduling group is reset to default by the caller
                    // once this method returns after the transaction is complete.
                    androidSetThreadSchedulingGroup(mMyThreadId,
                                                    ANDROID_TGROUP_BG_NONINTERACT);
                }
            }

            //LOGI(">>>> TRANSACT from pid %d uid %d\n", mCallingPid, mCallingUid);
            
            Parcel reply;
            IF_LOG_TRANSACTIONS() {
                TextOutput::Bundle _b(alog);
                alog << "BR_TRANSACTION thr " << (void*)pthread_self()
                    << " / obj " << tr.target.ptr << " / code "
                    << TypeCode(tr.code) << ": " << indent << buffer
                    << dedent << endl
                    << "Data addr = "
                    << reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer)
                    << ", offsets addr="
                    << reinterpret_cast<const size_t*>(tr.data.ptr.offsets) << endl;
            }
            if (tr.target.ptr) {
                sp<BBinder> b((BBinder*)tr.cookie);
                const status_t error = b->transact(tr.code, buffer, &reply, 0);
                if (error < NO_ERROR) reply.setError(error);
                
            } else {
                const status_t error = the_context_object->transact(tr.code, buffer, &reply, 0);
                if (error < NO_ERROR) reply.setError(error);
            }
            
            //LOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n",
            //     mCallingPid, origPid, origUid);
            
            if ((tr.flags & TF_ONE_WAY) == 0) {
                LOG_ONEWAY("Sending reply to %d!", mCallingPid);
                sendReply(reply, 0);
            } else {
                LOG_ONEWAY("NOT sending reply to %d!", mCallingPid);
            }
            
            mCallingPid = origPid;
            mCallingUid = origUid;

            IF_LOG_TRANSACTIONS() {
                TextOutput::Bundle _b(alog);
                alog << "BC_REPLY thr " << (void*)pthread_self() << " / obj "
                    << tr.target.ptr << ": " << indent << reply << dedent << endl;
            }
            
        }
        break;
    

 


  • 大小: 21.6 KB
分享到:
评论

相关推荐

    Android Zygote启动流程源码解析

    ### Android Zygote启动流程源码解析 #### 引言 在Android系统中,Zygote进程扮演着至关重要的角色,作为所有应用进程和SystemServer进程的“始祖”。了解Zygote的启动流程对于深入理解Android底层机制具有重要...

    模拟Android系统Zygote启动流程

    总的来说,Zygote启动流程是Android系统启动的关键环节,涉及到了系统资源的分配、核心类的预加载、系统服务的注册以及应用程序的创建和执行。理解这一流程对于优化Android应用性能、排查系统问题以及开发自定义框架...

    zygote启动过程

    通过对zygote启动过程的分析,我们可以看到zygote进程在Android系统中扮演着非常重要的角色。通过高效的启动机制和进程复用技术,zygote显著提高了应用程序的启动速度,同时降低了系统的资源消耗。理解zygote的工作...

    Android系统进程Zygote启动过程的源代码分析.pdf

    Android系统进程Zygote启动过程涉及到的源代码分析是一篇深度探讨Android平台启动机制的文章,其内容主要围绕Zygote进程在Android系统中的作用、源代码的细节以及它如何通过fork机制和其他系统服务交互的过程。...

    [经典文档]Android核心分析

    [经典文档]Android核心分析 核心分析之一 ----- 分析方法论探讨之设计意图 核心分析之二 ----- 方法论探讨之概念空间篇 核心分析之三 ----- 手机之硬件形态 核心分析之四 ----- 手机之软件形态 核心分析之五 ----- ...

    android 核心分析之------Android 启动过程详解

    ### Android核心分析之Android启动过程详解 Android启动过程是一个复杂且有序的流程,涉及多个关键阶段,从硬件初始化到最终的用户界面呈现。这一过程可以分为四大步骤:init进程启动、Native服务启动、...

    android核心分析pdf

    **Android核心分析(08):** 对Android系统的启动流程进行了详细的剖析,包括从Zygote进程的初始化到第一个应用的启动全过程。 #### 七、Zygote Service **Android核心分析(09):** Zygote Service是Android系统...

    Android主要机制深入分析.pdf

    Zygote是Android系统用于快速创建新进程的机制,它预先加载了Android核心库和常用框架类,因此在创建新进程时可以大大减少资源消耗。 3. 系统服务分析:Android系统服务框架(GWES)包括消息系统、窗口管理、输入...

    android核心分析之------Android启动过程详解.pdf

    Android启动过程详解主要分为四个关键步骤,这四个步骤构建了Android系统的基石。下面将详细阐述这些步骤以及涉及...理解这个启动过程对于Android开发者和系统优化人员至关重要,有助于深入理解Android系统的运行机制。

    Android核心分析-050417421

    Android核心分析是关于Android系统的深入研究和分析,涵盖了Android系统的架构设计、核心机制、软件和硬件形态、IPC框架、Service管理、启动过程、窗口管理、输入系统、电话系统、应用程序框架、GDI机制等方面的知识...

    android 核心分析

    Android 核心分析 之八------Android 启动过程详解................................................... 31 Android 核心分析 之九-------Zygote Service...........................................................

    Android Zygote解析

    在这个过程中,Zygote首先会初始化Dalvik(在较早的Android版本中)或ART(在现代Android版本中)虚拟机,使得Java应用程序能够在Linux内核之上运行。 Android应用程序由Java编写,不能直接作为本地进程在Linux系统...

    android开机启动流程

    在探讨Android设备如何启动并准备好供用户使用的整个过程之前,我们先来简要回顾一下Android启动的基本流程。这一过程大致可以分为以下四个主要阶段: 1. **init进程启动**:这是整个启动过程的开端,涉及到Linux...

    Android 启动过程详解

    SystemServer是Android系统的核心组件之一,它负责启动和管理系统的大部分服务。SystemServer的启动流程如下: 1. **SystemServer进程启动**:在Zygote进程中通过调用`startSystemServer()`方法启动SystemServer...

    Android核心设计思想分析

    Android核心分析之八------Android 启动过程详解...................................................31 Android核心分析之九-------ZygoteService.................................................................

    Android 提高篇 机制 分析

    ### Android提高篇机制分析 #### 一、设计方法论探讨之设计意图...综上所述,本文档旨在从设计意图的角度出发,全面分析Android系统的核心机制,帮助开发者更好地理解Android的内部工作原理,从而提升开发效率和质量。

    Android核心分析系列教程

    #### 一、Android核心分析之——分析方法论探讨之设计意图 在这一章节中,作者强调了研究Android的重要性,并指出研究Android不仅仅是学习其技术细节,更重要的是理解其背后的设计思想。作者认为,面对如此复杂的...

    android核心分析

    ### Android核心分析——设计意图与方法论探讨 #### 一、设计意图的探索 在深入研究Android之前,首要任务是理解其背后的设计理念。对于一个跨平台开发者而言,熟悉并掌握Android的核心概念至关重要。Android引入...

    详细分析Android中实现Zygote的

    该脚本包含了一系列参数,如`-Xzygote`、`--zygote`和`--start-system-server`,这些参数用于指示Zygote进程的特殊行为,比如开启Zygote模式和启动系统服务器。 接下来,我们深入到源码层面。`app_process`程序的...

Global site tag (gtag.js) - Google Analytics