管理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上更加稳定、高效,并提供了更好的用户体验。

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值