Merge "Set unfreeze_reason to statsd atom AppFreezeChanged."
This commit is contained in:
@@ -17507,7 +17507,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
|
||||
|
||||
@@ -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;
|
||||
@@ -348,7 +350,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);
|
||||
@@ -976,10 +978,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 {
|
||||
@@ -1263,7 +1266,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
|
||||
@@ -1345,7 +1348,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) {
|
||||
|
||||
@@ -37,6 +37,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;
|
||||
import com.android.internal.annotations.GuardedBy;
|
||||
@@ -904,7 +905,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);
|
||||
@@ -1214,11 +1215,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, @OomAdjuster.OomAdjReason int reason) {
|
||||
if (mUseFreezer) {
|
||||
synchronized (mProcLock) {
|
||||
if (app.mOptRecord.isFrozen() || app.mOptRecord.isPendingFreeze()) {
|
||||
unfreezeAppLSP(app);
|
||||
unfreezeAppLSP(app, reason);
|
||||
freezeAppAsyncLSP(app);
|
||||
}
|
||||
}
|
||||
@@ -1244,7 +1245,7 @@ public final class CachedAppOptimizer {
|
||||
}
|
||||
|
||||
@GuardedBy({"mAm", "mProcLock", "mFreezerLock"})
|
||||
void unfreezeAppInternalLSP(ProcessRecord app) {
|
||||
void unfreezeAppInternalLSP(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) {
|
||||
final int pid = app.getPid();
|
||||
final ProcessCachedOptimizerRecord opt = app.mOptRecord;
|
||||
if (opt.isPendingFreeze()) {
|
||||
@@ -1325,14 +1326,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, Integer>(app.processName, reason)));
|
||||
}
|
||||
}
|
||||
|
||||
@GuardedBy({"mAm", "mProcLock"})
|
||||
void unfreezeAppLSP(ProcessRecord app) {
|
||||
void unfreezeAppLSP(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) {
|
||||
synchronized (mFreezerLock) {
|
||||
unfreezeAppInternalLSP(app);
|
||||
unfreezeAppInternalLSP(app, reason);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1343,25 +1344,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, @OomAdjuster.OomAdjReason int 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1880,9 +1870,11 @@ public final class CachedAppOptimizer {
|
||||
case REPORT_UNFREEZE_MSG:
|
||||
int pid = msg.arg1;
|
||||
int frozenDuration = msg.arg2;
|
||||
String processName = (String) msg.obj;
|
||||
Pair<String, Integer> obj = (Pair<String, Integer>) msg.obj;
|
||||
String processName = obj.first;
|
||||
int reason = obj.second;
|
||||
|
||||
reportUnfreeze(pid, frozenDuration, processName);
|
||||
reportUnfreeze(pid, frozenDuration, processName, reason);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
@@ -1893,7 +1885,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);
|
||||
}
|
||||
|
||||
@@ -1981,7 +1973,8 @@ public final class CachedAppOptimizer {
|
||||
FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__FREEZE_APP,
|
||||
pid,
|
||||
name,
|
||||
unfrozenDuration);
|
||||
unfrozenDuration,
|
||||
FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE);
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -2011,12 +2004,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,
|
||||
@OomAdjuster.OomAdjReason int reason) {
|
||||
|
||||
EventLog.writeEvent(EventLogTags.AM_UNFREEZE, pid, processName);
|
||||
|
||||
@@ -2027,7 +2021,39 @@ public final class CachedAppOptimizer {
|
||||
FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__UNFREEZE_APP,
|
||||
pid,
|
||||
processName,
|
||||
frozenDuration);
|
||||
frozenDuration,
|
||||
getUnfreezeReasonCode(reason));
|
||||
}
|
||||
}
|
||||
|
||||
private int getUnfreezeReasonCode(@OomAdjuster.OomAdjReason int 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2041,7 +2067,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -448,7 +448,7 @@ public class OomAdjuster {
|
||||
*/
|
||||
@GuardedBy({"mService", "mProcLock"})
|
||||
private boolean performUpdateOomAdjLSP(ProcessRecord app, int cachedAdj,
|
||||
ProcessRecord topApp, long now) {
|
||||
ProcessRecord topApp, long now, @OomAdjReason int oomAdjReason) {
|
||||
if (app.getThread() == null) {
|
||||
return false;
|
||||
}
|
||||
@@ -492,7 +492,7 @@ public class OomAdjuster {
|
||||
}
|
||||
}
|
||||
|
||||
return applyOomAdjLSP(app, false, now, SystemClock.elapsedRealtime());
|
||||
return applyOomAdjLSP(app, false, now, SystemClock.elapsedRealtime(), oomAdjReason);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -592,7 +592,7 @@ public class OomAdjuster {
|
||||
mPendingProcessSet.remove(app);
|
||||
app.mOptRecord.setLastOomAdjChangeReason(oomAdjReason);
|
||||
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
|
||||
@@ -645,7 +645,7 @@ public class OomAdjuster {
|
||||
processes.add(app);
|
||||
assignCachedAdjIfNecessary(processes);
|
||||
applyOomAdjLSP(app, false, SystemClock.uptimeMillis(),
|
||||
SystemClock.elapsedRealtime());
|
||||
SystemClock.elapsedRealtime(), oomAdjReason);
|
||||
}
|
||||
mTmpProcessList.clear();
|
||||
mService.mOomAdjProfiler.oomAdjEnded();
|
||||
@@ -941,7 +941,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) {
|
||||
@@ -1119,7 +1120,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, @OomAdjReason int oomAdjReason) {
|
||||
ArrayList<ProcessRecord> lruList = mProcessList.getLruProcessesLOSP();
|
||||
final int numLru = lruList.size();
|
||||
|
||||
@@ -1147,7 +1148,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;
|
||||
@@ -2640,7 +2641,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, @OomAdjReason int oomAdjReson) {
|
||||
boolean success = true;
|
||||
final ProcessStateRecord state = app.mState;
|
||||
final UidRecord uidRec = app.getUidRecord();
|
||||
@@ -2799,7 +2800,7 @@ public class OomAdjuster {
|
||||
changes |= ActivityManagerService.ProcessChangeItem.CHANGE_ACTIVITIES;
|
||||
}
|
||||
|
||||
updateAppFreezeStateLSP(app);
|
||||
updateAppFreezeStateLSP(app, oomAdjReson);
|
||||
|
||||
if (state.getReportedProcState() != state.getCurProcState()) {
|
||||
state.setReportedProcState(state.getCurProcState());
|
||||
@@ -3160,7 +3161,7 @@ public class OomAdjuster {
|
||||
}
|
||||
|
||||
@GuardedBy({"mService", "mProcLock"})
|
||||
private void updateAppFreezeStateLSP(ProcessRecord app) {
|
||||
private void updateAppFreezeStateLSP(ProcessRecord app, @OomAdjReason int oomAdjReason) {
|
||||
if (!mCachedAppOptimizer.useFreezer()) {
|
||||
return;
|
||||
}
|
||||
@@ -3172,7 +3173,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;
|
||||
}
|
||||
|
||||
@@ -3182,7 +3183,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user