您的位置:首页 > 其它

ActivityManagerService启动流程

2016-06-07 17:08 453 查看
从SystemServer这个类开始分析,其大致流程如下:

1.main方法被调用,run方法调用;

2.调整系统时间;设置系统属性:

3.语言,地区,国家,地区属性;

4.初始化Looper;初始化本地服务;

5.创建context;

6.初始化SystemServiceManager;

7.启动引导Service、核心Service、其他Service;

7.1.启动引导Service中的动作有:

1.初始化Installer;(需要细看这个类的功能,先不管)

2.初始化ActivityManagerService,之后就调用了setInstaller(installer)方法,参数就是上面初始化的Installer;

3.初始化PowerManagerService,这里又有一个调用:mActivityManagerService.initPowerManagement(),具体意义先略过,以后有时间分析;

4.初始化LightsService,LED亮起来;

5.初始化DisplayManagerService;

6.startBootPhase方法调用,回调onBootPhase方法,继承至SystemService的系统Service都会重写onBootPhase方法,在系统服务启动过程的各个阶段会被回调到

7.初始化PackageManagerService,方式与其他服务的初始化有不同,调用PackageManagerService.main方法;

8.把UserManagerService通过ServiceManager的add方法进行初始化;

9.mActivityManagerService.setSystemProcess,这方法需要细看;

10.startSensorService启动传感器服务;

7.2.启动核心Service中的动作有:

1.启动BatteryService;

2.启动UsageStatsService;

3.调用mActivityManagerService.setUsageStatsManager,后续看下这方法啥情况;

2.启动WebViewUpdateService;

7.3.启动其他Service中的动作有:

一堆的Service初始化,就不一一列出来了,但其中会调用SystemServer中的剩下一个一方法:startSystemUI,当然需要在ActivityManagerService启动后,systemready状态后,才通过 Intent启动了SystemUI,具体代码:

intent.setComponent(new ComponentName("com.android.systemui",                  "com.android.systemui.SystemUIService"));


我们的重点是ActivityManagerService,具体看来启动引导Service中的相关代码:

mActivityManagerService = SystemServiceManager.startService(            ActivityManagerService.Lifecycle.class).getService();   mActivityManagerService.setSystemServiceManager(mSystemServiceManager); mActivityManagerService.setInstaller(installer);


这里启动ActivityManagerService的动作与启动其的service动作不一样,像PowerManagerService:

mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);


是这样启动的,所以我们进入PMS中看下:原来它并没有继承SystemService,倒是其内部类Lifecycle继承了SystemService,然后在其构造方法里new了一个AMS,然后公开了getSevice方法,将AMS return出来。所以会与其他Service获取方式不一样。具体代码如下:

public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
public Lifecycle(Context context) {
super(context);
mService = new ActivityManagerService(context);
}
@Override
public void onStart() {
mService.start();
}
public ActivityManagerService getService() {
return mService;
}
}


AMS构造方法里,声明了mContext上下文,一个HandlerThread,一个UIHandler。然后就是两个广播队列,一个前台,一个后台,存放在一个数组里。然后获取了电池相关、进程相关、权限相关数据,并进行了持久化。并更新用户信息。

public ActivityManagerService(Context systemContext) {
mContext = systemContext;
mFactoryTest = FactoryTest.getMode();
mSystemThread = ActivityThread.currentActivityThread();
Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass());
//非主线程
mHandlerThread = new ServiceThread(TAG,
android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
mHandlerThread.start();
//主线程
mHandler = new MainHandler(mHandlerThread.getLooper());
mUiHandler = new UiHandler();

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;

mServices = new ActiveServices(this);
mProviderMap = new ProviderMap(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);
//获取进程相关、权限相关数据
mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));

mAppOpsService = new AppOpsService(new File(systemDir, "appops.xml"), mHandler);

mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml"));

// User 0 is the first and only user that runs at boot.
//用户信息,id为0的才有root权限运行
mStartedUsers.put(UserHandle.USER_OWNER, new UserState(UserHandle.OWNER, true));
mUserLru.add(UserHandle.USER_OWNER);
updateStartedUserArrayLocked();
//获取open gl_es版本号
GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version",
ConfigurationInfo.GL_ES_VERSION_UNDEFINED);

mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
//配置项设置
mConfiguration.setToDefaults();
//地区设置     mConfiguration.setLocale(Locale.getDefault());

mConfigurationSeq = mConfiguration.seq = 1;
mProcessCpuTracker.init();

mCompatModePackages = new CompatModePackages(this, systemDir, mHandler);
mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
mRecentTasks = new RecentTasks(this);
mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks);
mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks);

mProcessCpuThread = new Thread("CpuTracker") {
@Override
public void run() {
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的监控集合里,让它看着。
Watchdog.getInstance().addThread(mHandler);//对应的handler加进去,不知道干嘛。
}


至此ActivityManagerService在开机后,就正常跑起来了。其start方法中具体干的些啥就不作细致分析了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: