美文网首页
Android ActivityManagerService--

Android ActivityManagerService--

作者: DarcyZhou | 来源:发表于2023-10-29 08:52 被阅读0次

    本文转载自:

    本文基于Android 11.0源码分析

    前言

      ActivityManagerService(简称AMS) 主要负责四大组件的启动、切换、调度以及应用进程的管理和调度工作。本篇内容介绍一下AMS中重要内部类和组成结构。

    1.AMS重要类介绍

    1.1 ProcessRecord数据结构

    1.1.1 第一类数据:描述身份的数据

    AMS04.png

    1.1.2 第二类数据:描述进程中组件的数据

    AMS05.png

    1.1.3 第三类数据:描述进程状态的数据

    • int maxAdj:进程的adj上限(adjustment);

    • int curRawAdj:当前正在计算的adj,这个值有可能大于maxAdj;

    • int setRawAdj:上次计算的curRawAdj设置到lowmemorykiller系统后的adj;

    • int curAdj:当前正在计算的adj,这是curRawAdj被maxAdj削平的值;

    • int setAdj:上次计算的curAdj设置到lowmemorykiller系统后的adj;

    • int verifiedAdj:setAdj校验后的值;

    • int curSchedGroup:正在计算的调度组;

    • int setSchedGroup:保存上次计算的调度组;

    • int curProcState:正在计算的进程状态;

    • int repProcState:发送给apk进程的状态;

    • int setProcState:保存上次计算的进程状态;

    • int pssProcState:pss进程状态;

    • ProcessState baseProcessTracker:进程状态监测器;

    • int adjSeq:计算adj的序列数;

    • int lruSeq:lru序列数;

    • IBinder forcingToForeground:强制将进程的状态设置为前台运行的IBinder,IBinder代表的是组件的ID,这个是整个android系统唯一。

    1.1.4 第四类数据:和pss相关的数据

      我们先来普及一下一些名词:

    VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
    RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)
    PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
    USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
    一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
    
    • long initialIdlePss:初始化pss;

    • long lastPss:上次pss;

    • long lastSwapPss:上次SwapPss数据;

    • long lastCachedPss:上次CachedPss数据;

    • long lastCachedSwapPss:上次CachedSwapPss数据。

    1.1.5 第五类数据:和时间相关的数据

    • long lastActivityTime:上次使用时间;

    • long lastPssTime:上次计算pss的时间;

    • long nextPssTime:下次计算pss的时间;

    • long lastStateTime:上次设置进程状态的时间;

    • long lastWakeTime:持有wakelock的时长;

    • long lastCpuTime:上次计算占用cpu的时长;

    • long curCpuTime:当前最新占用cpu的时长;

    • long lastRequestedGc:上次发送gc命令给apk进程的时间;

    • long lastLowMemory:上次发送低内存消息给apk进程的时间;

    • long lastProviderTime:上次进程中ContentProvider被使用的时间;

    • long interactionEventTime:上次发送交互时间时间;

    • long fgInteractionTime:变成前台的时间。

    1.1.6 第六类数据:crash和anr相关的数据

    • IBinder.DeathRecipient deathRecipient:apk进程退出运行的话,会触发这个对象的binderDied()方法,来回收系统资源;

    • boolean crashing:进程已经crash;

    • Dialog crashDialog:crash对话框;

    • boolean forceCrashReport:强制crash对话框显示;

    • boolean notResponding:是否处于anr状态;

    • Dialog anrDialog:anr显示对话框;

    • Runnable crashHandler:crash回调;

    • ActivityManager.ProcessErrorStateInfo crashingReport:crash报告的进程状态;

    • ActivityManager.ProcessErrorStateInfo notRespondingReport:anr报告的进程状态;

    • String waitingToKill:后台进程被kill原因;

    • ComponentName errorReportReceiver:接收error信息的组件。

    1.1.7 第七类数据:和instrumentation相关的数据

      instrumentation 也可以说是apk的一个组件,如果我们提供的话,系统会默认使用Instrumentation.java类,按照我们一般的理解,UI线程控制activity的生命周期,是直接调用Activity类的方法,实际是这样子的,UI线程调用的是instrumentation的方法,由它在调用Activity涉及生命周期的方法,所有如果我们覆写了instrumentation的这些方法,就可以了解所有的Activity的生命周期了。

    • ComponentName instrumentationClass:AndroidManifest.xml中定义的instrumentation信息;

    • ApplicationInfo instrumentationInfo:instrumentation应用信息;

    • String instrumentationProfileFile:instrumentation配置文件;

    • IInstrumentationWatcher instrumentationWatcher:instrumentation监测器;

    • IUiAutomationConnection instrumentationUiAutomationConnection:UiAutomation连接器;

    • ComponentName instrumentationResultClass:返回结果组件。

    1.1.8 第八类数据:电源信息和调试信息

    • BatteryStatsImpl mBatteryStats:电量信息;

    • BatteryStatsImpl.Uid.Proc curProcBatteryStats:当前进程电量信息;

    • boolean debugging:处于调试中;

    • boolean waitedForDebugger:等待调试;

    • Dialog waitDialog:等待对话框;

    • String adjType:adj类型(或者说标示);

    • int adjTypeCode:adj类型码(也是一种标示);

    • Object adjSource:改变adj的组件记录表;

    • int adjSourceProcState:影响adj的进程状态;

    • Object adjTarget:改变adj的组件;

    • String shortStringName:进程记录表的字符串显示;

    • String stringName:进程记录表的字符串显示。

    1.1.9 第九类数据 进程相关的boolean值

    (1)进程声明周期相关的

    • boolean starting:进程正在启动;

    • boolean removed:进程系统资源已经清理;

    • boolean killedByAm:进程被AMS主动kill掉;

    • boolean killed:进程被kill掉了;

    • boolean persistent:常驻内存进程。

    (2)组件状态影响进程行为的

    • boolean empty:空进程,不含有任何组件的进程;

    • boolean cached:缓存进程;

    • boolean bad:60s内连续crash两次的进程被定义为bad进程;

    • boolean hasClientActivities:进程有Activity绑定其他Service;

    • boolean hasStartedServices:进程中包含启动了的Service;

    • boolean foregroundServices:进程中包含前台运行的Service;

    • boolean foregroundActivities:进程中包含前台运行的Activity;

    • boolean repForegroundActivities:

    • boolean systemNoUi:系统进程,没有显示UI;

    • boolean hasShownUi:进程启动开始,是否已经显示UI;

    • boolean pendingUiClean

    • boolean hasAboveClient:进程中有组件使用BIND_ABOVE_CLIENT标志绑定其他Service;

    • boolean treatLikeActivity:进程中有组件使用BIND_TREAT_LIKE_ACTIVITY标志绑定其他Service;

    • boolean execServicesFg:前台执行Service;

    • boolean setIsForeground:设置运行前台UI。

    (3)其他

    • boolean serviceb:进程存在service B list中;

    • boolean serviceHighRam:由于内存原因,进程强制存在service B list中;

    • boolean notCachedSinceIdle:进程自从上次空闲,是否属于缓存进程;

    • boolean procStateChanged:进程状态改变;

    • boolean reportedInteraction:是否报告交互事件;

    • boolean unlocked:解锁状态下进程启动;

    • boolean usingWrapper:zygote是否使用了wrapper启动apk进程;

    • boolean reportLowMemory:报告低内存;

    • boolean inFullBackup:进程中存在backup组件在运行;

    • boolean whitelistManager:和电源管理相关。

    1.2 ProcessRecord容器

    1.2.1 永久性容器

    • mProcessNames:根据进程名字检索进程记录表;

    • mPidsSelfLocked:根据进程pid检索进程记录表;

    • mLruProcesses:lru进程记录表容器,这个容器使用的是最近最少使用算法对进程记录表进行排序,越是处于上层的越是最近使用的,对于系统来说就是最重要的,在内存吃紧回收进程时,越不容易被回收,实现起来也很简单。

    1.2.2 临时性容器

    • mPersistentStartingProcesses:常驻内存进程启动时容器;

    • mProcessesOnHold:进程启动挂起容器;

    • mProcessesToGc:将要执行gc回收的进程容器;

    • mPendingPssProcesses:将要计算Pss数据的进程容器。

    1.3 四大组件记录表的容器

      组件运行才是进程存在的意义,由于android系统进程间的无缝结合,所以系统需要控制到组件级别,所有的组件信息都需要映射到系统,一个ActivityRecord记录对应一个Activity的信息,一个ServiceRecord记录对应一个Service的信息,一个ConnectionRecord记录对应一个bind service的客户端信息,一个ReceiverList对应处理同一事件的一组广播,一个ContentProviderRecord记录对应一个ContentProvider信息,一个ContentProviderConnection对应一个进程中的所有ContentProvider客户端。

    1.3.1 activity记录

    • activities:ActivityRecord的容器,进程启动的所有的activity组件记录表。

    1.3.2 service记录

    • services:ServiceRecord的容器,进程启动的所有的service组件记录表;

    • executingServices:正在运行(executing)的ServiceRecord是怎么定义的?首先需要明确的是系统是怎么控制组件的?发送消息给apk进程,apk进程处理消息,上报消息完成,这被定义为一个完整的执行过程,因此正在执行(executing)被定义为发送消息到上报完成这段时间;

    • connections:ConnectionRecord容器,绑定service的客户端记录表。

    1.3.3 广播接收器记录

    • receivers:ReceiverList容器,广播接收器的记录表。

    1.3.4 ContentProvider记录

    • pubProviders:名字到ContentProviderRecord的映射容器,pub是publish(发布)的意思,ContentProvider需要安装然后把自己发布到系统(AMS)中后,才能使用,安装指的是apk进程加载ContentProvider子类、初始化、创建数据库等过程,发布是将ContentProvider的binder客户端注册到AMS中;

    • conProviders:ContentProviderConnection容器,使用ContentProvider的客户端记录表。

    相关文章

      网友评论

          本文标题:Android ActivityManagerService--

          本文链接:https://www.haomeiwen.com/subject/kegmvdtx.html