10.3 第一阶段:启动ActivityManagerService
ActivityManagerService的启动过程在main方法中完成,代码如下:
public static final Context main(int factoryTest){
//①启动AThread线程
AThread thr=new AThread();
thr.start();
synchronized(thr){
/*如果AThread线程的成员变量mService为null,则当前线程进入阻塞状
*态,并释放锁。此时需要等待其他线程调用notifyAll方法唤醒当前线程。
*这里,当前线程是调用main方法的线程,即ServerThread线程。唤醒当
前线程的线程其实是thr线程/
while(thr.mService==null){//mService即ActivityManagerService
try{
thr.wait();
}catch(InterruptedException e){
}
}
}
//此时thr.mService!=null或者当前线程被唤醒
ActivityManagerService m=thr.mService;
mSelf=m;
/*调用ActivityThread的systemMain方法,返回ActivityThread类型的at对
象,at对象存入ActivityManagerService的mSystemThread成员变量中/
ActivityThread at=ActivityThread.systemMain();//②
mSystemThread=at;
//调用at的getSystemContext方法,仍然返回Context类型的对象
Context context=at.getSystemContext();//③
context.setTheme(android.R.style.Theme_Holo);
m.mContext=context;//为ActivityManagerService赋值
m.mFactoryTest=factoryTest;
//管理与Activity启动和调度相关的类
m.mMainStack=new ActivityStack(m, context, true);
m.mBatteryStatsService.publish(context);//添加batteryinfo服务
m.mUsageStatsService.publish(context);//添加usagestats服务
/*将AThread线程的mReady成员变量赋值为true,并唤醒其他线程。
*这里的其他线程就是AThread线程,在其mReady成员变量为false时
会调用wait方法释放锁,并进入阻塞状态/
synchronized(thr){
thr.mReady=true;
thr.notifyAll();//唤醒thr线程
}
//调用ActivityManagerService的startRunning方法,参数全部为null
m.startRunning(null, null, null, null);//④
return context;
}
由上述代码可知,ActivityManagerService的启动过程由以下四步组成(与代码中的括号相对应):
1)启动AThread线程,该线程负责创建ActivityManagerService。如果ActivityManagerService未创建完毕,调用main方法的ServerThread线程需要等待AThread线程的通知。
2)ActivityManagerService创建完毕后,调用ActivityThread的systemMain方法创建ActivityThread对象,并赋值到ActivityManagerService的静态成员变量mSystemThread中。
3)调用ActivityThread的getSystemContext方法创建Context对象,并赋值到ActivityManagerService的成员变量mContext,然后对其他成员变量(ActivityStack)赋值,结束后,通知AThread线程。
4)调用ActivityManagerService的startRunning方法。
10.3.1 启动AThread线程
ActivityManagerService启动过程第一步:启动AThread线程。其定义于ActivityManager Service.java中,代码如下:
static class AThread extends Thread{
ActivityManagerService mService;//保存ActivityManagerService
boolean mReady=false;//初始状态为false
public AThread(){
super("ActivityManager");//线程名为ActivityManager
}
public void run(){
Looper.prepare();//支持消息循环
android.os.Process.setThreadPriority(//设置线程优先级
android.os.Process.THREAD_PRIORITY_FOREGROUND);
android.os.Process.setCanSelfBackground(false);
/创建ActivityManagerService类型的对象m,并在后续步骤中赋值给成员变量mService/
ActivityManagerService m=new ActivityManagerService();
/*ActivityManagerService创建成功后,调用notifyAll方法
唤醒其他阻塞线程,这里便是调用main方法的线程/
synchronized(this){
mService=m;
notifyAll();
}
/*重新获得锁,如果mReady成员变量不为true,则释放锁,进入阻塞
状态。当main方法将mReady置为true后,当前线程即被唤醒/
synchronized(this){
while(!mReady){
try{
wait();
}catch(InterruptedException e){
}}
}
Looper.loop();//唤醒后,进入消息循环
}
}
由上述代码可知,虽然在ServerThread线程中调用了ActivityManagerService的main方法,但是ActivityManagerService的构造过程却放在新线程AThread中完成。为了保证这两个线程状态的一致性,在main方法和AThread线程的run方法中,分别调用了wait和notifyAll方法实现线程的相互等待。其中main方法等待的是AThread成功创建,并初始化ActivityManagerService对象;AThread等待的是main方法对ActivityManagerService对象的后续处理完毕。
这里首先分析第一次等待过程:ActivityManagerService的创建和初始化过程。
ActivityManagerService的创建和初始化是在其构造函数中完成的,代码如下:
private ActivityManagerService(){
//Jelly Bean中新加入两个BroadcastQueue
mFgBroadcastQueue=new BroadcastQueue(this,"foreground",BROADCAST_FG_TIMEOUT);
mBgBroadcastQueue=new BroadcastQueue(this,"background",BROADCAST_BG_TIMEOUT);
mBroadcastQueues[0]=mFgBroadcastQueue;
mBroadcastQueues[1]=mBgBroadcastQueue;
File dataDir=Environment.getDataDirectory();
//即/data/目录
File systemDir=new File(dataDir,"system");
//即/data/system/目录
systemDir.mkdirs();
/*在ActivityManagerService中创建BatteryStatsService服务,该服务负责统计
系统各模块的耗电量情况,统计信息存入/data/system/batterystats.bin文件/
mBatteryStatsService=new BatteryStatsService(new File(
systemDir,"batterystats.bin").toString());
mBatteryStatsService.getActiveStatistics().readLocked();
mBatteryStatsService.getActiveStatistics().writeAsyncLocked();
mOnBattery=DEBUG_POWER?true:
mBatteryStatsService.getActiveStatistics().getIsOnBattery();
mBatteryStatsService.getActiveStatistics().setCallback(this);
/*在ActivityManagerService中创建UsageStatsService服务,该服务负责统计
系统各模块的使用情况,统计信息存入/data/system/usagestats/目录下/
mUsageStatsService=new UsageStatsService(new File(
systemDir,"usagestats").toString());
//获取属性设置信息
mHeadless="1".equals(SystemProperties.get("ro.config.headless","0"));
GL_ES_VERSION=SystemProperties.getInt("ro.opengles.version",
ConfigurationInfo.GL_ES_VERSION_UNDEFINED);
//设置系统配置信息,包括字体、语言、屏幕、布局、导航、MCC、MNC等信息
mConfiguration.setToDefaults();
mConfiguration.locale=Locale.getDefault();
mConfigurationSeq=mConfiguration.seq=1;
/*mProcessStats是ProcessStats类型的对象。在其init方法中,分别
读取/proc/stat和/proc/loadavg,用于统计CPU使用率和平均负载/
mProcessStats.init();
/*解析/data/system/packages-compat.xml,该文件中定义需要以兼容模式运行的
应用程序。所谓的兼容模式,指的是兼容屏幕尺寸/
mCompatModePackages=new CompatModePackages(this, systemDir);
//加入Android Watchdog监控
Watchdog.getInstance().addMonitor(this);
//开启新线程定期更新CPU使用情况
mProcessStatsThread=new Thread("ProcessStats"){
public void run(){
while(true){
……
updateCpuStatsNow();
……
}
}
};
mProcessStatsThread.start();
}
ActivityManagerService的构造函数并不复杂,其完成的主要工作如下:
1)初始化BroadcastQueue。
2)初始化一些与系统运行状态相关变量,如耗电量、CPU使用率和负载等信息。
3)获取系统配置信息,如OpenGL版本、字体、语言、屏幕等信息。
4)将自身加入Android Watchdog监控中。
ActivityManagerService创建成功后,首先将其存入AThread.mService成员变量中,并通知main方法所在线程该对象创建成功,main方法所在线程会根据AThread.mService是否为空,来决定是否进入第二次等待状态。然后根据AThread.mReady的状态判断是否进入第一次等待状态,AThread.mReady初始为false,当ActivityManagerService的后续处理过程结束后,会将其赋值为true,第一次运行到这里,必然进入第一次等待状态。