android启动--深入理解zygote (II)

上一节说到 使用 Zygote.forkSystemServer 利用 fork 生成 SystemServer进程,那个这个进程到底干了哪些事情呢?

下面从 handleSystemServerProcess 处理流程开始讲解

代码片段如下:

/* Request to fork the system server process */

pid = Zygote.forkSystemServer(

                    parsedArgs.uid, parsedArgs.gid,

                    parsedArgs.gids, debugFlags, null);

/* For child process */

if (pid == 0) {

      handleSystemServerProcess(parsedArgs);

}

-->

private static void handleSystemServerProcess(

ZygoteConnection.Arguments parsedArgs)

{

// 关闭哪些从 Zygote 继承来的 socket

closeServerSocket();

// 这里调用到 zygoteInit函数

RuntimeInit.zygoteInit(parsedArgs.remainingArgs);

}

RuntimeInit.java @ frameworks\base\core\java\com\android\internal\os

public static final void zygoteInit(String[] argv){

// 这里调用到 JNI 函数中去了

zygoteInitNative();

// 调用到startClass com.android.server.SystemServer 的main函数

invokeStaticMain(startClass, startArgs);

}

-->

zygoteInitNative @ frameworks\base\core\jni

调用到 onZygoteInit @frameworks\base\cmds\app_process\app_main.cpp

    virtual void onZygoteInit()

    {

        sp<ProcessState> proc = ProcessState::self();

        if (proc->supportsProcesses()) {

            LOGV("App process: starting thread pool.\n");

            proc->startThreadPool(); // 启动线程,建立 binder 通讯

        }

}

ok, 这个流程清楚了,下面我们重点看看 native system_server进程如何启动?

Main @ frameworks\base\services\java\com\android\server\SystemServer.java

public static void main(String[] args) {

System.loadLibrary("android_servers");

init1(args);

}

这里 init1 是个 native 函数:

system_init @ frameworks\base\cmds\system_server\library\system_init.cpp

extern "C" status_t system_init()

{

LOGI("Entered system_init()");

// Start the SurfaceFlinger

SurfaceFlinger::instantiate();

runtime->callStatic("com/android/server/SystemServer", "init2");

...

}

这里又调用到 

init2 @ frameworks\base\services\java\com\android\server\SystemServer.java

public static final void init2() {

Thread thr = new ServerThread();

thr.setName("android.server.ServerThread");

thr.start();

}

这里启动了一个 ServerThread 线程并调用其start() 函数,其实也就是调用

ServerThread 线程的 run() 函数

public void run() {

     Slog.i(TAG, "Entropy Service");

     ServiceManager.addService("entropy", new EntropyService());

     Slog.i(TAG, "Power Manager");

     power = new PowerManagerService();

     ServiceManager.addService(Context.POWER_SERVICE, power);

...

 // 最后进入到 loop 消息循环中处理消息了。。。。

        Looper.loop();

        Slog.d(TAG, "System ServerThread is exiting!");

}

Oh , 原来就是在就里将很多重要的系统服务依次加入到ServiecManager中,至此整个 SystemServer 进程启动完成。


总结一下,重要执行过程如下:


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值