标签:copy from 排序 情况下 活动 RoCE result 图片 regexp gis
copy from : http://gityuan.com/2017/05/19/ams-abstract/
本文基于Android 6.0的源代码,来分析四大组件的管理者AMS
frameworks/base/services/core/java/com/android/server/am/
- ActivityManagerService.java
- ProcessRecord
- ActivityStackSupervisor.java
- ActivityStack.java
- ActiveServices
- BroadcastQueue
Android系统内部非常复杂,经层层封装后,app只需要简单的几行代码便可完成任一组件的启动/结束、 生命周期的操作。然而每一次看似简单的操作,背后所有的复杂工作都是交由系统来完成。
组件启动后,首先需要依赖进程,那么就需要先创建进程,系统需要记录每个进程,这便产生了ProcessRecord。 Android中,对于进程的概念被弱化,通过抽象后的四大组件。让开发者几乎感受不到进程的存在。 当应用退出时,进程也并非马上退出,而是成为cache/empty进程,下次该应用再启动的时候,可以不用 再创建进程直接初始化组件即可,提高启动速度。先来说一说进程。
Android系统中用于描述进程的数据结构是ProcessRecord对象,AMS便是管理进程的核心模块。四大组件 (Activity,Service, BroadcastReceiver, ContentProvider)定义在AndroidManifest.xml文件, 每一项都可以用属性android:process指定所运行的进程。同一个app可以运行在同一个进程,也可以运行在多个进程, 甚至多个app可以共享同一个进程。例如:AndroidManifest.xml中定义Service:
<service android:name =".GityuanService" android:process =":remote" >
<intent-filter>
<action android:name ="com.action.gityuan" />
</intent-filter>
</service>
GityuanService这个服务运行在remote进程。
以一幅图来展示AMS管理进程的相关成员变量以及ProcessRecord对象:
这里只介绍AMS的进程相关的成员变量:
其中最为常见的是mProcessNames,mPidsSelfLocked,mLruProcesses这3个对象;
系统AMS这边是由ProcessRecord对象记录进程,进程自身比较重要成员变量如下:
任一组件都运行在某个进程,再来说说ProcessRecord对象中与组件的关联关系:
成员变量 | 说明 | 对应组件 |
---|---|---|
activities | 记录进程的ActivityRecord列表 | Activity |
services | 记录进程的ActivityRecord列表 | Service |
executingServices | 记录进程的正在执行的ActivityRecord列表 | Service |
connections | 记录该进程bind的ConnectionRecord集合 | Service |
receivers | 动态注册的广播接收者ReceiverList集合 | Broadcast |
curReceiver | 当前正在处理的一个广播BroadcastRecord | Broadcast |
pubProviders | 该进程发布的ContentProviderRecord的map表 | ContentProvider |
conProviders | 该进程所请求的ContentProviderConnection列表 | ContentProvider |
说明:
组件启动,先填充完进程信息,接下来还需要完善组件本身的信息,各个组件在system_server的核心信息记录如下:
可见,AMS是整个四大组件最为核心的对象,所有组件都或多或少依赖该对象的数据结构信息。 关系图如下:点击查看大图
AMS对象
public final class ActivityManagerService extends ...{
//当前聚焦的Activity
ActivityRecord mFocusedActivity = null;
//用于管理各个Activity栈
final ActivityStackSupervisor mStackSupervisor;
}
ASS对象
public final class ActivityStackSupervisor implements DisplayListener {
//桌面app所在栈
ActivityStack mHomeStack;
//当前可以接受Input事件,或许启动下一个Activity的栈
ActivityStack mFocusedStack;
//当该值等于mFocusedStack,代表当前栈顶的Activity已进入resumed状态;
//当该值等于上一个旧栈时,代表正处理activity切换状态;
private ActivityStack mLastFocusedStack;
//在完成相应目标前,等待新的Activity成为可见的Activity列表
final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<>();
//等待找到下一个可见Activity的等待列表
final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible = new ArrayList<>();
//等待找到下一个已启动Activity的等待列表
final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched = new ArrayList<>();
//等待上一个activity安置完成,则即将进入被stopped的Activity列表
final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<>();
//等待上一个activity安置完成,则即将进入被finished的Activity列表
final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<>();
//即将进入sleep状态的进程所对应的Activity列表
final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<>();
}
AS对象
final class ActivityStack{
//记录该栈中所有的task
private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();
//按LRU方式排序的Activity列表,队尾成员是最新活动的Activity
final ArrayList<ActivityRecord> mLRUActivities = new ArrayList<>();
//正在执行pausing过程的Activity
ActivityRecord mPausingActivity = null;
//已处于paused状态的Activity
ActivityRecord mLastPausedActivity = null;
//已处于Resumed状态的Activity
ActivityRecord mResumedActivity = null;
}
[-> ActiveServices.java]
public final class ActiveServices {
//记录不同User下所有的Service信息
final SparseArray<ServiceMap> mServiceMap = new SparseArray<>();
//bind service的连接信息,以IServiceConnection的Bp端作为Keys
final ArrayMap<IBinder, ArrayList<ConnectionRecord>> mServiceConnections = new ArrayMap<>();
//已请求启动但尚未启动的Service列表
final ArrayList<ServiceRecord> mPendingServices = new ArrayList<>();
//crash后需要计划重启的Service列表
final ArrayList<ServiceRecord> mRestartingServices = new ArrayList<>();
//正在执行destroyed的service列表
final ArrayList<ServiceRecord> mDestroyingServices = new ArrayList<>();
}
[-> ActivityManagerService.java]
public final class ActivityManagerService extends ...{
//前台广播队列
BroadcastQueue mFgBroadcastQueue;
//后台广播队列
BroadcastQueue mBgBroadcastQueue;
//广播队列数组,也就是前台和后台广播队列
final BroadcastQueue[] mBroadcastQueues = new BroadcastQueue[2];
//粘性广播,[userId,action,ArrayList<Intent>]
final SparseArray<ArrayMap<String, ArrayList<Intent>>> mStickyBroadcasts;
//动态注册的广播接收者,其中key为客户端InnerReceiver的Bp端,value为ReceiverList
final HashMap<IBinder, ReceiverList> mRegisteredReceivers = new HashMap<>();
//从广播intent到已注册接收者的解析器
final IntentResolver<BroadcastFilter, BroadcastFilter> mReceiverResolver;
}
[-> BroadcastQueue.java]
public final class BroadcastQueue{
//并行广播列表
final ArrayList<BroadcastRecord> mParallelBroadcasts = new ArrayList<>();
//串行广播列表
final ArrayList<BroadcastRecord> mOrderedBroadcasts = new ArrayList<>();
//即将要处理的串行广播,等待目标进程创建完成。每个广播队列只有一个,其他必须等待该广播完成。
BroadcastRecord mPendingBroadcast = null;
}
[-> ActivityManagerService.java]
public final class ActivityManagerService extends ...{
//记录系统所有的provider信息
final ProviderMap mProviderMap;
//记录有client正在等待的provider列表,当provider发布完成则从该队列移除
final ArrayList<ContentProviderRecord> mLaunchingProviders;
}
[-> ProviderMap.java]
public final class ProviderMap {
//以provider名字(auth)为key的方式所记录的provider信息
private final HashMap<String, ContentProviderRecord> mSingletonByName;
//以provider组件名(ComponentName)为key的方式所记录的provider信息
private final HashMap<ComponentName, ContentProviderRecord> mSingletonByClass;
//记录不同UserId下的,以auth为key的方式所记录的provider信息
private final SparseArray<HashMap<String, ContentProviderRecord>> mProvidersByNamePerUser;
//记录不同UserId下的,以ComponentName为key的方式所记录的provider信息
private final SparseArray<HashMap<ComponentName, ContentProviderRecord>> mProvidersByClassPerUser;
}
同一个provider组件名,可能对应多个provider名。
关系图如下:点击查看大图
App端的组件信息,都保存在ActivityThread和LoadedApk这两个对象,主要保存信息:
标签:copy from 排序 情况下 活动 RoCE result 图片 regexp gis
原文地址:https://www.cnblogs.com/Oude/p/12376254.html