summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Hui Yu <huiyu@google.com> 2022-08-12 11:53:24 -0700
committer Hui Yu <huiyu@google.com> 2022-08-18 23:25:36 +0000
commitaf61ad5dfefa6863af1ee3c08b0237a8e7a2b83e (patch)
tree859aead5974d913b25b9f09a1b30c06fb3fdd4cc
parent9d16d9dacbd2e048a24b1077d1ac202689b00cb2 (diff)
Set unfreeze_reason to statsd atom AppFreezeChanged.
Bug: 243074242 Test: statsd_testdrive 254 Change-Id: Id10b034c85d8c02cec43caef29d73c9185b628d4 Merged-In: Id10b034c85d8c02cec43caef29d73c9185b628d4
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java3
-rw-r--r--services/core/java/com/android/server/am/BroadcastQueue.java13
-rw-r--r--services/core/java/com/android/server/am/CachedAppOptimizer.java82
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java25
4 files changed, 77 insertions, 46 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 07a5fb5d0f0f..edf3f9bafedb 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -17385,7 +17385,8 @@ public class ActivityManagerService extends IActivityManager.Stub
// sends to the activity. After this race issue between WM/ATMS and AMS is solved, this
// workaround can be removed. (b/213288355)
if (isNewPending) {
- mOomAdjuster.mCachedAppOptimizer.unfreezeProcess(pid);
+ mOomAdjuster.mCachedAppOptimizer.unfreezeProcess(pid,
+ OomAdjuster.OOM_ADJ_REASON_ACTIVITY);
}
// We need to update the network rules for the app coming to the top state so that
// it can access network when the device or the app is in a restricted state
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index 43d0de9855fe..54349e01c16c 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -36,6 +36,8 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PERMISSIONS_REVIEW;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BROADCAST;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_MU;
+import static com.android.server.am.OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER;
+import static com.android.server.am.OomAdjuster.OOM_ADJ_REASON_START_RECEIVER;
import android.annotation.NonNull;
@@ -347,7 +349,7 @@ public final class BroadcastQueue {
// Force an update, even if there are other pending requests, overall it still saves time,
// because time(updateOomAdj(N apps)) <= N * time(updateOomAdj(1 app)).
mService.enqueueOomAdjTargetLocked(app);
- mService.updateOomAdjPendingTargetsLocked(OomAdjuster.OOM_ADJ_REASON_START_RECEIVER);
+ mService.updateOomAdjPendingTargetsLocked(OOM_ADJ_REASON_START_RECEIVER);
// Tell the application to launch this receiver.
maybeReportBroadcastDispatchedEventLocked(r, r.curReceiver.applicationInfo.uid);
@@ -960,10 +962,11 @@ public final class BroadcastQueue {
filter.receiverList.app.mReceivers.addCurReceiver(r);
mService.enqueueOomAdjTargetLocked(r.curApp);
mService.updateOomAdjPendingTargetsLocked(
- OomAdjuster.OOM_ADJ_REASON_START_RECEIVER);
+ OOM_ADJ_REASON_START_RECEIVER);
}
} else if (filter.receiverList.app != null) {
- mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(filter.receiverList.app);
+ mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(filter.receiverList.app,
+ OOM_ADJ_REASON_START_RECEIVER);
}
try {
@@ -1244,7 +1247,7 @@ public final class BroadcastQueue {
// make sure all processes have correct oom and sched
// adjustments.
mService.updateOomAdjPendingTargetsLocked(
- OomAdjuster.OOM_ADJ_REASON_START_RECEIVER);
+ OOM_ADJ_REASON_START_RECEIVER);
}
// when we have no more ordered broadcast on this queue, stop logging
@@ -1326,7 +1329,7 @@ public final class BroadcastQueue {
if (sendResult) {
if (r.callerApp != null) {
mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(
- r.callerApp);
+ r.callerApp, OOM_ADJ_REASON_FINISH_RECEIVER);
}
try {
if (DEBUG_BROADCAST) {
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index c88d82cf0cf2..0d3685d5ddb6 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -38,6 +38,7 @@ import android.provider.DeviceConfig.Properties;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.EventLog;
+import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
@@ -719,7 +720,7 @@ public final class CachedAppOptimizer {
}
if (!enable && opt.isFrozen()) {
- unfreezeAppLSP(process);
+ unfreezeAppLSP(process, OomAdjuster.OOM_ADJ_REASON_NONE);
// Set freezerOverride *after* calling unfreezeAppLSP (it resets the flag)
opt.setFreezerOverride(true);
@@ -1030,11 +1031,11 @@ public final class CachedAppOptimizer {
// This will ensure app will be out of the freezer for at least mFreezerDebounceTimeout.
@GuardedBy("mAm")
- void unfreezeTemporarily(ProcessRecord app) {
+ void unfreezeTemporarily(ProcessRecord app, String reason) {
if (mUseFreezer) {
synchronized (mProcLock) {
if (app.mOptRecord.isFrozen() || app.mOptRecord.isPendingFreeze()) {
- unfreezeAppLSP(app);
+ unfreezeAppLSP(app, reason);
freezeAppAsyncLSP(app);
}
}
@@ -1060,7 +1061,7 @@ public final class CachedAppOptimizer {
}
@GuardedBy({"mAm", "mProcLock", "mFreezerLock"})
- void unfreezeAppInternalLSP(ProcessRecord app) {
+ void unfreezeAppInternalLSP(ProcessRecord app, String reason) {
final int pid = app.getPid();
final ProcessCachedOptimizerRecord opt = app.mOptRecord;
if (opt.isPendingFreeze()) {
@@ -1141,14 +1142,14 @@ public final class CachedAppOptimizer {
mFreezeHandler.obtainMessage(REPORT_UNFREEZE_MSG,
pid,
(int) Math.min(opt.getFreezeUnfreezeTime() - freezeTime, Integer.MAX_VALUE),
- app.processName));
+ new Pair<String, String>(app.processName, reason)));
}
}
@GuardedBy({"mAm", "mProcLock"})
- void unfreezeAppLSP(ProcessRecord app) {
+ void unfreezeAppLSP(ProcessRecord app, String reason) {
synchronized (mFreezerLock) {
- unfreezeAppInternalLSP(app);
+ unfreezeAppInternalLSP(app, reason);
}
}
@@ -1159,25 +1160,14 @@ public final class CachedAppOptimizer {
* The caller of this function should still trigger updateOomAdj for AMS to unfreeze the app.
* @param pid pid of the process to be unfrozen
*/
- void unfreezeProcess(int pid) {
+ void unfreezeProcess(int pid, String reason) {
synchronized (mFreezerLock) {
ProcessRecord app = mFrozenProcesses.get(pid);
if (app == null) {
return;
}
Slog.d(TAG_AM, "quick sync unfreeze " + pid);
- try {
- freezeBinder(pid, false);
- } catch (RuntimeException e) {
- Slog.e(TAG_AM, "Unable to quick unfreeze binder for " + pid);
- return;
- }
-
- try {
- Process.setProcessFrozen(pid, app.uid, false);
- } catch (Exception e) {
- Slog.e(TAG_AM, "Unable to quick unfreeze " + pid);
- }
+ unfreezeAppLSP(app, reason);
}
}
@@ -1628,9 +1618,11 @@ public final class CachedAppOptimizer {
case REPORT_UNFREEZE_MSG:
int pid = msg.arg1;
int frozenDuration = msg.arg2;
- String processName = (String) msg.obj;
+ Pair<String, String> obj = (Pair<String, String>) msg.obj;
+ String processName = obj.first;
+ String reason = obj.second;
- reportUnfreeze(pid, frozenDuration, processName);
+ reportUnfreeze(pid, frozenDuration, processName, reason);
break;
default:
return;
@@ -1641,7 +1633,7 @@ public final class CachedAppOptimizer {
private void rescheduleFreeze(final ProcessRecord proc, final String reason) {
Slog.d(TAG_AM, "Reschedule freeze for process " + proc.getPid()
+ " " + proc.processName + " (" + reason + ")");
- unfreezeAppLSP(proc);
+ unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE);
freezeAppAsyncLSP(proc);
}
@@ -1729,7 +1721,8 @@ public final class CachedAppOptimizer {
FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__FREEZE_APP,
pid,
name,
- unfrozenDuration);
+ unfrozenDuration,
+ FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE);
}
try {
@@ -1759,12 +1752,13 @@ public final class CachedAppOptimizer {
} catch (Exception e) {
Slog.e(TAG_AM, "Unable to check file locks for " + name + "(" + pid + "): " + e);
synchronized (mProcLock) {
- unfreezeAppLSP(proc);
+ unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE);
}
}
}
- private void reportUnfreeze(int pid, int frozenDuration, String processName) {
+ private void reportUnfreeze(int pid, int frozenDuration, String processName,
+ String reason) {
EventLog.writeEvent(EventLogTags.AM_UNFREEZE, pid, processName);
@@ -1775,7 +1769,39 @@ public final class CachedAppOptimizer {
FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__UNFREEZE_APP,
pid,
processName,
- frozenDuration);
+ frozenDuration,
+ getUnfreezeReasonCode(reason));
+ }
+ }
+
+ private int getUnfreezeReasonCode(String oomAdjReason) {
+ switch (oomAdjReason) {
+ case OomAdjuster.OOM_ADJ_REASON_ACTIVITY:
+ return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__ACTIVITY;
+ case OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER:
+ return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__FINISH_RECEIVER;
+ case OomAdjuster.OOM_ADJ_REASON_START_RECEIVER:
+ return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__START_RECEIVER;
+ case OomAdjuster.OOM_ADJ_REASON_BIND_SERVICE:
+ return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__BIND_SERVICE;
+ case OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE:
+ return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__UNBIND_SERVICE;
+ case OomAdjuster.OOM_ADJ_REASON_START_SERVICE:
+ return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__START_SERVICE;
+ case OomAdjuster.OOM_ADJ_REASON_GET_PROVIDER:
+ return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__GET_PROVIDER;
+ case OomAdjuster.OOM_ADJ_REASON_REMOVE_PROVIDER:
+ return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__REMOVE_PROVIDER;
+ case OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY:
+ return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__UI_VISIBILITY;
+ case OomAdjuster.OOM_ADJ_REASON_ALLOWLIST:
+ return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__ALLOWLIST;
+ case OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN:
+ return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__PROCESS_BEGIN;
+ case OomAdjuster.OOM_ADJ_REASON_PROCESS_END:
+ return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__PROCESS_END;
+ default:
+ return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE;
}
}
@@ -1789,7 +1815,7 @@ public final class CachedAppOptimizer {
ProcessRecord app = mFrozenProcesses.get(pid);
if (app != null) {
Slog.i(TAG_AM, app.processName + " (" + pid + ") holds blocking file lock");
- unfreezeAppLSP(app);
+ unfreezeAppLSP(app, OomAdjuster.OOM_ADJ_REASON_NONE);
}
}
}
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index e9658dbc7b1a..bc939d6279cd 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -367,7 +367,7 @@ public class OomAdjuster {
*/
@GuardedBy({"mService", "mProcLock"})
private boolean performUpdateOomAdjLSP(ProcessRecord app, int cachedAdj,
- ProcessRecord topApp, long now) {
+ ProcessRecord topApp, long now, String oomAdjReason) {
if (app.getThread() == null) {
return false;
}
@@ -411,7 +411,7 @@ public class OomAdjuster {
}
}
- return applyOomAdjLSP(app, false, now, SystemClock.elapsedRealtime());
+ return applyOomAdjLSP(app, false, now, SystemClock.elapsedRealtime(), oomAdjReason);
}
/**
@@ -510,7 +510,7 @@ public class OomAdjuster {
// Check if this process is in the pending list too, remove from pending list if so.
mPendingProcessSet.remove(app);
boolean success = performUpdateOomAdjLSP(app, cachedAdj, topApp,
- SystemClock.uptimeMillis());
+ SystemClock.uptimeMillis(), oomAdjReason);
// The 'app' here itself might or might not be in the cycle, for example,
// the case A <=> B vs. A -> B <=> C; anyway, if we spot a cycle here, re-compute them.
if (!success || (wasCached == state.isCached() && oldAdj != ProcessList.INVALID_ADJ
@@ -563,7 +563,7 @@ public class OomAdjuster {
processes.add(app);
assignCachedAdjIfNecessary(processes);
applyOomAdjLSP(app, false, SystemClock.uptimeMillis(),
- SystemClock.elapsedRealtime());
+ SystemClock.elapsedRealtime(), oomAdjReason);
}
mTmpProcessList.clear();
mService.mOomAdjProfiler.oomAdjEnded();
@@ -857,7 +857,8 @@ public class OomAdjuster {
mNumNonCachedProcs = 0;
mNumCachedHiddenProcs = 0;
- boolean allChanged = updateAndTrimProcessLSP(now, nowElapsed, oldTime, activeUids);
+ boolean allChanged = updateAndTrimProcessLSP(now, nowElapsed, oldTime, activeUids,
+ oomAdjReason);
mNumServiceProcs = mNewNumServiceProcs;
if (mService.mAlwaysFinishActivities) {
@@ -1035,7 +1036,7 @@ public class OomAdjuster {
@GuardedBy({"mService", "mProcLock"})
private boolean updateAndTrimProcessLSP(final long now, final long nowElapsed,
- final long oldTime, final ActiveUids activeUids) {
+ final long oldTime, final ActiveUids activeUids, String oomAdjReason) {
ArrayList<ProcessRecord> lruList = mProcessList.getLruProcessesLOSP();
final int numLru = lruList.size();
@@ -1063,7 +1064,7 @@ public class OomAdjuster {
if (!app.isKilledByAm() && app.getThread() != null) {
// We don't need to apply the update for the process which didn't get computed
if (state.getCompletedAdjSeq() == mAdjSeq) {
- applyOomAdjLSP(app, true, now, nowElapsed);
+ applyOomAdjLSP(app, true, now, nowElapsed, oomAdjReason);
}
final ProcessServiceRecord psr = app.mServices;
@@ -2556,7 +2557,7 @@ public class OomAdjuster {
/** Applies the computed oomadj, procstate and sched group values and freezes them in set* */
@GuardedBy({"mService", "mProcLock"})
private boolean applyOomAdjLSP(ProcessRecord app, boolean doingAll, long now,
- long nowElapsed) {
+ long nowElapsed, String oomAdjReson) {
boolean success = true;
final ProcessStateRecord state = app.mState;
final UidRecord uidRec = app.getUidRecord();
@@ -2713,7 +2714,7 @@ public class OomAdjuster {
changes |= ActivityManagerService.ProcessChangeItem.CHANGE_ACTIVITIES;
}
- updateAppFreezeStateLSP(app);
+ updateAppFreezeStateLSP(app, oomAdjReson);
if (state.getReportedProcState() != state.getCurProcState()) {
state.setReportedProcState(state.getCurProcState());
@@ -3074,7 +3075,7 @@ public class OomAdjuster {
}
@GuardedBy({"mService", "mProcLock"})
- private void updateAppFreezeStateLSP(ProcessRecord app) {
+ private void updateAppFreezeStateLSP(ProcessRecord app, String oomAdjReason) {
if (!mCachedAppOptimizer.useFreezer()) {
return;
}
@@ -3086,7 +3087,7 @@ public class OomAdjuster {
final ProcessCachedOptimizerRecord opt = app.mOptRecord;
// if an app is already frozen and shouldNotFreeze becomes true, immediately unfreeze
if (opt.isFrozen() && opt.shouldNotFreeze()) {
- mCachedAppOptimizer.unfreezeAppLSP(app);
+ mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason);
return;
}
@@ -3096,7 +3097,7 @@ public class OomAdjuster {
&& !opt.shouldNotFreeze()) {
mCachedAppOptimizer.freezeAppAsyncLSP(app);
} else if (state.getSetAdj() < ProcessList.CACHED_APP_MIN_ADJ) {
- mCachedAppOptimizer.unfreezeAppLSP(app);
+ mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason);
}
}
}