AMS(ActivityManagerService)Android的分析核心服务之一,对于framework各个核心服务,动流如果不是深入专门去做framework开发,先了解其基本的分析流程机制,再慢慢深究;
今天我们就来学习下AMS
ActivityRecord:记录了Activity的所有信息,因此它用来描述一个activity。它是在activity启动时被创建的,具体是在ActivityStarter的startActivity()中被创建的。它存储的信息主要包括以下内容:
TaskRecord:用来描述一个Activity任务栈
ActivityStack:用来管理系统所有的Activity,内部维护了Activity的所有状态,特殊状态的Activity以及和Activity相关的列表等数据;
- private void startBootstrapServices() {
- // Activity manager runs the show.
- mActivityManagerService = mSystemServiceManager.startService(
- ActivityManagerService.Lifecycle.class).getService();
- mActivityManagerService.setSystemProcess();
- ……
- mActivityManagerService.installSystemProviders();
- ……
- mActivityManagerService.systemReady(new Runnable() {
- @Override
- public void run() {
- Slog.i(TAG, "Making services ready");
- mSystemServiceManager.startBootPhase(
- SystemService.PHASE_ACTIVITY_MANAGER_READY);
- try {
- mActivityManagerService.startObservingNativeCrashes();
- } catch (Throwable e) {
- reportWtf("observing native crashes", e);
- }
SystemServer中关于AMS启动时的几个关键方法,主要分为4个步骤
启动ActivityManagerService的方法
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
AMS服务同样是通过SystemServiceManager来启动的,那我们首先来看ActivityManagerService.Lifecycle的构造方法,然后在来看它的Start函数;
Lifecycle的构造方法中很简单就是构造一个AMS的对象
mService = new ActivityManagerService(context);
创建AMS对象的时候需要传递一个Context作为参数,那这个mSystemContext是就是上面创建的系统Context;
接着看AMS的构造方法;
- public ActivityManagerService(Context systemContext) {
- //系统的context
- mContext = systemContext;
- //获得系统的ActivityThread
- mSystemThread = ActivityThread.currentActivityThread();
- //创建一个HandlerThread用来处理AMS接收的命令
- 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;
- //初始化Service相关的容器
- mServices = new ActiveServices(this);
- //初始化Provider相关的Map,里面保存了注册的ContentProvider
- mProviderMap = new ProviderMap(this);
- //初始化并创建data/system/目录
- 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,userID为0,该用户具有管理员权限
- mStartedUsers.put(UserHandle.USER_OWNER, new UserState(UserHandle.OWNER, true));
- mUserLru.add(UserHandle.USER_OWNER);
- updateStartedUserArrayLocked();
- //获取opengle的版本
- GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version",
- ConfigurationInfo.GL_ES_VERSION_UNDEFINED);
- //初始化字体语言等配置信息
- mConfiguration.setToDefaults();
- mConfiguration.setLocale(Locale.getDefault());
- ……;
- mRecentTasks = new RecentTasks(this);
- //初始化StackSupervisor,该类是Activity启动和调度的核心类
- mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks);
- mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks);
AMS的start方法。
- private void start() {
- mProcessCpuThread.start();
- mBatteryStatsService.publish(mContext);
- LocalServices.addService(ActivityManagerInternal.class, new LocalService());
- }
ActivityManagerService的setSystemProcess方法
- public void setSystemProcess() {
- try {
- //将AMS注册到ServiceManager中
- ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
- //注册其他服务到ServiceMananger中
- ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
- ServiceManager.addService("meminfo", new MemBinder(this));
- ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
- ServiceManager.addService("dbinfo", new DbBinder(this));
- if (MONITOR_CPU_USAGE) {
- ServiceManager.addService("cpuinfo", new CpuBinder(this));
- }
- //注册权限服务到ServiceMananger中
- ServiceManager.addService("permission", new PermissionController(this));
- ServiceManager.addService("processinfo", new ProcessInfoService(this));
- //从PMS中查询包名为android的application,即framework-res的Application信息
- ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
- "android", STOCK_PM_FLAGS);
- //将application信息配置到开始创建的activityThread中
- mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
- synchronized (this) {
- //创建了一个ProcessRecord对象,该对象中保存着系统ongoing服务的进程信息
- ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0);
- app.persistent = true;
- app.pid = MY_PID;
- app.maxAdj = ProcessList.SYSTEM_ADJ;
- app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
- synchronized (mPidsSelfLocked) {
- 然后将系统进程的processRecord对象也添加到mPidsSelfLocked集合中,和普通应用的进程一样,接收AMS的管理调度
- mPidsSelfLocked.put(app.pid, app);
- }
- //更细进程管理的调度信息
- updateLruProcessLocked(app, false, null);
- updateOomAdjLocked();
- }
接着看installSystemApplicationInfo方法
- public void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) {
- synchronized (this) {
- getSystemContext().installSystemApplicationInfo(info, classLoader);
- }
- }
这个方法中最终调用上面创建的SystemContext的installSystemApplication方法,那就接着看ConxtextImpl的installSystemApplication方法。
- void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) {
- mPackageInfo.installSystemApplicationInfo(info, classLoader);
- }
- public final void installSystemProviders() {
- List<ProviderInfo> providers;
- synchronized (this) {
- //找到名称为”System”的进程,就是上一步创建的processRecord对象
- ProcessRecord app = mProcessNames.get("system", Process.SYSTEM_UID);
- //找到所有和system进程相关的ContentProvider
- providers = generateApplicationProvidersLocked(app);
- if (providers != null) {
- for (int i=providers.size()-1; i>=0; i--) {
- ProviderInfo pi = (ProviderInfo)providers.get(i);
- //再次确认进程为system的provider,把不是该进程provider移除
- if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
- Slog.w(TAG, "Not installing system proc provider " + pi.name
- + ": not system .apk");
- providers.remove(i);
- }
- }
- }
- }
- if (providers != null) {
- //把provider安装到系统的ActivityThread中
- mSystemThread.installSystemProviders(providers);
- }
- mCoreSettingsObserver = new CoreSettingsObserver(this);
- }
找到名称为system的进程对象,就是SystemServer进程,然后根据进程对象去查询所有有关的ContentProvider,调用系统进程的主线程ActivityThread安装所有相关的ContentProvider,具体是如何查找相关的contentProvider和如何安装ContentProvider到系统主线程的,接着分析下面两个方法;
- private final List<ProviderInfo> generateApplicationProvidersLocked(ProcessRecord app) {
- List<ProviderInfo> providers = null;
- try {
- //调用PMS根据进程ID和进程名称来查询Provider
- ParceledListSlice<ProviderInfo> slice = AppGlobals.getPackageManager().
- queryContentProviders(app.processName, app.uid,
- STOCK_PM_FLAGS | PackageManager.GET_URI_PERMISSION_PATTERNS);
- providers = slice != null ? slice.getList() : null;
- } catch (RemoteException ex) {
- }
- int userId = app.userId;
- if (providers != null) {
- int N = providers.size();
- for (int i=0; i<N; i++) {
- ProviderInfo cpi =
- (ProviderInfo)providers.get(i);
- ……
- ComponentName comp = new ComponentName(cpi.packageName, cpi.name);
- //从AMS管理的contentProvider列表中查询对应的provider
- ContentProviderRecord cpr = mProviderMap.getProviderByClass(comp, userId);
- if (cpr == null) {
- //如果AMS的Provider列表中没有对应的Provider实例,就根据查询的provider信息,创建一个对象保存到队列中
- cpr = new ContentProviderRecord(this, cpi, app.info, comp, singleton);
- mProviderMap.putProviderByClass(comp, cpr);
- }
- //同时将provider保存到processRecord对象的pubProviders列表中
- app.pubProviders.put(cpi.name, cpr);
- ……
- }
- }
- return providers;
- }
- private void installContentProviders(
- Context context, List<ProviderInfo> providers) {
- ……
- for (ProviderInfo cpi : providers) {
- //通过installProvider方法把provider封装成一个ContentProviderHolder对象,有利于进程间传输
- IActivityManager.ContentProviderHolder cph = installProvider(context, null, cpi,
- false /*noisy*/, true /*noReleaseNeeded*/, true /*stable*/);
- if (cph != null) {
- cph.noReleaseNeeded = true;
- results.add(cph);
- }
- }
- try {
- //将上面得到的contentProviderHolder对象发布到AMS服务,getApplicationThread代表本地进程的一个binder对象,binder对象可跨进程传输,它在AMS中对应一个ProcessRecord.
- ActivityManagerNative.getDefault().publishContentProviders(
- getApplicationThread(), results);
- ……
- }
- public final void publishContentProviders(IApplicationThread caller,
- List<ContentProviderHolder> providers) {
- ……
- //根据调用者的进程得到相应的processRecord对象,就是系统进程的ProcessRecord
- final ProcessRecord r = getRecordForAppLocked(caller);
- ……
- final int N = providers.size();
- for (int i = 0; i < N; i++) {
- //ActivityThread客户端传过来的provider src
- ContentProviderHolder src = providers.get(i);
- //根据src provider name得到一开始保存的进程中保存的ProciderRecord
- ContentProviderRecord dst = r.pubProviders.get(src.info.name);
- if (dst != null) {
- ComponentName comp = new ComponentName(dst.info.packageName, dst.info.name);
- //按类将它保存在mProviderMap中
- mProviderMap.putProviderByClass(comp, dst);
- String names[] = dst.info.authority.split(";");
- for (int j = 0; j < names.length; j++) {
- //按authority保存在mProviderMap中
- mProviderMap.putProviderByName(names[j], dst);
- }
- ……
- }
ActivityManagerService的systemReady方法
- public void systemReady(final Runnable goingCallback) {
- synchronized(this) {
- //初始化Doze模式的controller
- mLocalDeviceIdleController
- = LocalServices.getService(DeviceIdleController.LocalService.class);
- //重置RecentTasks
- mRecentTasks.clear();
- mRecentTasks.addAll(mTaskPersister.restoreTasksLocked());
- mRecentTasks.cleanupLocked(UserHandle.USER_ALL);
- mTaskPersister.startPersisting();
- ……
- //设置systemReady为true
- mSystemReady = true;
- }
- ArrayList<ProcessRecord> procsToKill = null;
- //收集那些在AMS之前启动的进程
- synchronized(mPidsSelfLocked) {
- for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {
- ProcessRecord proc = mPidsSelfLocked.valueAt(i);
- if (!isAllowedWhileBooting(proc.info)){
- if (procsToKill == null) {
- procsToKill = new ArrayList<ProcessRecord>();
- }
- procsToKill.add(proc);
- }
- }
- }
- //将那些在AMS之前启动的进程杀死,有的进程不能再AMS之前启动
- synchronized(this) {
- if (procsToKill != null) {
- for (int i=procsToKill.size()-1; i>=0; i--) {
- ProcessRecord proc = procsToKill.get(i);
- Slog.i(TAG, "Removing system update proc: " + proc);
- removeProcessLocked(proc, true, false, "system update done");
- }
- }
- }
- //从settingsProvider的设置总初始化部分变量
- retrieveSettings();
- //调用callback方法,该方法在systemServer代码中实现
- if (goingCallback != null) goingCallback.run();
- //查询那些persistent为1的application,并启动他们所在的进程
- List apps = AppGlobals.getPackageManager().
- getPersistentApplications(STOCK_PM_FLAGS);
- if (apps != null) {
- int N = apps.size();
- int i;
- for (i=0; i<N; i++) {
- ApplicationInfo info
- = (ApplicationInfo)apps.get(i);
- if (info != null &&
- !info.packageName.equals("android")) {
- addAppLocked(info, false, null /* ABI override */);
- }
- }
- //启动HomeActivity,也就是launcher程序
- mBooting = true;
- startHomeActivityLocked(mCurrentUserId, "systemReady");
- ……
- }
- }
SystemReady方法也是比较长,大致可以分为:
- try {
- //ams开始监听native层的crash信息
- mActivityManagerService.startObservingNativeCrashes();
- } catch (Throwable e) {
- reportWtf("observing native crashes", e);
- }
- //初始化webVew
- WebViewFactory.prepareWebViewInSystemServer();
- try {
- //启动systemUI
- startSystemUi(context);
- } catch (Throwable e) {
reportWtf("starting System UI", e);
- }
- try {
- //调用其他服务的systemready方法
- if (networkScoreF != null) networkScoreF.systemReady();
- } catch (Throwable e) {
- reportWtf("making Network Score Service ready", e);
- }
这个回调函数中主要工作就是启动systemUI并调用其他服务的systemReady方法,SystemReady函数完成了系统就绪的必要的工作,启动了HomeActivity和SystemUI,然后Android系统就全部启动了;
AMS服务启动主要分为几个步骤:
本文转载自微信公众号「Android开发编程」
责任编辑:姜华 来源: Android开发编程 AMSAndroidActivityManagerServi
(责任编辑:百科)
江西省一季度国有经济亮出成绩单 国有企业资产规模达到6.1万亿元
摩托罗拉Edge 30 Fusion获得多项认证 支持68W快充
海关总署:前10个月民营企业进出口15.31万亿元 占外贸总值的48.3%