System Server 分析

SystemServer Android JAVA 层的系统服务模块,这个模块主要功能就是管理供 Android 应用开发的 system service.


1.SystemServer 类是如何启动的

 

    让我们从 Android 的启动过程看起,查看 init.rc 文件,就会发现下面这一行

service zygote /system/bin/app_process -Xzygote /system/bin --zygote –start-system-server

我们知道 zygote 进程是整个 Android 的孵化器进程,所有的 Activity 进程均是通过它来生成的。我们发现在 zygote 进程启动过程中指定了这么一个参数“– start-system-server” ,这个参数就是在 zygote 进程启动的同时启动 SystemServer

     那么 SystemServer 是以什么样的形式启动的呢?是单独的一个进程还是线程,分析一下 zygote 进程的启动过程就明白了。在 Android zygote 进程启动其实就是启动 /system/bin/app_process 这个进程,这个进程的源代码在 frameworks/base/cmds/app_process/app_main.cpp 中。



 


     由于 zygote 进程启动过程有“ --zygote” 这个参数,所以走的是下面这步


         runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);


     查看对象 runtime 的类型的定义,

          class AppRuntime : public AndroidRuntime


     因此查看 AndroidRuntime start 方法中的一段代码 (frameworks/base/core/jni/AndroidRuntime.cpp)


 


    其中 startClass 即为 "com.android.internal.os.ZygoteInit" ,这段代码调用了 com.android.internal.os.ZygoteInit main 函数。


    那么再往下看 ZygoteInit 类的 main 函数,其中的一段 MethodAndArgsCaller 代码为




 

调用了 startSystemServer () ,这个函数启动了一个子进程来作为 SystemServer 的载体,

1. 它首先指定 SystemServer 进程的参数 ;

2. 根据指定的参数来创建 SystemServer 进程;

3. 调用 handleSystemServerProcess 启动第一步指定进程参数过程中指定的类,此时为“ com.android.server.SystemServer ,启动的这个进程在 ps 查看后显示为” system_server



 


 

     通过以上过程就会调用到 SystemServer 类,且是运行在一个名为“ system_server” 的进程中,这个进程为 zygote 的子进程。

     虽然 SystemServer 类是运行在 system_server 中的,但是它并不运行在 system_server 的主线程中。

     上代码

 


 

由代码可以看出,在调用函数 invokeStaticMain 的最后会抛出一个异常。

   

回过头再看一下 ZygoteInit 类的 main 函数中的一段代码

 

其实就是在这个抛出的异常中启动了 SystemServer 类,且这个异常为一个 Runnable 类型,因此 SystemServer 类就运行在 system_server 进程中的一个新的线程里。


2.SystemServer 执行内容


 

1. 执行 frameworks/base/cmds/system_server/library/system_init.cpp 中的 system_init 函数,启动当前进程,也就是进程 system_server 的 pool thread ,以便执行 Binder IPC 操作。

2. 向 SM(Service Manager) 添加系统服务。

 

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值