4.3.4 执行MethodAndArgsCaller的run方法

上一节分析到handleSystemServerProcess方法最后会抛出MethodAndArgsCaller类型的异常,顺着函数调用链回溯,找到捕获异常的地方位于ZygoteInit.java的main方法中,代码如下:


public static void main(String argv[]){

try{

……//省略部分内容

/注册zygote服务的Socket/

registerZygoteSocket();

/加载类Class资源和Resource资源/

preload();

……//省略部分内容

if(argv[1].equals("start-system-server")){

startSystemServer();//启动system_server

}

……//省略部分内容

if(ZYGOTE_FORK_MODE){

runForkMode();

}else{

runSelectLoopMode();

}

}catch(MethodAndArgsCaller caller){

caller.run();//捕获了MethodAndArgsCaller异常,并执行其run方法

}catch(RuntimeException ex){

}

}


ZygoteInit在main方法中捕获了MethodAndArgsCaller类型的异常,然后调用了该异常的run方法。接着分析异常捕获后都做了些什么,代码如下:


public static class MethodAndArgsCaller extends Exception implements Runnable{

private final Method mMethod;

private final String[]mArgs;

/构造方法中接收了传入的方法和参数/

public MethodAndArgsCaller(Method method, String[]args){

mMethod=method;

mArgs=args;

}

public void run(){

try{

/利用Java反射机制调用这个方法/

mMethod.invoke(null, new Object[]{mArgs});

}catch(IllegalAccessException ex){

}

}

}


MethodAndArgsCaller类既是一个异常类又是一个线程,异常处理代码中直接调用了这个线程的run方法,并执行了传入的com.android.server.SystemServer类的main方法。invokeStaticMain方法抛出异常的目的是执行com.android.server.SystemServer类的main方法,通过这种方式,可以直接从调用栈中跳出,并返回到ZygoteInit的main方法中。

system_server绕了一大圈执行了SystemServer的main方法,那SystemServer又承担了什么使命呢?首先分析com.android.server.SystemServer类的main方法中做了些什么,代码如下:


public static void main(String[]args){

……//省略部分内容

//申请更多内存

dalvik.system.VMRuntime.getRuntime().clearGrowthLimit();

/*system_server工作繁忙,并且要长期运行,调用setTargetHeapUtilization

方法可以提高堆内存使用效率/

VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);

/加载libandroid_servers.so库/

System.loadLibrary("android_servers");

init1(args);//调用init1

}


SystemServer在main函数中主要做了以下工作:

1)申请更多内存。

2)加载android_servers库。

3)执行init1。

SystemService在main函数中最重要的工作是在init1中完成的。

1.init1阶段启动Native System Service

init1是个Native方法,其JNI实现方法位于com_android_server_SystemServer.cpp中,方法名为android_server_SystemServer_init1。android_server_SystemServer_init1方法封装了对system_init()方法的调用,该方法位于system_init.cpp中。这里直接分析system_init方法,代码如下:


extern"C"status_t system_init()

{

/Binder通信相关,后续章节分析/

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

sp<IServiceManager>sm=defaultServiceManager();

sp<GrimReaper>grim=new GrimReaper();

sm->asBinder()->linkToDeath(grim, grim.get(),0);

char propBuf[PROPERTY_VALUE_MAX];

/读取属性值/

property_get("system_init.startsurfaceflinger",propBuf,"1");

if(strcmp(propBuf,"1")==0){

//开启SurfaceFlinger,这是一个Native System Service

SurfaceFlinger:instantiate();

}

/读取属性值/

property_get("system_init.startsensorservice",propBuf,"1");

if(strcmp(propBuf,"1")==0){

//开启Sensor Sevice,这是一个Native System Service

SensorService:instantiate();

}

AndroidRuntime*runtime=AndroidRuntime:getRuntime();

JNIEnv*env=runtime->getJNIEnv();

/通过JNI函数找到com/android/server/SystemServer的类信息/

jclass clazz=env->FindClass("com/android/server/SystemServer");

/通过JNI函数找到com/android/server/SystemServer类的init2方法/

jmethodID methodId=env->GetStaticMethodID(clazz,"init2","()V");

/调用init2方法,这个方法是Java方法/

env->CallStaticVoidMethod(clazz, methodId);

/加入Binder通信,以后章节再讲/

ProcessState:self()->startThreadPool();

IPCThreadState:self()->joinThreadPool();

return NO_ERROR;

}


在init1阶段主要做了以下工作:

1)启动核心系统服务SurfaceFlinger和SensorService,二者都是Native System Service。

2)通过AndroidRuntime调用Java层SystemServer的init2方法。

3)初始化Binder通信。

SurfaceFlinger和SensorService是由C/C++语言实现的系统服务,因此称为Native System Service,服务的启动过程读者可以自行研究。接下来分析init2都做了哪些工作。

2.init2阶段启动Java System Service

init2位于SystemServer.java,代码如下:


public static final void init2(){

Thread thr=new ServerThread();

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

thr.start();//调用start,线程进入可运行状态,将会执行run方法

}


init2启动了一个名为android.server.ServerThread的线程。ServerThread定义在SystemServer.java中,它的源码有700多行。

下面分析ServerThread线程的run方法中都做了些什么工作,代码如下:


class ServerThread extends Thread{

……//省略部分内容

public void run(){

/准备消息循环/

Looper.prepare();

……//省略部分内容

//开启系统核心服务

try{

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

power=new PowerManagerService();

ServiceManager.addService(Context.POWER_SERVICE, power);

context=ActivityManagerService.main(factoryTest);

ServiceManager.addService("telephony.registry",new TelephonyRegistry(context));

……//省略部分内容

//服务准备就绪

wm.systemReady();//WindowManagerService准备就绪

power.systemReady();//PowerManagerService准备就绪

pm.systemReady();//PackageManagerService准备就绪

/ActivityManagerService准备就绪,并在其中调用其他服务的就绪函数/

ActivityManagerService.self().systemReady(new Runnable(){

public void run(){

/启动系统的状态栏/

startSystemUi(contextF);

try{

if(batteryF!=null)batteryF.systemReady();

}catch(Throwable e){

}

……//省略部分内容

/启动Android软件Watchdog/

Watchdog.getInstance().start();

}

Looper.loop();

}

……//省略部分内容


ServerThread启动了大量核心系统服务,这些服务都是用Java实现的,因此称为Java System Service。

在ServerThread中,还开启了消息循环,用于处理消息。Android中最核心的服务PackageManagerService、ActivityManagerService、WindowManagerService均在这里被启动,这就是system_server进程出现意外后,zygote需要重启的原因。它太重要了!本书将在以后章节重点分析这部分内容。

经过这么长时间,system_server总算顺利完成任务,zygote也可以松一口气了,暂时不用“自杀”了。接下来看看zygote这时候会做些什么。