summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Hui Yu <huiyu@google.com> 2020-05-21 16:38:03 -0700
committer Hui Yu <huiyu@google.com> 2020-05-26 09:49:03 -0700
commitca10d44c13cb24573ca024e842fecdf44ece1420 (patch)
treebd9bfc27e5978be9ecb46cdd71c55ed0f2c620dc
parent2cdbcea8ba29bbb8d50511a9fa6e5bd2763fb153 (diff)
updateAppUidRecLocked() needs to run for all ProcessRecord of a
UidRecord. for example, adb shell dumpsys activity -a | grep *APP* | grep quicksearchbox *APP* UID 10148 ProcessRecord{a86bfc8 19343:com.google.android.googlequicksearchbox:search/u0a148} *APP* UID 10148 ProcessRecord{8932590 20318:com.google.android.googlequicksearchbox:assistant/u0a148} *APP* UID 10148 ProcessRecord{7458b77 19013:com.google.android.googlequicksearchbox:interactor/u0a148} UID 10148 has three ProcessRecord. After uidRec.reset(), for uidRec that has multiple processes(ProcessRecord), We need apply all ProcessRecord into UidRecord, otherwise, the UidRecord's proc state and capability are wrong. Bug: 157269041, 152709842 Test: Use the reproduce step in b/152709842, squeeze phone and talk to Assistant. Change-Id: Id46dbd4f428968fb2029255fbcf61bba328b582c
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java9
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java17
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java2
-rw-r--r--services/core/java/com/android/server/am/UidRecord.java2
4 files changed, 26 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index cca604655f3d..ec12aebc37f6 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -4914,8 +4914,13 @@ public final class ActiveServices {
// TODO: remove this toast after feature development is done
void showWhileInUseDebugToastLocked(int uid, int op, int mode) {
- for (int i = mAm.mProcessList.mLruProcesses.size() - 1; i >= 0; i--) {
- ProcessRecord pr = mAm.mProcessList.mLruProcesses.get(i);
+ final UidRecord uidRec = mAm.mProcessList.getUidRecordLocked(uid);
+ if (uidRec == null) {
+ return;
+ }
+
+ for (int i = uidRec.procRecords.size() - 1; i >= 0; i--) {
+ ProcessRecord pr = uidRec.procRecords.valueAt(i);
if (pr.uid != uid) {
continue;
}
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index f7a158a885c6..a81590c8c022 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -324,8 +324,21 @@ public final class OomAdjuster {
boolean success = applyOomAdjLocked(app, doingAll, now, SystemClock.elapsedRealtime());
if (uidRec != null) {
- updateAppUidRecLocked(app);
- // If this proc state is changed, need to update its uid record here
+ // After uidRec.reset() above, for UidRecord that has multiple processes (ProcessRecord)
+ // , We need to apply all ProcessRecord into UidRecord.
+ final ArraySet<ProcessRecord> procRecords = app.uidRecord.procRecords;
+ for (int i = procRecords.size() - 1; i >= 0; i--) {
+ final ProcessRecord pr = procRecords.valueAt(i);
+ if (!pr.killedByAm && pr.thread != null) {
+ if (pr.isolated && pr.numberOfRunningServices() <= 0
+ && pr.isolatedEntryPoint == null) {
+ // No op.
+ } else {
+ // Keeping this process, update its uid.
+ updateAppUidRecLocked(pr);
+ }
+ }
+ }
if (uidRec.getCurProcState() != PROCESS_STATE_NONEXISTENT
&& (uidRec.setProcState != uidRec.getCurProcState()
|| uidRec.setCapability != uidRec.curCapability
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 108fb7dff2cd..9f2a77c05d2b 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -2808,6 +2808,7 @@ public final class ProcessList {
uidRec.curCapability);
}
proc.uidRecord = uidRec;
+ uidRec.procRecords.add(proc);
// Reset render thread tid if it was already set, so new process can set it again.
proc.renderThreadTid = 0;
@@ -2901,6 +2902,7 @@ public final class ProcessList {
}
if (old != null && old.uidRecord != null) {
old.uidRecord.numProcs--;
+ old.uidRecord.procRecords.remove(old);
if (old.uidRecord.numProcs == 0) {
// No more processes using this uid, tell clients it is gone.
if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java
index acf8b2e84821..cb781c4951be 100644
--- a/services/core/java/com/android/server/am/UidRecord.java
+++ b/services/core/java/com/android/server/am/UidRecord.java
@@ -21,6 +21,7 @@ import android.app.ActivityManager;
import android.content.pm.PackageManager;
import android.os.SystemClock;
import android.os.UserHandle;
+import android.util.ArraySet;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoUtils;
@@ -44,6 +45,7 @@ public final class UidRecord {
boolean idle;
boolean setIdle;
int numProcs;
+ ArraySet<ProcessRecord> procRecords = new ArraySet<>();
/**
* Sequence number associated with the {@link #mCurProcState}. This is incremented using