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相关的部分主要有四个阶段。接下来详细分析这四个阶段。