ActivityManagerService原理分析
来源:互联网 发布:淘宝网 电脑版 登录 编辑:程序博客网 时间:2024/06/05 05:20
一.概述
ActivityManagerService是Framework层的核心服务之一,ActivityManagerService是Binder的子类,它的功能主要以下三点:
- 四大组件的统一调度
- 进程管理
- 内存管理
二.ActivityManagerService中的重要变量
- static final int MAX_ACTIVITYS =20;系统允许的最大后台activity的数目
- static final int MAX_RECENT_TASK=20; 系统最多存储20个任务栈
- static final int MAX_HIDDEN_APP=15;系统允许处于hidden状态的进程数目的最大值,超过这个值后,Ams会杀死掉优先级较低的进程
- ActivityStackSupervisor mStackSupervisor; 通过这个类管理ActivityStacks
- final ActiveServices mServices; 服务的管理类,管理服务的所有的逻辑
- final BroadcastQueue[] mBroadcastQueues = new BroadcastQueue[2]; 前台/后台广播队列
- private final RecentTasks mRecentTasks; 最近的任务的意图列表
- final ProcessMap mProcessNames = new ProcessMap(); 当前正在运行的所有进程列表
- final ArrayList mLruProcesses = new ArrayList();最近使用的进程列表
- final ArrayList mProcessesToGc = new ArrayList();一旦事情闲置,应该gc的进程列表
- final HashMap
三.ActivityManagerService的启动过程
ActivityManagerService的启动是在systemserver进程的startBootstrapServices方法中启动的.下面通过源码来分析这个启动过程.
step1.systemserver.startBootstrapServices
private void startBootstrapServices() { // Activity manager runs the show. mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService(); mActivityManagerService.setSystemServiceManager(mSystemServiceManager); mActivityManagerService.setInstaller(installer);}
这里调用mSystemServiceManager.startService()来帮助处理,不过这里启动的是ActivityManagerService.Lifecycle类
setp2.SystemService startService
public SystemService startService(String className) { final Class<SystemService> serviceClass; try {//通过类加载将类加载进内存 serviceClass = (Class<SystemService>)Class.forName(className); } catch (ClassNotFoundException ex) { } //调用startService(serviceClass)进一步处理 return startService(serviceClass); } public <T extends SystemService> T startService(Class<T> serviceClass) { try { final String name = serviceClass.getName(); final T service; try { //通过反射创建service Constructor<T> constructor = serviceClass.getConstructor(Context.class); service = constructor.newInstance(mContext); } // Register it. mServices.add(service); // Start it. try { 启动service service.onStart(); } catch (RuntimeException ex) { } return service; } }
因为这里启动的是ActivityManagerService.Lifecycle类,调用ActivityManagerService.Lifecycle类的start方法来启动,下面就看看这个类.
step3.ActivityManagerService.Lifecycle
public static final class Lifecycle extends SystemService { private final ActivityManagerService mService; public Lifecycle(Context context) { super(context);这个类创建对象的同时就创建出了ActivityManagerService mService = new ActivityManagerService(context); } @Override public void onStart() { //启动ActivityManagerService mService.start(); } public ActivityManagerService getService() { return mService; } }
从上面的代码可以看出,这个类实际上就是帮我们创建出ActivityManagerService的对象,并且调用start方法开启服务.下面在看看ActivityManagerService在创建的时候做了什么.
step4.ActivityManagerService的构造方法
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(); //创建处理主要逻辑的hander mHandler = new MainHandler(mHandlerThread.getLooper()); //创建处理UI的handler,比如处理无响应的对话框,弹出debug模式的对话框 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的类 mProviderMap = new ProviderMap(this); 在ams服务之外创建电池统计服务 // TODO: Move creation of battery stats service outside of activity manager service. //创建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 0 is the first and only user that runs at boot. //UserHandle表示一个用户 mStartedUsers.put(UserHandle.USER_OWNER, new UserState(UserHandle.OWNER, true)); mUserLru.add(UserHandle.USER_OWNER); updateStartedUserArrayLocked(); 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); //管理Activity的类,通过这个运行所有的ActivityStack,辅助启动startactivity mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks); //重新启动时保存最近的任务信息 mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks); //运行时cpu用于收集线程 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.getInstance().addThread(mHandler); }
acitivtymanagerservie的构造函数主要初始化了四大组件的管理类,以及处理主要逻辑的mHandler和处理ui相关的mUiHandler ,比如弹出anr等对话框.
Step5.ActivityManagerService.start()
private void start() {//删除所有的进程组,确保刚启动的时候是没有进程的 Process.removeAllProcessGroups(); 将CPU用来收集线程的线程启动 mProcessCpuThread.start();启动电池服务 mBatteryStatsService.publish(mContext);启动关于和控制应用程序操作的信息的服务 mAppOpsService.publish(mContext); 类似servermanger,只不过这个是用于当前进程 LocalServices.addService(ActivityManagerInternal.class, new LocalService()); }
到这一步ActivityManagerService服务就真正的开启了,就会开始真正的执行前面说的3个主要功能了.
四.主要功能之一的四大组件的统一调度
ActivityManagerService最主要的功能就是统一的管理者activity,service,broadcast,provider的创建,运行,关闭.我们在应用程序中启动acitivity,关闭acitiviy等操作最终都是要通过ams来统一管理的.这个过程非常的复杂,不是一下子可以讲的清楚的,我这里推荐老罗的博客来讲解四大组件的启动过程:
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
- Android应用程序注册广播接收器(registerReceiver)的过程分析
- Android应用程序发送广播(sendBroadcast)的过程分析
- Android应用程序组件Content Provider简要介绍和学习计划
五.主要功能之一的内存管理
我们知道当一个进程中的acitiviy全部都关闭以后,这个空进程并不会立即就被杀死.而是要等到系统内存不够时才会杀死.但是实际上ActivityManagerService并不能够管理内存,android的内存管理是Linux内核中的内存管理模块和OOM进程一起管理的.Android进程在运行的时候,会通过Ams把每一个应用程序的oom_adj值告诉OOM进程,这个值的范围在-16-15,值越低说明越重要,越不会被杀死.当发生内存低的时候,Linux内核内存管理模块会通知OOm进程根据AMs提供的优先级强制退出值较高的进程.因此Ams在内存管理中只是扮演着一个提供进程oom_adj值的功能.真正的内存管理还是要调用OOM进程来完成.下面通过调用Activity的finish()方法来看看内存释放的情况.
当我们手动调用finish()方法或者按back键时都是会关闭activity的,,在调用finish的时候只是会先调用ams的finishActivityLocked方法将当前要关闭的acitiviy的finish状态设置为true,然后就会先去启动新的acitiviy,当新的acitiviy启动完成以后就会通过消息机制通知Ams,Ams在调用activityIdleInternalLocked方法来关闭之前的acitiviy.下面就看看activityIdleInternalLocked的源码
ActivityStackSupevis.activityIdleInternalLocked
final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout, Configuration config) {//所有要暂停的activity ArrayList<ActivityRecord> stops = null; //所有要finish的activity ArrayList<ActivityRecord> finishes = null; ArrayList<UserState> startingUsers = null; int NS = 0; int NF = 0; boolean booting = false; boolean activityRemoved = false; if (allResumedActivitiesIdle()) { if (r != null) {1.通知所有需要内存回收的进程进行内存回收(这些进程都保存在mProgressToGc列表中) mService.scheduleAppGcsLocked(); } 2. 分别拿到所有要stop和finish的activity存放在stops和finishs容器中,然后将记录清空 stops = processStoppingActivitiesLocked(true); NS = stops != null ? stops.size() : 0; if ((NF = mFinishingActivities.size()) > 0) { finishes = new ArrayList<>(mFinishingActivities); mFinishingActivities.clear(); } if (mStartingUsers.size() > 0) { startingUsers = new ArrayList<>(mStartingUsers); mStartingUsers.clear(); } 3. 停止stops中的所有activity for (int i = 0; i < NS; i++) { r = stops.get(i); final ActivityStack stack = r.task.stack; if (stack != null) { if (r.finishing) { stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false); } else { stack.stopActivityLocked(r); } } } 4. 销毁finishs中的所有activity for (int i = 0; i < NF; i++) { r = finishes.get(i); final ActivityStack stack = r.task.stack; if (stack != null) { activityRemoved |= stack.destroyActivityLocked(r, true, "finish-idle"); } } 5.该步骤内部真正地进行内存回收工作,包括杀死不必要的进程mService.trimApplications(); return r; }
在这个方法中除了第一步通知客户进程调用GC来主动回收内存以外,剩下的步骤都是没有操作到内存的,所以说stop或者destroy的回调方法调用的时候只是一个状态的变化,而没有真正意义的对内存进行实质性的停止或者销毁.但是会调用trimApplications方法来进一步操作.
ActivityManagerService.trimApplications
final void trimApplications() { synchronized (this) { int i; 首先删除mRemoveProcess列表中包含的进程.这里一般包含的是crash后的进程,弹出ANR的进程,调用KillBackGroundProgress()方法杀死的进程.也就是说crash或者弹出Anr对话框我们点确定的时候系统并不会立马就将这些进程杀死,而是要等空闲时调用activityIdleInternalLocked方法时才会真正的来杀死. for (i=mRemovedProcesses.size()-1; i>=0; i--) { final ProcessRecord app = mRemovedProcesses.get(i); if (app.activities.size() == 0 && app.curReceiver == null && app.services.size() == 0) { if (app.pid > 0 && app.pid != MY_PID) { 不杀死当前进程 app.kill("empty", false); } else { try { app.thread.scheduleExit(); } catch (Exception e) { // Ignore exceptions. } } cleanUpApplicationRecordLocked(app, false, true, -1);将杀死的进程,移除 mRemovedProcesses.remove(i); if (app.persistent) { addAppLocked(app.info, false, null /* ABI override */); } } } // Now update the oom adj for all processes.告诉OOM Killer所有进程的优先级 updateOomAdjLocked(); } }
通过上面的源码知道,我们调用finish方法时关闭一个acitiviy的时候并不会真正的在内存中销毁它,而只是会调用onDestroy方法而已.除了会杀死mRemoveProcess列表中的进程,另外也就只会告诉OOM Killer所有进程的优先级.并不会主动的去杀死其他进程.
- ActivityManagerService原理分析
- ActivityManagerService分析
- ActivityManagerService分析
- ActivityManagerService的源代码分析
- ActivityManagerService启动过程分析
- ActivityManagerService简要分析
- ActivityManagerService与应用程序通信分析
- ActivityManagerService源码分析(一)
- ActivityManagerService
- 第10章 AmS(ActivityManagerService)内部原理
- android ActivityManagerService 源码分析----Activity管理(一)
- android ActivityManagerService 源码分析----Activity管理(二)
- ActivityManagerService启动新的process过程分析
- android ActivityManagerService 源码分析----Activity管理(二)
- Android4_SRC_分析~ActivityManagerService~图解(一)
- Android4_SRC_分析~ActivityManagerService~图解(一)
- ActivityManagerService服务线程启动源码分析
- ActivityManagerService服务线程启动源码分析
- 模式总结(进行中)
- 【JZOJ 5284】 超级翻转
- SqueezeNet网络原理
- android下的SQLite数据库
- 关于Windows下使用CuteFTP向Ubuntu传文件时提示“请求被拒绝”
- ActivityManagerService原理分析
- 【Leetcode problem 20】-Valid Parentheses
- Nginx配置详解
- vue2.x---vue-router如何在router-link标签绑定click点击事件、keyup、change等事件
- js无隙轮播图片
- 简单工厂模式
- C# 中字符串string和字节数组byte[]的转换
- Java compiler level does not match解决方法
- dubbo-admin的部署