管理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

相关文章

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)