10.2 ActivityManagerService在系统启动阶段的主要工作

ActivityManagerService是在系统启动的init2阶段,由SystemServer启动的Java系统服务之一。启动代码位于frameworks/base/services/java/com/android/server/SystemServer.java中,代码如下:


//只提取ServerThread中与ActivityManagerService相关的代码

class ServerThread extends Thread{

public void run(){

Looper.prepare();//准备消息循环

Context context=null;

try{

//第一阶段:调用main方法启动ActivityManagerService

context=ActivityManagerService.main(factoryTest);

……

//第二阶段:调用setSystemProcess方法

ActivityManagerService.setSystemProcess();

……

//第三阶段:调用installSystemProviders方法

ActivityManagerService.installSystemProviders();

……

//注册到Watchdog监控,不在该部分分析

Watchdog.getInstance().init(context, battery, power, alarm,

ActivityManagerService.self());

……

//关联windowManagerService

ActivityManagerService.self().setWindowManager(wm);

}catch(RuntimeException e){……}

……

try{

//通过WindowManagerService显示“正在启动应用。”

ActivityManagerNative.getDefault().showBootMessage(

context.getResources().getText(

com.android.internal.R.string.android_upgrading_starting_apps),

false);

}catch(RemoteException e){

}

……

//根据是否启动到安全模式,开启或禁用JIT编译

final boolean safeMode=wm.detectSafeMode();

if(safeMode){

ActivityManagerService.self().enterSafeMode();

Zygote.systemInSafeMode=true;

VMRuntime.getRuntime().disableJitCompilation();

}else{

VMRuntime.getRuntime().startJitCompilation();

}

if(safeMode){

ActivityManagerService.self().showSafeModeOverlay();

}

……

//第四阶段:调用systemReady方法

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

public void run(){

if(!headless)startSystemUi(contextF);

try{

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

}

……

Watchdog.getInstance().start();

try{

if(appWidgetF!=null)appWidgetF.systemReady(safeMode);

}

……

}

});

Looper.loop();

}


在系统启动阶段,与ActivityManagerService相关的部分主要有四个阶段。接下来详细分析这四个阶段。