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这时候会做些什么。