1、AMS中的进程管理
final ArrayList<ProcessRecord> mLruProcesses = new ArrayList<ProcessRecord>();
在AMS的内部属性中使用mLruProcesses集合保存所有的进程信息,AMS将所有进程按照优先级从低到高的顺序保存着对应的ProcessRecord信息,即排在前面的进程优先级越低,当系统内存不足时优先被Killer杀死;
在AMS的工作过程中,会不断调用updateLruProcessLocked()方法进行进程排序,在mLruProcesses()中保存按照以下规则保存数据
在AMS中越重要的进程会放在mLruProcesses集合的最后面,正在使用交互的进程会保存在最后,然后按照其他进程、Service进程、Activity进程的顺序重要行逐步增加,Activity进程的重要性最高,为了区分各个进程的位置,AMS中引入mLruProcessServiceStart和mLruProcessActivityStart变量保存二者的起始位置,在添加时当进程中包含活动则添加到mLruProcessActivityStart之后,如果不包含活动但包含Service服务,则添加到mLruProcessServiceStart之后;
final void updateLruProcessLocked(ProcessRecord app, boolean activityChange,
ProcessRecord client) {
final boolean hasActivity = app.activities.size() > 0 || app.hasClientActivities
|| app.treatLikeActivity || app.recentTasks.size() > 0;//1、
final boolean hasService = false;
if (!activityChange && hasActivity) {
// 如果activityChange为false则无需改变位置
return;
}
mLruSeq++; // 更新编号
final long now = SystemClock.uptimeMillis();
app.lastActivityTime = now; // 保存更新的时间
if (hasActivity) {
// 如果包含Activity,
final int N = mLruProcesses.size();
if (N > 0 && mLruProcesses.get(N-1) == app) {
return;
}
} else {
if (mLruProcessServiceStart > 0 // 不包含Activit但已经存在其他段的最末尾,也无需更新
&& mLruProcesses.get(mLruProcessServiceStart-1) == app) {
return;
}
}
int lrui = mLruProcesses.lastIndexOf(app); // 获取目前位置的index
if (app.persistent && lrui >= 0) {
return;
}
if (lrui >= 0) {
if (lrui < mLruProcessActivityStart) {
// 如果index小于mLruProcessActivityStart,则Activity段前移一位
mLruProcessActivityStart--;
}
if (lrui < mLruProcessServiceStart) {
//如果index小于mLruProcessServiceStart,则Activity段前移一位
mLruProcessServiceStart--;
}
mLruProcesses.remove(lrui); //移除原来的app信息
}
int nextIndex; //
if (hasActivity) {
final int N = mLruProcesses.size();
if ((app.activities.size() == 0 || app.recentTasks.size() > 0)
&& mLruProcessActivityStart < (N - 1)) {
mLruProcesses.add(N - 1, app); // 如果进程不存在活动,但recentTasks存在任务则添加到最后位置
final int uid = app.info.uid;
for (int i = N - 2; i > mLruProcessActivityStart; i--) {
ProcessRecord subProc = mLruProcesses.get(i);
if (subProc.info.uid == uid) {
// 遍历集合中进程,匹配uid相等的进程
if (mLruProcesses.get(i - 1).info.uid != uid) {
//处理其他进程,将该用户进程前移,其他进程后移
ProcessRecord tmp = mLruProcesses.get(i);
mLruProcesses.set(i, mLruProcesses.get(i - 1));
mLruProcesses.set(i - 1, tmp);
i--;
}
} else {
break;
}
}
} else {
mLruProcesses.add(app); // 直接添加进程信息
}
nextIndex = mLruProcessServiceStart;
} else if (hasService) {
存在Service服务
mLruProcesses.add(mLruProcessActivityStart, app); // 保存在Service服务的开始位置
nextIndex = mLruProcessServiceStart;
mLruProcessActivityStart++; // mLruProcessActivityStart后移
} else {
int index = mLruProcessServiceStart;
if (client != null) {
int clientIndex = mLruProcesses.lastIndexOf(client);//获取当前客户端最高级的位置
if (clientIndex <= lrui) {
clientIndex = lrui; // 如果最高级小则赋值最高级为lrui
}
if (clientIndex >= 0 && index > cli