ActivityManagerService 构造方法分析
参考:https://blog.csdn.net/u013122625/article/details/53433064
本文主要分析ActivityManagerService的构造方法中所做的事情,先看代码。
// Note: This method is invoked on the main thread but may need to attach various
// handlers to other threads. So take care to be explicit about the looper.
public ActivityManagerService(Context systemContext) {
/*
下面的方法将当前的ActivityManagerService,赋值给了LockGuard类内部的一个名为
sKnownFixed数组的特定的位置,可能和锁相关吧
*/
LockGuard.installLock(this, LockGuard.INDEX_ACTIVITY);
/*
Injuetor是AMS的一个内部类
*/
mInjector = new Injector();
//mContext是系统的Context对象
mContext = systemContext;
mFactoryTest = FactoryTest.getMode();
/*
ActivityThread是Android应用的主线程(UI线程),是真正负责执行Activity启动的操作的,
ActivityThread的创建是在SystemServer的createSystemContext()方法中创建的,也就是
在SystemServer创建时,执行run时调用createSystemContext(),此时AMS获取了主线程的引用
*/
mSystemThread = ActivityThread.currentActivityThread();
/*
在这里面获取了一些APK的信息,然后设置设置什么资源的 ,LoadedApk代表一个加载到系统中的
APK。 其中保存了apk的基本信息 ,LoadedAPK的这个构造方法只有系统进程创建的时候可以调
用。它代表一个系统进程的apk,它里面存储着资源文件的位置,jni包的位置等信息,包名为
android。其实代表的就是就是framework-res.apk。该apk仅供systemServer使用。应该是 获
取了SystemUI的context对象
*/
mUiContext = mSystemThread.getSystemUiContext();
Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass());
/*
权限相关的变量
*/
mPermissionReviewRequired = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_permissionReviewRequired);
/*
创建一个mHandlerThread线程,默认名是:ActivityManager,该线程内部其实并没有做什么工作
继承自HandlerThread
*/
mHandlerThread = new ServiceThread(TAG,
THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
mHandlerThread.start();
/*
生成了一个 MainHandler对象,该对象和上面的mHandlerThread绑定在同一个线程上,那到底绑
定在哪一个线程上呢 。MainHandler是AMS内部定义的handler,handMessage内部有超级多的
case判断,可能AMS中的重要的处理逻辑都在这个里面
*/
mHandler = new MainHandler(mHandlerThread.getLooper());
/*
生成UiHandler对象,也是定义在AMS内部的Handler对象,内部也有很多case判断,应该主要与
UI事件相关
*/
mUiHandler = mInjector.getUiHandler(this);
/*
ActivityManagerConstants是一个ContentObserver对象,里面定义了很多变量,观察者,可能
是当装态发生改变时,通过handler回调AMS
*/
mConstants = new ActivityManagerConstants(this, mHandler);
/* static; one-time init here */
if (sKillHandler == null) {
sKillThread = new ServiceThread(TAG + ":kill",
THREAD_PRIORITY_BACKGROUND, true /* allowIo */);
sKillThread.start();
sKillHandler = new KillHandler(sKillThread.getLooper());
}
/*
下面的这两个广播队列应该就与android系统的广播实现相关
*/
mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
"foreground", BROADCAST_FG_TIMEOUT, false);
mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
"background", BROADCAST_BG_TIMEOUT, true);
mBroadcastQueues[0] = mFgBroadcastQueue;
mBroadcastQueues[1] = mBgBroadcastQueue;
/*
ActiveServices: 应该是管理系统中所有services的一个对象,不是Activity的那个Service
*/
mServices = new ActiveServices(this);
/*
可能是保存android系统中ContentProvider的映射关系的对象
*/
mProviderMap = new ProviderMap(this);
mAppErrors = new AppErrors(mUiContext, this);
// TODO: Move creation of battery stats service outside of activity manager service.
/*
创建文件夹目录,保存 电源服务相关的数据吧
*/
File dataDir = Environment.getDataDirectory();
File systemDir = new File(dataDir, "system");
systemDir.mkdirs();
mBatteryStatsService = new BatteryStatsService(systemDir, mHandler);
mBatteryStatsService.getActiveStatistics().readLocked();
mBatteryStatsService.scheduleWriteToDisk();
mOnBattery = DEBUG_POWER ? true
: mBatteryStatsService.getActiveStatistics().getIsOnBattery();
mBatteryStatsService.getActiveStatistics().setCallback(this);
//创建进程统计服务类,并新建一个data/system/procstats目录
mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
// 创建一个应用权限检查类,新建一个data/system/appops.xml文件,并注册对应的回调接口
mAppOpsService = mInjector.getAppOpsService(new File(systemDir, "appops.xml"), mHandler);
mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null,
new IAppOpsCallback.Stub() {
@Override public void opChanged(int op, int uid, String packageName) {
if (op == AppOpsManager.OP_RUN_IN_BACKGROUND && packageName != null) {
if (mAppOpsService.checkOperation(op, uid, packageName)
!= AppOpsManager.MODE_ALLOWED) {
runInBackgroundDisabled(uid);
}
}
}
});
mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml"));
// 创建多用户控制器,user 0是第一个,同时也是唯一开机过程中运行的用户
mUserController = new UserController(this);
mVrController = new VrController(this);
// 获取OpenGL版本,如果没有找到,则默认为0
GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version",
ConfigurationInfo.GL_ES_VERSION_UNDEFINED);
if (SystemProperties.getInt("sys.use_fifo_ui", 0) != 0) {
mUseFifoUiScheduling = true;
}
mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
// 设置系统的一些默认配置信息
mTempConfig.setToDefaults();
mTempConfig.setLocales(LocaleList.getDefault());
mConfigurationSeq = mTempConfig.seq = 1;
// 用来管理Activity栈
mStackSupervisor = createStackSupervisor();
mStackSupervisor.onConfigurationChanged(mTempConfig);
//锁屏相关
mKeyguardController = mStackSupervisor.mKeyguardController;
mCompatModePackages = new CompatModePackages(this, systemDir, mHandler);
mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
mTaskChangeNotificationController =
new TaskChangeNotificationController(this, mStackSupervisor, mHandler);
// 解释怎样启动Activity
mActivityStarter = new ActivityStarter(this, mStackSupervisor);
// 管理最近任务列表
mRecentTasks = new RecentTasks(this, mStackSupervisor);
// 初始化进程CPU跟踪器
mProcessCpuThread = new Thread("CpuTracker") {
@Override
public void run() {
synchronized (mProcessCpuTracker) {
mProcessCpuInitLatch.countDown();
mProcessCpuTracker.init();
}
while (true) {
try {
try {
synchronized(this) {
final long now = SystemClock.uptimeMillis();
long nextCpuDelay = (mLastCpuTime.get()+MONITOR_CPU_MAX_TIME)-now;
long nextWriteDelay = (mLastWriteTime+BATTERY_STATS_TIME)-now;
//Slog.i(TAG, "Cpu delay=" + nextCpuDelay
// + ", write delay=" + nextWriteDelay);
if (nextWriteDelay < nextCpuDelay) {
nextCpuDelay = nextWriteDelay;
}
if (nextCpuDelay > 0) {
mProcessCpuMutexFree.set(true);
this.wait(nextCpuDelay);
}
}
} catch (InterruptedException e) {
}
updateCpuStatsNow();
} catch (Exception e) {
Slog.e(TAG, "Unexpected exception collecting process stats", e);
}
}
}
};
Watchdog.getInstance().addMonitor(this);
Watchdog.getInstance().addThread(mHandler);
}