本文主要是介绍管理Activity和组件运行状态的系统进程--ActivityManagerService(AMS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
系统代码分析基于Android10.0
Android 10引入了许多新特性和改进,其中包括对Android应用程序管理系统(AMS)的一些重大改变。AMS(Activity Manager Service)是Android操作系统的重要组件之一,负责管理应用程序的生命周期、任务栈和任务切换等功能。下面是Android 10系统中AMS的一些主要特点:
活动隔离(Activity Isolation):在Android 10中,引入了一种新的活动隔离模型,称为“ActivityTask”。传统上,Android应用程序在单个进程中运行,并且所有活动都在同一个进程中。但是,ActivityTask允许将每个活动放在单独的进程中,以提高系统的稳定性和安全性。
后台启动限制(Background Start Restrictions):为了提高系统性能和电池寿命,Android 10对后台启动应用程序进行了限制。AMS在Android 10中引入了新的限制规则,以防止应用程序在后台自动运行,并限制了后台应用程序对系统资源的访问。
活动栈管理(Activity Stack Management):Android 10对活动栈管理进行了一些改进。现在,AMS可以在应用程序的任务栈中标记活动,以表明它们的重要性和关联性。这有助于系统更好地管理任务切换和应用程序的多任务处理。
系统级活动(System-level Activities):Android 10引入了一些新的系统级活动,这些活动可以通过系统应用程序启动,而无需用户交互。这些系统级活动可以用于执行特定的系统操作,例如显示系统设置或权限请求。
后台服务限制(Background Service Restrictions):为了增强系统的安全性和性能,Android 10对后台服务进行了限制。AMS现在会更加严格地监控后台服务的运行,并限制它们对系统资源的使用。
一、AMS功能概述
AMS是Android提供的一个用于管理Activity(和其他组件)运行状态的系统进程,也是我们编写APK应用程序时使用的最频繁的一个系统服务。 AMS是寄存于systemServer中的。它会在系统启动时,创建一个线程来循环处理客户的请求。
1.1 AMS启动
/frameworks/base/services/java/com/android/server/SystemServer.java
ActivityTaskManagerService atm =mSystemServiceManager.startService( ActivityTaskManagerService.Lifecycle.class).getService();// 通过AMS内部类Lifecycle 来实例化mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);mActivityManagerService.setSystemServiceManager(mSystemServiceManager);mActivityManagerService.setInstaller(installer);mWindowManagerGlobalLock = atm.getGlobalLock();
我们可以看到通过Android10系统通过了内部静态类Lifecycle来实例化AMS
// 通过AMS内部类Lifecycle 来实例化
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
可以看下内部类Lifecycle结构:
最后调用startService是SysemServiceManager的startService
SystemServiceManager.java
实例化ActivityServiceManager后,还在SysetmServer.java调用了 ams的setSystemProcess ()方法,向Service Manager注册 。
1.2 组件状态管理
这里组件不仅仅指Activity,而是所有四大组件。状态管理包括组件的开启,关闭等一些列操作。 例如: startActivity、startActivityAndWait、activityPaused、startService、stopService、removeContentProvider等 。
查询当前组件运行情况,如:getCallingActivity、getServices等。
Task相关: removeTask、removeSubTask、moveTaskBackwards、moveTaskToFrom 。
系统运行相关:getMemoryInfo、setDebugApp
二、管理当前系统中Activity状态--Activity Stack
从名称看,Activity Stack是管理当前系统中所有Activity状态的一个数据结构。
2.1 ActivityState
enum ActivityState {INITIALIZING, // 正在初始化RESUMED, // 回复PAUSING, //正在暂停PAUSED, // 已经暂停STOPPING, //正在停止STOPPED, //已经停止FINISHING, //正在完成 DESTROYING, //正在销毁DESTROYED, // 已经销毁RESTARTING_PROCESS // 重启过程 }
结合Activity状态改变时其自身所能收到的回调函数,如下图:
有一些在ActivityStack中, 有一些在ActivityStackSupervisor中 , 下列是几个重要的ArrayList :
记录特殊状态 :
2.2 AMS的主要工作就是管理、记录、查询
2.3 AMS是系统进程的一部分,且独立运行独立的线程中
从内核角度,AMS是普通进程中的一部分,它提供的是全局性的系统服务。 AMS的任务自负责保管组件的状态信息,像Activity的UI界面如何绘制如何在物理屏幕上显示等工作则是由WindowManagerService和SurfaceFlinger来完成的 。
三、startActivity流程
大家对startActivity(Intent) 功能一定不陌生,用于启动一个目标Activity,但是它到底经历哪些事情呢?首先从startActivity()所经历的函数调用流程来看
Activity --> startActivity@ContextImpl.java -->execStartActivity@Instrumentation.java --> startActivity@ActivityManagerService.java
所以最后都是在AMS中实现的,接下来就要分析AMS内部对startActivity做了哪些工作?
AMS最后会把startActivity这些函数转到ActivityTaskManagerService里面处理 。
/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
int startActivityAsUser(IApplicationThread caller, String callingPackage,Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,boolean validateIncomingUser) {enforceNotIsolatedCaller("startActivityAsUser");userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");// TODO: Switch to user app stacks here.return getActivityStartController().obtainStarter(intent, "startActivityAsUser").setCaller(caller).setCallingPackage(callingPackage).setResolvedType(resolvedType).setResultTo(resultTo).setResultWho(resultWho).setRequestCode(requestCode).setStartFlags(startFlags).setProfilerInfo(profilerInfo).setActivityOptions(bOptions).setMayWait(userId).execute();}
enforceNotIsolatedCaller("startActivityAsUser"); 检查调用者是否属于被隔离的对象。
getActivityStartController().checkTargetUser(userId, validateIncomingUser,
Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
转到了 /frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.java
代码如下:
handleIncoming检查调用者是否有权利执行这一操作。
getActivityStartController().obtainStarter获得了 ActivityStater ,我们看一下ActivityStarter的execute代码:
startActivityMayWait()逻辑非常多,核心逻辑大概如下:
1. 首先确定这个目标的Activity:如果是显式的Intent,Intent信息中就已经带有目标Activity相关信息 ,否则就调用resolveActivity()进行查找 。
2. 判断目标Activity所属进程是不是重量级(heavy-weight)的,如果当前系统已经存在重量级进程不是即将要启动的这个,那么就要给Intent重新赋值。
3.权限判断,Activity调度。
4. Activity实例化
5.Activity启动 。AMS会调用该活动的onCreate,onStart,onResume方法,从背景状态切换到前台。
6. 结果返回 。
7.释放资源 。
四、完成同一任务的“集合”---Activity Task
4.1 后进先出 --- Last In,First out
假设在一个Activity中,用户又启动了另一个Activity ,那么当用户按下Back键后,栈顶元素会自动被销魂 。
4.2 管理ActivityTask
应用程序可以通过2种方法来影响Activty Task的默认行为
方法1:在<Activity>标签中指定属性
android:taskAffinity
android:launchMode
android:allowTaskReparenting
android:clearTaskOnLaunch
android:alwaysRetainTaskStae
android:finishOnTaskLaunch
方法2:使用Intent标志
启动一个Activity我们也可以通过Intent来动态指定所需的task的属性值。
五、Instrumentation机制
在Android 10系统中,Instrumentation是一个用于监视和控制的强大工具。它提供了一种机制,允许应用程序和系统服务对其他应用程序的行为进行监控和修改。Instrumentation在Android的内部实现中起着至关重要的作用,尤其是在系统服务和应用程序生命周期管理方面。
Instrumentation的主要功能包括:
- 监视应用程序行为:Instrumentation可以监视应用程序的执行和操作,包括应用程序的启动、停止、资源使用等。这有助于开发者进行性能分析、调试和错误排查。
- 修改应用程序行为:通过Instrumentation,可以对应用程序的行为进行修改或增强。这包括修改应用程序的内部逻辑、拦截和处理特定事件等。
- 安全性与权限管理:Instrumentation可以用于实现安全性检查和权限管理。它可以帮助防止恶意应用程序的行为,保护用户数据和隐私。
- 测试和调试:Instrumentation还可以用于开发和测试阶段,帮助开发者进行应用程序的测试和调试。
要使用Instrumentation,通常需要编写一个Instrumentation类,该类继承自android.app.Instrumentation
类,并实现必要的方法。然后,将该Instrumentation类配置到AndroidManifest.xml文件中,或在代码中动态设置。需要注意的是,由于Instrumentation涉及到对应用程序和系统行为的深入监控和控制,因此在使用时需要谨慎处理权限和安全性问题。在普通应用程序开发中,通常不需要直接使用Instrumentation,但在系统级开发和测试中,它是一个非常有用的工具。
总结:
Android 10系统的AMS通过引入活动隔离、后台启动限制、活动栈管理、系统级活动和后台服务限制等功能,提高了系统的性能、安全性和资源管理能力。这些改进使得应用程序在Android 10上更加稳定、高效,并提供了更好的用户体验。
这篇关于管理Activity和组件运行状态的系统进程--ActivityManagerService(AMS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!