管理Activity和组件运行状态的系统进程--ActivityManagerService(AMS)

本文主要是介绍管理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 :

ArrayListDescription
mTaskHistory (ActivityStack)
所有Activity的信息都在之类记录,直到它被destroy
 mLRUActivities (ActivityStack)
正在运行的Activity的列表集合,以最近使用情况来排序,既队头是最近使用最少得元素 
mStopingActivitys (ActivityStackSupervisor)已经可以被Stop,但是还的等待下一个Activity处于就绪状态
mGoingToSleepActivities (ActivityStackSupervisor)正在进入睡眠状态
mNoAnimActivities (ActivityStackSupervisor)不考虑状态间迁移动画
mFinishingActivities (ActivityStackSupervisor)已经可以被finiished,但还需要等待一个上一个Activity就绪 

 记录特殊状态 :

ActivityRecordDescription
mPausingActivity
当前正在被暂停(pasuing)的Activity
mLastPausedActivity
上一个被暂停的Activity
 mResumedActivity
当前被恢复(resumed)的Activity,可以为null
mLastNoHistoryActivity
一旦用户离开指定“无历史记录”的活动,就必须将其删除。

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的主要功能包括:

  1. 监视应用程序行为:Instrumentation可以监视应用程序的执行和操作,包括应用程序的启动、停止、资源使用等。这有助于开发者进行性能分析、调试和错误排查。
  2. 修改应用程序行为:通过Instrumentation,可以对应用程序的行为进行修改或增强。这包括修改应用程序的内部逻辑、拦截和处理特定事件等。
  3. 安全性与权限管理:Instrumentation可以用于实现安全性检查和权限管理。它可以帮助防止恶意应用程序的行为,保护用户数据和隐私。
  4. 测试和调试:Instrumentation还可以用于开发和测试阶段,帮助开发者进行应用程序的测试和调试。

要使用Instrumentation,通常需要编写一个Instrumentation类,该类继承自android.app.Instrumentation类,并实现必要的方法。然后,将该Instrumentation类配置到AndroidManifest.xml文件中,或在代码中动态设置。需要注意的是,由于Instrumentation涉及到对应用程序和系统行为的深入监控和控制,因此在使用时需要谨慎处理权限和安全性问题。在普通应用程序开发中,通常不需要直接使用Instrumentation,但在系统级开发和测试中,它是一个非常有用的工具。

总结:

     Android 10系统的AMS通过引入活动隔离、后台启动限制、活动栈管理、系统级活动和后台服务限制等功能,提高了系统的性能、安全性和资源管理能力。这些改进使得应用程序在Android 10上更加稳定、高效,并提供了更好的用户体验。

这篇关于管理Activity和组件运行状态的系统进程--ActivityManagerService(AMS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654244

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Linux进程终止的N种方式详解

《Linux进程终止的N种方式详解》进程终止是操作系统中,进程的一个重要阶段,他标志着进程生命周期的结束,下面小编为大家整理了一些常见的Linux进程终止方式,大家可以根据需求选择... 目录前言一、进程终止的概念二、进程终止的场景三、进程终止的实现3.1 程序退出码3.2 运行完毕结果正常3.3 运行完毕