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,第一次运行到这里,必然进入第一次等待状态。