• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.am;
18 
19 import static android.app.ActivityManager.PROCESS_CAPABILITY_NONE;
20 import static android.app.ActivityManager.PROCESS_STATE_CACHED_EMPTY;
21 import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
22 import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_ACTIVITY;
23 import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER;
24 import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_STARTED_SERVICE;
25 
26 import static com.android.server.am.ProcessList.CACHED_APP_MIN_ADJ;
27 import static com.android.server.wm.WindowProcessController.ACTIVITY_STATE_FLAG_IS_PAUSING_OR_PAUSED;
28 import static com.android.server.wm.WindowProcessController.ACTIVITY_STATE_FLAG_IS_STOPPING;
29 import static com.android.server.wm.WindowProcessController.ACTIVITY_STATE_FLAG_IS_STOPPING_FINISHING;
30 import static com.android.server.wm.WindowProcessController.ACTIVITY_STATE_FLAG_IS_VISIBLE;
31 import static com.android.server.wm.WindowProcessController.ACTIVITY_STATE_FLAG_MASK_MIN_TASK_LAYER;
32 
33 import android.annotation.ElapsedRealtimeLong;
34 import android.app.ActivityManager;
35 import android.content.ComponentName;
36 import android.os.SystemClock;
37 import android.os.Trace;
38 import android.util.TimeUtils;
39 
40 import com.android.internal.annotations.CompositeRWLock;
41 import com.android.internal.annotations.GuardedBy;
42 import com.android.server.am.PlatformCompatCache.CachedCompatChangeId;
43 
44 import java.io.PrintWriter;
45 
46 /**
47  * The state info of the process, including proc state, oom adj score, et al.
48  */
49 final class ProcessStateRecord {
50     // Enable this to trace all OomAdjuster state transitions
51     private static final boolean TRACE_OOM_ADJ = false;
52 
53     private final ProcessRecord mApp;
54     private final ActivityManagerService mService;
55     private final ActivityManagerGlobalLock mProcLock;
56 
57     /**
58      * Maximum OOM adjustment for this process.
59      */
60     @GuardedBy("mService")
61     private int mMaxAdj = ProcessList.UNKNOWN_ADJ;
62 
63     /**
64      *  Current OOM unlimited adjustment for this process.
65      */
66     @CompositeRWLock({"mService", "mProcLock"})
67     private int mCurRawAdj = ProcessList.INVALID_ADJ;
68 
69     /**
70      * Last set OOM unlimited adjustment for this process.
71      */
72     @CompositeRWLock({"mService", "mProcLock"})
73     private int mSetRawAdj = ProcessList.INVALID_ADJ;
74 
75     /**
76      * Current OOM adjustment for this process.
77      */
78     @CompositeRWLock({"mService", "mProcLock"})
79     private int mCurAdj = ProcessList.INVALID_ADJ;
80 
81     /**
82      * Last set OOM adjustment for this process.
83      */
84     @CompositeRWLock({"mService", "mProcLock"})
85     private int mSetAdj = ProcessList.INVALID_ADJ;
86 
87     /**
88      * The last adjustment that was verified as actually being set.
89      */
90     @GuardedBy("mService")
91     private int mVerifiedAdj = ProcessList.INVALID_ADJ;
92 
93     /**
94      * Current capability flags of this process.
95      * For example, PROCESS_CAPABILITY_FOREGROUND_LOCATION is one capability.
96      */
97     @CompositeRWLock({"mService", "mProcLock"})
98     private int mCurCapability = PROCESS_CAPABILITY_NONE;
99 
100     /**
101      * Last set capability flags.
102      */
103     @CompositeRWLock({"mService", "mProcLock"})
104     private int mSetCapability = PROCESS_CAPABILITY_NONE;
105 
106     /**
107      * Currently desired scheduling class.
108      */
109     @CompositeRWLock({"mService", "mProcLock"})
110     private int mCurSchedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
111 
112     /**
113      * Last set to background scheduling class.
114      */
115     @CompositeRWLock({"mService", "mProcLock"})
116     private int mSetSchedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
117 
118     /**
119      * Currently computed process state.
120      */
121     @CompositeRWLock({"mService", "mProcLock"})
122     private int mCurProcState = PROCESS_STATE_NONEXISTENT;
123 
124     /**
125      * Last reported process state.
126      */
127     @CompositeRWLock({"mService", "mProcLock"})
128     private int mRepProcState = PROCESS_STATE_NONEXISTENT;
129 
130     /**
131      * Temp state during computation.
132      */
133     @CompositeRWLock({"mService", "mProcLock"})
134     private int mCurRawProcState = PROCESS_STATE_NONEXISTENT;
135 
136     /**
137      * Last set process state in process tracker.
138      */
139     @CompositeRWLock({"mService", "mProcLock"})
140     private int mSetProcState = PROCESS_STATE_NONEXISTENT;
141 
142     /**
143      * Last time mSetProcState changed.
144      */
145     @CompositeRWLock({"mService", "mProcLock"})
146     private long mLastStateTime;
147 
148     /**
149      * Previous priority value if we're switching to non-SCHED_OTHER.
150      */
151     @CompositeRWLock({"mService", "mProcLock"})
152     private int mSavedPriority;
153 
154     /**
155      * Process currently is on the service B list.
156      */
157     @CompositeRWLock({"mService", "mProcLock"})
158     private boolean mServiceB;
159 
160     /**
161      * We are forcing to service B list due to its RAM use.
162      */
163     @CompositeRWLock({"mService", "mProcLock"})
164     private boolean mServiceHighRam;
165 
166     /**
167      * Has this process not been in a cached state since last idle?
168      */
169     @GuardedBy("mProcLock")
170     private boolean mNotCachedSinceIdle;
171 
172     /**
173      * Are there any started services running in this process?
174      */
175     @CompositeRWLock({"mService", "mProcLock"})
176     private boolean mHasStartedServices;
177 
178     /**
179      * Running any activities that are foreground?
180      */
181     @CompositeRWLock({"mService", "mProcLock"})
182     private boolean mHasForegroundActivities;
183 
184     /**
185      * Last reported foreground activities.
186      */
187     @CompositeRWLock({"mService", "mProcLock"})
188     private boolean mRepForegroundActivities;
189 
190     /**
191      * Has UI been shown in this process since it was started?
192      */
193     @GuardedBy("mService")
194     private boolean mHasShownUi;
195 
196     /**
197      * Is this process currently showing a non-activity UI that the user
198      * is interacting with? E.g. The status bar when it is expanded, but
199      * not when it is minimized. When true the
200      * process will be set to use the ProcessList#SCHED_GROUP_TOP_APP
201      * scheduling group to boost performance.
202      */
203     @GuardedBy("mService")
204     private boolean mHasTopUi;
205 
206     /**
207      * Is the process currently showing a non-activity UI that
208      * overlays on-top of activity UIs on screen. E.g. display a window
209      * of type android.view.WindowManager.LayoutParams#TYPE_APPLICATION_OVERLAY
210      * When true the process will oom adj score will be set to
211      * ProcessList#PERCEPTIBLE_APP_ADJ at minimum to reduce the chance
212      * of the process getting killed.
213      */
214     @GuardedBy("mService")
215     private boolean mHasOverlayUi;
216 
217     /**
218      * Is the process currently running a RemoteAnimation? When true
219      * the process will be set to use the
220      * ProcessList#SCHED_GROUP_TOP_APP scheduling group to boost
221      * performance, as well as oom adj score will be set to
222      * ProcessList#VISIBLE_APP_ADJ at minimum to reduce the chance
223      * of the process getting killed.
224      */
225     @GuardedBy("mService")
226     private boolean mRunningRemoteAnimation;
227 
228     /**
229      * Keep track of whether we changed 'mSetAdj'.
230      */
231     @CompositeRWLock({"mService", "mProcLock"})
232     private boolean mProcStateChanged;
233 
234     /**
235      * Whether we have told usage stats about it being an interaction.
236      */
237     @CompositeRWLock({"mService", "mProcLock"})
238     private boolean mReportedInteraction;
239 
240     /**
241      * The time we sent the last interaction event.
242      */
243     @CompositeRWLock({"mService", "mProcLock"})
244     private long mInteractionEventTime;
245 
246     /**
247      * When we became foreground for interaction purposes.
248      */
249     @CompositeRWLock({"mService", "mProcLock"})
250     private long mFgInteractionTime;
251 
252     /**
253      * Token that is forcing this process to be important.
254      */
255     @GuardedBy("mService")
256     private Object mForcingToImportant;
257 
258     /**
259      * Sequence id for identifying oom_adj assignment cycles.
260      */
261     @GuardedBy("mService")
262     private int mAdjSeq;
263 
264     /**
265      * Sequence id for identifying oom_adj assignment cycles.
266      */
267     @GuardedBy("mService")
268     private int mCompletedAdjSeq;
269 
270     /**
271      * Whether this app has encountered a cycle in the most recent update.
272      */
273     @GuardedBy("mService")
274     private boolean mContainsCycle;
275 
276     /**
277      * When (uptime) the process last became unimportant.
278      */
279     @CompositeRWLock({"mService", "mProcLock"})
280     private long mWhenUnimportant;
281 
282     /**
283      * The last time the process was in the TOP state or greater.
284      */
285     @GuardedBy("mService")
286     private long mLastTopTime = Long.MIN_VALUE;
287 
288     /**
289      * This is a system process, but not currently showing UI.
290      */
291     @GuardedBy("mService")
292     private boolean mSystemNoUi;
293 
294     /**
295      * Whether or not the app is background restricted (OP_RUN_ANY_IN_BACKGROUND is NOT allowed).
296      */
297     @GuardedBy("mService")
298     private boolean mBackgroundRestricted = false;
299 
300     /**
301      * Whether or not this process is being bound by a non-background restricted app.
302      */
303     @GuardedBy("mService")
304     private boolean mCurBoundByNonBgRestrictedApp = false;
305 
306     /**
307      * Last set state of {@link #mCurBoundByNonBgRestrictedApp}.
308      */
309     private boolean mSetBoundByNonBgRestrictedApp = false;
310 
311     /**
312      * Debugging: primary thing impacting oom_adj.
313      */
314     @GuardedBy("mService")
315     private String mAdjType;
316 
317     /**
318      * Debugging: adj code to report to app.
319      */
320     @CompositeRWLock({"mService", "mProcLock"})
321     private int mAdjTypeCode;
322 
323     /**
324      * Debugging: option dependent object.
325      */
326     @CompositeRWLock({"mService", "mProcLock"})
327     private Object mAdjSource;
328 
329     /**
330      * Debugging: proc state of mAdjSource's process.
331      */
332     @CompositeRWLock({"mService", "mProcLock"})
333     private int mAdjSourceProcState;
334 
335     /**
336      * Debugging: target component impacting oom_adj.
337      */
338     @CompositeRWLock({"mService", "mProcLock"})
339     private Object mAdjTarget;
340 
341     /**
342      * Approximates the usage count of the app, used for cache re-ranking by CacheOomRanker.
343      *
344      * Counts the number of times the process is re-added to the cache (i.e. setCached(false);
345      * setCached(true)). This over counts, as setCached is sometimes reset while remaining in the
346      * cache. However, this happens uniformly across processes, so ranking is not affected.
347      */
348     @GuardedBy("mService")
349     private int mCacheOomRankerUseCount;
350 
351     /**
352      * Process memory usage (RSS).
353      *
354      * Periodically populated by {@code CacheOomRanker}, stored in this object to cache the values.
355      */
356     @GuardedBy("mService")
357     private long mCacheOomRankerRss;
358 
359     /**
360      * The last time, in milliseconds since boot, since {@link #mCacheOomRankerRss} was updated.
361      */
362     @GuardedBy("mService")
363     private long mCacheOomRankerRssTimeMs;
364 
365     /**
366      * Whether or not this process is reachable from given process.
367      */
368     @GuardedBy("mService")
369     private boolean mReachable;
370 
371     /**
372      * The most recent time when the last visible activity within this process became invisible.
373      *
374      * <p> It'll be set to 0 if there is never a visible activity, or Long.MAX_VALUE if there is
375      * any visible activities within this process at this moment.</p>
376      */
377     @GuardedBy("mService")
378     @ElapsedRealtimeLong
379     private long mLastInvisibleTime;
380 
381     /**
382      * Whether or not this process could be killed when it's in background restricted mode
383      * and cached &amp; idle state.
384      */
385     @GuardedBy("mService")
386     private boolean mNoKillOnBgRestrictedAndIdle;
387 
388     /**
389      * Last set value of {@link #isCached()}.
390      */
391     @GuardedBy("mService")
392     private boolean mSetCached;
393 
394     /**
395      * Last set value of {@link #mNoKillOnBgRestrictedAndIdle}.
396      */
397     @GuardedBy("mService")
398     private boolean mSetNoKillOnBgRestrictedAndIdle;
399 
400     /**
401      * The last time when the {@link #mNoKillOnBgRestrictedAndIdle} is false and the
402      * {@link #isCached()} is true, and either the former state is flipping from true to false
403      * when latter state is true, or the latter state is flipping from false to true when the
404      * former state is false.
405      */
406     @GuardedBy("mService")
407     private @ElapsedRealtimeLong long mLastCanKillOnBgRestrictedAndIdleTime;
408 
409     // Below are the cached task info for OomAdjuster only
410     private static final int VALUE_INVALID = -1;
411     private static final int VALUE_FALSE = 0;
412     private static final int VALUE_TRUE = 1;
413 
414     @GuardedBy("mService")
415     private int mCachedHasActivities = VALUE_INVALID;
416     @GuardedBy("mService")
417     private int mCachedIsHeavyWeight = VALUE_INVALID;
418     @GuardedBy("mService")
419     private int mCachedHasVisibleActivities = VALUE_INVALID;
420     @GuardedBy("mService")
421     private int mCachedIsHomeProcess = VALUE_INVALID;
422     @GuardedBy("mService")
423     private int mCachedIsPreviousProcess = VALUE_INVALID;
424     @GuardedBy("mService")
425     private int mCachedHasRecentTasks = VALUE_INVALID;
426     @GuardedBy("mService")
427     private int mCachedIsReceivingBroadcast = VALUE_INVALID;
428 
429     /**
430      * Cache the return value of PlatformCompat.isChangeEnabled().
431      */
432     @GuardedBy("mService")
433     private int[] mCachedCompatChanges = new int[] {
434         VALUE_INVALID, // CACHED_COMPAT_CHANGE_PROCESS_CAPABILITY
435         VALUE_INVALID, // CACHED_COMPAT_CHANGE_CAMERA_MICROPHONE_CAPABILITY
436         VALUE_INVALID, // CACHED_COMPAT_CHANGE_USE_SHORT_FGS_USAGE_INTERACTION_TIME
437     };
438 
439     @GuardedBy("mService")
440     private String mCachedAdjType = null;
441     @GuardedBy("mService")
442     private int mCachedAdj = ProcessList.INVALID_ADJ;
443     @GuardedBy("mService")
444     private boolean mCachedForegroundActivities = false;
445     @GuardedBy("mService")
446     private int mCachedProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
447     @GuardedBy("mService")
448     private int mCachedSchedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
449 
450     @GuardedBy("mService")
451     private boolean mScheduleLikeTopApp = false;
452 
453     @GuardedBy("mService")
454     private long mFollowupUpdateUptimeMs = Long.MAX_VALUE;
455 
ProcessStateRecord(ProcessRecord app)456     ProcessStateRecord(ProcessRecord app) {
457         mApp = app;
458         mService = app.mService;
459         mProcLock = mService.mProcLock;
460     }
461 
init(long now)462     void init(long now) {
463         mLastStateTime = now;
464     }
465 
466     @GuardedBy("mService")
setMaxAdj(int maxAdj)467     void setMaxAdj(int maxAdj) {
468         mMaxAdj = maxAdj;
469     }
470 
471     @GuardedBy("mService")
getMaxAdj()472     int getMaxAdj() {
473         return mMaxAdj;
474     }
475 
476     @GuardedBy({"mService", "mProcLock"})
setCurRawAdj(int curRawAdj)477     void setCurRawAdj(int curRawAdj) {
478         setCurRawAdj(curRawAdj, false);
479     }
480 
481     /**
482      * @return {@code true} if it's a dry run and it's going to bump the adj score of the process
483      * if it was a real run.
484      */
485     @GuardedBy({"mService", "mProcLock"})
setCurRawAdj(int curRawAdj, boolean dryRun)486     boolean setCurRawAdj(int curRawAdj, boolean dryRun) {
487         if (dryRun) {
488             return mCurRawAdj > curRawAdj;
489         }
490         mCurRawAdj = curRawAdj;
491         mApp.getWindowProcessController().setPerceptible(
492                 curRawAdj <= ProcessList.PERCEPTIBLE_APP_ADJ);
493         return false;
494     }
495 
496     @GuardedBy(anyOf = {"mService", "mProcLock"})
getCurRawAdj()497     int getCurRawAdj() {
498         return mCurRawAdj;
499     }
500 
501     @GuardedBy({"mService", "mProcLock"})
setSetRawAdj(int setRawAdj)502     void setSetRawAdj(int setRawAdj) {
503         mSetRawAdj = setRawAdj;
504     }
505 
506     @GuardedBy(anyOf = {"mService", "mProcLock"})
getSetRawAdj()507     int getSetRawAdj() {
508         return mSetRawAdj;
509     }
510 
511     @GuardedBy({"mService", "mProcLock"})
setCurAdj(int curAdj)512     void setCurAdj(int curAdj) {
513         mCurAdj = curAdj;
514         mApp.getWindowProcessController().setCurrentAdj(curAdj);
515     }
516 
517     @GuardedBy(anyOf = {"mService", "mProcLock"})
getCurAdj()518     int getCurAdj() {
519         return mCurAdj;
520     }
521 
522     @GuardedBy({"mService", "mProcLock"})
setSetAdj(int setAdj)523     void setSetAdj(int setAdj) {
524         mSetAdj = setAdj;
525     }
526 
527     @GuardedBy(anyOf = {"mService", "mProcLock"})
getSetAdj()528     int getSetAdj() {
529         return mSetAdj;
530     }
531 
532     @GuardedBy(anyOf = {"mService", "mProcLock"})
getSetAdjWithServices()533     int getSetAdjWithServices() {
534         if (mSetAdj >= CACHED_APP_MIN_ADJ) {
535             if (mHasStartedServices) {
536                 return ProcessList.SERVICE_B_ADJ;
537             }
538         }
539         return mSetAdj;
540     }
541 
542     @GuardedBy("mService")
setVerifiedAdj(int verifiedAdj)543     void setVerifiedAdj(int verifiedAdj) {
544         mVerifiedAdj = verifiedAdj;
545     }
546 
547     @GuardedBy("mService")
getVerifiedAdj()548     int getVerifiedAdj() {
549         return mVerifiedAdj;
550     }
551 
552     @GuardedBy({"mService", "mProcLock"})
setCurCapability(int curCapability)553     void setCurCapability(int curCapability) {
554         mCurCapability = curCapability;
555     }
556 
557     @GuardedBy(anyOf = {"mService", "mProcLock"})
getCurCapability()558     int getCurCapability() {
559         return mCurCapability;
560     }
561 
562     @GuardedBy({"mService", "mProcLock"})
setSetCapability(int setCapability)563     void setSetCapability(int setCapability) {
564         mSetCapability = setCapability;
565     }
566 
567     @GuardedBy(anyOf = {"mService", "mProcLock"})
getSetCapability()568     int getSetCapability() {
569         return mSetCapability;
570     }
571 
572     @GuardedBy({"mService", "mProcLock"})
setCurrentSchedulingGroup(int curSchedGroup)573     void setCurrentSchedulingGroup(int curSchedGroup) {
574         mCurSchedGroup = curSchedGroup;
575         mApp.getWindowProcessController().setCurrentSchedulingGroup(curSchedGroup);
576     }
577 
578     @GuardedBy(anyOf = {"mService", "mProcLock"})
getCurrentSchedulingGroup()579     int getCurrentSchedulingGroup() {
580         return mCurSchedGroup;
581     }
582 
583     @GuardedBy({"mService", "mProcLock"})
setSetSchedGroup(int setSchedGroup)584     void setSetSchedGroup(int setSchedGroup) {
585         mSetSchedGroup = setSchedGroup;
586     }
587 
588     @GuardedBy(anyOf = {"mService", "mProcLock"})
getSetSchedGroup()589     int getSetSchedGroup() {
590         return mSetSchedGroup;
591     }
592 
593     @GuardedBy({"mService", "mProcLock"})
setCurProcState(int curProcState)594     void setCurProcState(int curProcState) {
595         mCurProcState = curProcState;
596         mApp.getWindowProcessController().setCurrentProcState(mCurProcState);
597     }
598 
599     @GuardedBy(anyOf = {"mService", "mProcLock"})
getCurProcState()600     int getCurProcState() {
601         return mCurProcState;
602     }
603 
604     @GuardedBy({"mService", "mProcLock"})
setCurRawProcState(int curRawProcState)605     void setCurRawProcState(int curRawProcState) {
606         setCurRawProcState(curRawProcState, false);
607     }
608 
609     /**
610      * @return {@code true} if it's a dry run and it's going to bump the procstate of the process
611      * if it was a real run.
612      */
613     @GuardedBy({"mService", "mProcLock"})
setCurRawProcState(int curRawProcState, boolean dryRun)614     boolean setCurRawProcState(int curRawProcState, boolean dryRun) {
615         if (dryRun) {
616             return mCurRawProcState > curRawProcState;
617         }
618         mCurRawProcState = curRawProcState;
619         return false;
620     }
621 
622     @GuardedBy(anyOf = {"mService", "mProcLock"})
getCurRawProcState()623     int getCurRawProcState() {
624         return mCurRawProcState;
625     }
626 
627     @GuardedBy({"mService", "mProcLock"})
setReportedProcState(int repProcState)628     void setReportedProcState(int repProcState) {
629         mRepProcState = repProcState;
630         mApp.getWindowProcessController().setReportedProcState(repProcState);
631     }
632 
633     @GuardedBy(anyOf = {"mService", "mProcLock"})
getReportedProcState()634     int getReportedProcState() {
635         return mRepProcState;
636     }
637 
638     @GuardedBy("mService")
forceProcessStateUpTo(int newState)639     void forceProcessStateUpTo(int newState) {
640         if (mRepProcState > newState) {
641             synchronized (mProcLock) {
642                 final int prevProcState = mRepProcState;
643                 setReportedProcState(newState);
644                 setCurProcState(newState);
645                 setCurRawProcState(newState);
646                 mService.mOomAdjuster.onProcessStateChanged(mApp, prevProcState);
647             }
648         }
649     }
650 
651     @GuardedBy({"mService", "mProcLock"})
setSetProcState(int setProcState)652     void setSetProcState(int setProcState) {
653         if (ActivityManager.isProcStateCached(mSetProcState)
654                 && !ActivityManager.isProcStateCached(setProcState)) {
655             mCacheOomRankerUseCount++;
656         }
657         mSetProcState = setProcState;
658     }
659 
660     @GuardedBy(anyOf = {"mService", "mProcLock"})
getSetProcState()661     int getSetProcState() {
662         return mSetProcState;
663     }
664 
665     @GuardedBy({"mService", "mProcLock"})
setLastStateTime(long lastStateTime)666     void setLastStateTime(long lastStateTime) {
667         mLastStateTime = lastStateTime;
668     }
669 
670     @GuardedBy(anyOf = {"mService", "mProcLock"})
getLastStateTime()671     long getLastStateTime() {
672         return mLastStateTime;
673     }
674 
675     @GuardedBy({"mService", "mProcLock"})
setSavedPriority(int savedPriority)676     void setSavedPriority(int savedPriority) {
677         mSavedPriority = savedPriority;
678     }
679 
680     @GuardedBy(anyOf = {"mService", "mProcLock"})
getSavedPriority()681     int getSavedPriority() {
682         return mSavedPriority;
683     }
684 
685     @GuardedBy({"mService", "mProcLock"})
setServiceB(boolean serviceb)686     void setServiceB(boolean serviceb) {
687         mServiceB = serviceb;
688     }
689 
690     @GuardedBy(anyOf = {"mService", "mProcLock"})
isServiceB()691     boolean isServiceB() {
692         return mServiceB;
693     }
694 
695     @GuardedBy({"mService", "mProcLock"})
setServiceHighRam(boolean serviceHighRam)696     void setServiceHighRam(boolean serviceHighRam) {
697         mServiceHighRam = serviceHighRam;
698     }
699 
700     @GuardedBy(anyOf = {"mService", "mProcLock"})
isServiceHighRam()701     boolean isServiceHighRam() {
702         return mServiceHighRam;
703     }
704 
705     @GuardedBy("mProcLock")
setNotCachedSinceIdle(boolean notCachedSinceIdle)706     void setNotCachedSinceIdle(boolean notCachedSinceIdle) {
707         mNotCachedSinceIdle = notCachedSinceIdle;
708     }
709 
710     @GuardedBy("mProcLock")
isNotCachedSinceIdle()711     boolean isNotCachedSinceIdle() {
712         return mNotCachedSinceIdle;
713     }
714 
715     @GuardedBy("mProcLock")
setHasStartedServices(boolean hasStartedServices)716     void setHasStartedServices(boolean hasStartedServices) {
717         mHasStartedServices = hasStartedServices;
718         if (hasStartedServices) {
719             mApp.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_STARTED_SERVICE);
720         } else {
721             mApp.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_STARTED_SERVICE);
722         }
723     }
724 
725     @GuardedBy("mProcLock")
hasStartedServices()726     boolean hasStartedServices() {
727         return mHasStartedServices;
728     }
729 
730     @GuardedBy({"mService", "mProcLock"})
setHasForegroundActivities(boolean hasForegroundActivities)731     void setHasForegroundActivities(boolean hasForegroundActivities) {
732         mHasForegroundActivities = hasForegroundActivities;
733     }
734 
735     @GuardedBy(anyOf = {"mService", "mProcLock"})
hasForegroundActivities()736     boolean hasForegroundActivities() {
737         return mHasForegroundActivities;
738     }
739 
740     @GuardedBy({"mService", "mProcLock"})
setRepForegroundActivities(boolean repForegroundActivities)741     void setRepForegroundActivities(boolean repForegroundActivities) {
742         mRepForegroundActivities = repForegroundActivities;
743     }
744 
745     @GuardedBy(anyOf = {"mService", "mProcLock"})
hasRepForegroundActivities()746     boolean hasRepForegroundActivities() {
747         return mRepForegroundActivities;
748     }
749 
750     @GuardedBy("mService")
setHasShownUi(boolean hasShownUi)751     void setHasShownUi(boolean hasShownUi) {
752         mHasShownUi = hasShownUi;
753     }
754 
755     @GuardedBy("mService")
hasShownUi()756     boolean hasShownUi() {
757         return mHasShownUi;
758     }
759 
760     @GuardedBy("mService")
setHasTopUi(boolean hasTopUi)761     void setHasTopUi(boolean hasTopUi) {
762         mHasTopUi = hasTopUi;
763         mApp.getWindowProcessController().setHasTopUi(hasTopUi);
764     }
765 
766     @GuardedBy("mService")
hasTopUi()767     boolean hasTopUi() {
768         return mHasTopUi;
769     }
770 
771     @GuardedBy("mService")
setHasOverlayUi(boolean hasOverlayUi)772     void setHasOverlayUi(boolean hasOverlayUi) {
773         mHasOverlayUi = hasOverlayUi;
774         mApp.getWindowProcessController().setHasOverlayUi(hasOverlayUi);
775     }
776 
777     @GuardedBy("mService")
hasOverlayUi()778     boolean hasOverlayUi() {
779         return mHasOverlayUi;
780     }
781 
782     @GuardedBy("mService")
isRunningRemoteAnimation()783     boolean isRunningRemoteAnimation() {
784         return mRunningRemoteAnimation;
785     }
786 
787     @GuardedBy("mService")
setRunningRemoteAnimation(boolean runningRemoteAnimation)788     void setRunningRemoteAnimation(boolean runningRemoteAnimation) {
789         mRunningRemoteAnimation = runningRemoteAnimation;
790     }
791 
792     @GuardedBy({"mService", "mProcLock"})
setProcStateChanged(boolean procStateChanged)793     void setProcStateChanged(boolean procStateChanged) {
794         mProcStateChanged = procStateChanged;
795     }
796 
797     @GuardedBy(anyOf = {"mService", "mProcLock"})
hasProcStateChanged()798     boolean hasProcStateChanged() {
799         return mProcStateChanged;
800     }
801 
802     @GuardedBy({"mService", "mProcLock"})
setReportedInteraction(boolean reportedInteraction)803     void setReportedInteraction(boolean reportedInteraction) {
804         mReportedInteraction = reportedInteraction;
805     }
806 
807     @GuardedBy(anyOf = {"mService", "mProcLock"})
hasReportedInteraction()808     boolean hasReportedInteraction() {
809         return mReportedInteraction;
810     }
811 
812     @GuardedBy({"mService", "mProcLock"})
setInteractionEventTime(long interactionEventTime)813     void setInteractionEventTime(long interactionEventTime) {
814         mInteractionEventTime = interactionEventTime;
815         mApp.getWindowProcessController().setInteractionEventTime(interactionEventTime);
816     }
817 
818     @GuardedBy(anyOf = {"mService", "mProcLock"})
getInteractionEventTime()819     long getInteractionEventTime() {
820         return mInteractionEventTime;
821     }
822 
823     @GuardedBy({"mService", "mProcLock"})
setFgInteractionTime(long fgInteractionTime)824     void setFgInteractionTime(long fgInteractionTime) {
825         mFgInteractionTime = fgInteractionTime;
826         mApp.getWindowProcessController().setFgInteractionTime(fgInteractionTime);
827     }
828 
829     @GuardedBy(anyOf = {"mService", "mProcLock"})
getFgInteractionTime()830     long getFgInteractionTime() {
831         return mFgInteractionTime;
832     }
833 
834     @GuardedBy("mService")
setForcingToImportant(Object forcingToImportant)835     void setForcingToImportant(Object forcingToImportant) {
836         mForcingToImportant = forcingToImportant;
837     }
838 
839     @GuardedBy("mService")
getForcingToImportant()840     Object getForcingToImportant() {
841         return mForcingToImportant;
842     }
843 
844     @GuardedBy("mService")
setAdjSeq(int adjSeq)845     void setAdjSeq(int adjSeq) {
846         mAdjSeq = adjSeq;
847     }
848 
849     @GuardedBy("mService")
decAdjSeq()850     void decAdjSeq() {
851         mAdjSeq--;
852     }
853 
854     @GuardedBy("mService")
getAdjSeq()855     int getAdjSeq() {
856         return mAdjSeq;
857     }
858 
859     @GuardedBy("mService")
setCompletedAdjSeq(int completedAdjSeq)860     void setCompletedAdjSeq(int completedAdjSeq) {
861         mCompletedAdjSeq = completedAdjSeq;
862     }
863 
864     @GuardedBy("mService")
decCompletedAdjSeq()865     void decCompletedAdjSeq() {
866         mCompletedAdjSeq--;
867     }
868 
869     @GuardedBy("mService")
getCompletedAdjSeq()870     int getCompletedAdjSeq() {
871         return mCompletedAdjSeq;
872     }
873 
874     @GuardedBy("mService")
setContainsCycle(boolean containsCycle)875     void setContainsCycle(boolean containsCycle) {
876         mContainsCycle = containsCycle;
877     }
878 
879     @GuardedBy("mService")
containsCycle()880     boolean containsCycle() {
881         return mContainsCycle;
882     }
883 
884     @GuardedBy({"mService", "mProcLock"})
setWhenUnimportant(long whenUnimportant)885     void setWhenUnimportant(long whenUnimportant) {
886         mWhenUnimportant = whenUnimportant;
887         mApp.getWindowProcessController().setWhenUnimportant(whenUnimportant);
888     }
889 
890     @GuardedBy(anyOf = {"mService", "mProcLock"})
getWhenUnimportant()891     long getWhenUnimportant() {
892         return mWhenUnimportant;
893     }
894 
895     @GuardedBy("mService")
setLastTopTime(long lastTopTime)896     void setLastTopTime(long lastTopTime) {
897         mLastTopTime = lastTopTime;
898     }
899 
900     @GuardedBy("mService")
getLastTopTime()901     long getLastTopTime() {
902         return mLastTopTime;
903     }
904 
905     @GuardedBy("mService")
isEmpty()906     boolean isEmpty() {
907         return mCurProcState >= PROCESS_STATE_CACHED_EMPTY;
908     }
909 
910     @GuardedBy("mService")
isCached()911     boolean isCached() {
912         return mCurAdj >= CACHED_APP_MIN_ADJ;
913     }
914 
915     @GuardedBy("mService")
getCacheOomRankerUseCount()916     int getCacheOomRankerUseCount() {
917         return mCacheOomRankerUseCount;
918     }
919 
920     @GuardedBy("mService")
setSystemNoUi(boolean systemNoUi)921     void setSystemNoUi(boolean systemNoUi) {
922         mSystemNoUi = systemNoUi;
923     }
924 
925     @GuardedBy("mService")
isSystemNoUi()926     boolean isSystemNoUi() {
927         return mSystemNoUi;
928     }
929 
930     @GuardedBy("mService")
setAdjType(String adjType)931     void setAdjType(String adjType) {
932         if (TRACE_OOM_ADJ) {
933             Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER,
934                     "oom:" + mApp.processName + "/u" + mApp.uid, 0);
935             Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
936                     "oom:" + mApp.processName + "/u" + mApp.uid, adjType, 0);
937         }
938         mAdjType = adjType;
939     }
940 
941     @GuardedBy("mService")
getAdjType()942     String getAdjType() {
943         return mAdjType;
944     }
945 
946     @GuardedBy({"mService", "mProcLock"})
setAdjTypeCode(int adjTypeCode)947     void setAdjTypeCode(int adjTypeCode) {
948         mAdjTypeCode = adjTypeCode;
949     }
950 
951     @GuardedBy(anyOf = {"mService", "mProcLock"})
getAdjTypeCode()952     int getAdjTypeCode() {
953         return mAdjTypeCode;
954     }
955 
956     @GuardedBy({"mService", "mProcLock"})
setAdjSource(Object adjSource)957     void setAdjSource(Object adjSource) {
958         mAdjSource = adjSource;
959     }
960 
961     @GuardedBy(anyOf = {"mService", "mProcLock"})
getAdjSource()962     Object getAdjSource() {
963         return mAdjSource;
964     }
965 
966     @GuardedBy({"mService", "mProcLock"})
setAdjSourceProcState(int adjSourceProcState)967     void setAdjSourceProcState(int adjSourceProcState) {
968         mAdjSourceProcState = adjSourceProcState;
969     }
970 
971     @GuardedBy(anyOf = {"mService", "mProcLock"})
getAdjSourceProcState()972     int getAdjSourceProcState() {
973         return mAdjSourceProcState;
974     }
975 
976     @GuardedBy({"mService", "mProcLock"})
setAdjTarget(Object adjTarget)977     void setAdjTarget(Object adjTarget) {
978         mAdjTarget = adjTarget;
979     }
980 
981     @GuardedBy(anyOf = {"mService", "mProcLock"})
getAdjTarget()982     Object getAdjTarget() {
983         return mAdjTarget;
984     }
985 
986     @GuardedBy("mService")
isReachable()987     boolean isReachable() {
988         return mReachable;
989     }
990 
991     @GuardedBy("mService")
setReachable(boolean reachable)992     void setReachable(boolean reachable) {
993         mReachable = reachable;
994     }
995 
996     @GuardedBy("mService")
resetCachedInfo()997     void resetCachedInfo() {
998         mCachedHasActivities = VALUE_INVALID;
999         mCachedIsHeavyWeight = VALUE_INVALID;
1000         mCachedHasVisibleActivities = VALUE_INVALID;
1001         mCachedIsHomeProcess = VALUE_INVALID;
1002         mCachedIsPreviousProcess = VALUE_INVALID;
1003         mCachedHasRecentTasks = VALUE_INVALID;
1004         mCachedIsReceivingBroadcast = VALUE_INVALID;
1005         mCachedAdj = ProcessList.INVALID_ADJ;
1006         mCachedForegroundActivities = false;
1007         mCachedProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
1008         mCachedSchedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
1009         mCachedAdjType = null;
1010     }
1011 
1012     @GuardedBy("mService")
getCachedHasActivities()1013     boolean getCachedHasActivities() {
1014         if (mCachedHasActivities == VALUE_INVALID) {
1015             mCachedHasActivities = mApp.getWindowProcessController().hasActivities() ? VALUE_TRUE
1016                     : VALUE_FALSE;
1017             if (mCachedHasActivities == VALUE_TRUE) {
1018                 mApp.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_ACTIVITY);
1019             } else {
1020                 mApp.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_ACTIVITY);
1021             }
1022         }
1023         return mCachedHasActivities == VALUE_TRUE;
1024     }
1025 
1026     @GuardedBy("mService")
getCachedIsHeavyWeight()1027     boolean getCachedIsHeavyWeight() {
1028         if (mCachedIsHeavyWeight == VALUE_INVALID) {
1029             mCachedIsHeavyWeight = mApp.getWindowProcessController().isHeavyWeightProcess()
1030                     ? VALUE_TRUE : VALUE_FALSE;
1031         }
1032         return mCachedIsHeavyWeight == VALUE_TRUE;
1033     }
1034 
1035     @GuardedBy("mService")
getCachedHasVisibleActivities()1036     boolean getCachedHasVisibleActivities() {
1037         if (mCachedHasVisibleActivities == VALUE_INVALID) {
1038             mCachedHasVisibleActivities = mApp.getWindowProcessController().hasVisibleActivities()
1039                     ? VALUE_TRUE : VALUE_FALSE;
1040         }
1041         return mCachedHasVisibleActivities == VALUE_TRUE;
1042     }
1043 
1044     @GuardedBy("mService")
getCachedIsHomeProcess()1045     boolean getCachedIsHomeProcess() {
1046         if (mCachedIsHomeProcess == VALUE_INVALID) {
1047             if (mApp.getWindowProcessController().isHomeProcess()) {
1048                 mCachedIsHomeProcess = VALUE_TRUE;
1049                 mService.mAppProfiler.mHasHomeProcess = true;
1050             } else {
1051                 mCachedIsHomeProcess = VALUE_FALSE;
1052             }
1053         }
1054         return mCachedIsHomeProcess == VALUE_TRUE;
1055     }
1056 
1057     @GuardedBy("mService")
getCachedIsPreviousProcess()1058     boolean getCachedIsPreviousProcess() {
1059         if (mCachedIsPreviousProcess == VALUE_INVALID) {
1060             if (mApp.getWindowProcessController().isPreviousProcess()) {
1061                 mCachedIsPreviousProcess = VALUE_TRUE;
1062                 mService.mAppProfiler.mHasPreviousProcess = true;
1063             } else {
1064                 mCachedIsPreviousProcess = VALUE_FALSE;
1065             }
1066         }
1067         return mCachedIsPreviousProcess == VALUE_TRUE;
1068     }
1069 
1070     @GuardedBy("mService")
getCachedHasRecentTasks()1071     boolean getCachedHasRecentTasks() {
1072         if (mCachedHasRecentTasks == VALUE_INVALID) {
1073             mCachedHasRecentTasks = mApp.getWindowProcessController().hasRecentTasks()
1074                     ? VALUE_TRUE : VALUE_FALSE;
1075         }
1076         return mCachedHasRecentTasks == VALUE_TRUE;
1077     }
1078 
1079     @GuardedBy("mService")
getCachedIsReceivingBroadcast(int[] outSchedGroup)1080     boolean getCachedIsReceivingBroadcast(int[] outSchedGroup) {
1081         if (mCachedIsReceivingBroadcast == VALUE_INVALID) {
1082             mCachedIsReceivingBroadcast = mService.isReceivingBroadcastLocked(mApp, outSchedGroup)
1083                     ? VALUE_TRUE : VALUE_FALSE;
1084             if (mCachedIsReceivingBroadcast == VALUE_TRUE) {
1085                 mCachedSchedGroup = outSchedGroup[0];
1086                 mApp.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER);
1087             } else {
1088                 mApp.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER);
1089             }
1090         }
1091         return mCachedIsReceivingBroadcast == VALUE_TRUE;
1092     }
1093 
1094     @GuardedBy("mService")
getCachedCompatChange(@achedCompatChangeId int cachedCompatChangeId)1095     boolean getCachedCompatChange(@CachedCompatChangeId int cachedCompatChangeId) {
1096         if (mCachedCompatChanges[cachedCompatChangeId] == VALUE_INVALID) {
1097             mCachedCompatChanges[cachedCompatChangeId] = mService.mOomAdjuster
1098                     .isChangeEnabled(cachedCompatChangeId, mApp.info, false /* default */)
1099                     ? VALUE_TRUE : VALUE_FALSE;
1100         }
1101         return mCachedCompatChanges[cachedCompatChangeId] == VALUE_TRUE;
1102     }
1103 
1104     /** This is only called if the process contains activities and is not the global top. */
1105     @GuardedBy("mService")
computeOomAdjFromActivitiesIfNecessary(OomAdjuster.ComputeOomAdjWindowCallback callback, int adj, boolean foregroundActivities, boolean hasVisibleActivities, int procState, int schedGroup, int appUid, int logUid, int processCurTop)1106     void computeOomAdjFromActivitiesIfNecessary(OomAdjuster.ComputeOomAdjWindowCallback callback,
1107             int adj, boolean foregroundActivities, boolean hasVisibleActivities, int procState,
1108             int schedGroup, int appUid, int logUid, int processCurTop) {
1109         if (mCachedAdj != ProcessList.INVALID_ADJ) {
1110             return;
1111         }
1112         callback.initialize(mApp, adj, foregroundActivities, hasVisibleActivities, procState,
1113                 schedGroup, appUid, logUid, processCurTop);
1114         final int flags = mApp.getWindowProcessController().getActivityStateFlags();
1115 
1116         if ((flags & ACTIVITY_STATE_FLAG_IS_VISIBLE) != 0) {
1117             callback.onVisibleActivity(flags);
1118         } else if ((flags & ACTIVITY_STATE_FLAG_IS_PAUSING_OR_PAUSED) != 0) {
1119             callback.onPausedActivity();
1120         } else if ((flags & ACTIVITY_STATE_FLAG_IS_STOPPING) != 0) {
1121             callback.onStoppingActivity((flags & ACTIVITY_STATE_FLAG_IS_STOPPING_FINISHING) != 0);
1122         } else {
1123             final long ts = mApp.getWindowProcessController().getPerceptibleTaskStoppedTimeMillis();
1124             callback.onOtherActivity(ts);
1125         }
1126 
1127         mCachedAdj = callback.adj;
1128         mCachedForegroundActivities = callback.foregroundActivities;
1129         mCachedHasVisibleActivities = callback.mHasVisibleActivities ? VALUE_TRUE : VALUE_FALSE;
1130         mCachedProcState = callback.procState;
1131         mCachedSchedGroup = callback.schedGroup;
1132         mCachedAdjType = callback.mAdjType;
1133 
1134         if (mCachedAdj == ProcessList.VISIBLE_APP_ADJ) {
1135             final int taskLayer = flags & ACTIVITY_STATE_FLAG_MASK_MIN_TASK_LAYER;
1136             final int minLayer = Math.min(ProcessList.VISIBLE_APP_LAYER_MAX, taskLayer);
1137             mCachedAdj += minLayer;
1138         }
1139     }
1140 
1141     @GuardedBy("mService")
getCachedAdj()1142     int getCachedAdj() {
1143         return mCachedAdj;
1144     }
1145 
1146     @GuardedBy("mService")
getCachedForegroundActivities()1147     boolean getCachedForegroundActivities() {
1148         return mCachedForegroundActivities;
1149     }
1150 
1151     @GuardedBy("mService")
getCachedProcState()1152     int getCachedProcState() {
1153         return mCachedProcState;
1154     }
1155 
1156     @GuardedBy("mService")
getCachedSchedGroup()1157     int getCachedSchedGroup() {
1158         return mCachedSchedGroup;
1159     }
1160 
1161     @GuardedBy("mService")
getCachedAdjType()1162     String getCachedAdjType() {
1163         return mCachedAdjType;
1164     }
1165 
1166     @GuardedBy("mService")
shouldScheduleLikeTopApp()1167     boolean shouldScheduleLikeTopApp() {
1168         return mScheduleLikeTopApp;
1169     }
1170 
1171     @GuardedBy("mService")
setScheduleLikeTopApp(boolean scheduleLikeTopApp)1172     void setScheduleLikeTopApp(boolean scheduleLikeTopApp) {
1173         mScheduleLikeTopApp = scheduleLikeTopApp;
1174     }
1175 
1176     @GuardedBy("mService")
getFollowupUpdateUptimeMs()1177     long getFollowupUpdateUptimeMs() {
1178         return mFollowupUpdateUptimeMs;
1179     }
1180 
1181     @GuardedBy("mService")
setFollowupUpdateUptimeMs(long updateUptimeMs)1182     void setFollowupUpdateUptimeMs(long updateUptimeMs) {
1183         mFollowupUpdateUptimeMs = updateUptimeMs;
1184     }
1185 
1186     @GuardedBy(anyOf = {"mService", "mProcLock"})
makeAdjReason()1187     public String makeAdjReason() {
1188         if (mAdjSource != null || mAdjTarget != null) {
1189             StringBuilder sb = new StringBuilder(128);
1190             sb.append(' ');
1191             if (mAdjTarget instanceof ComponentName) {
1192                 sb.append(((ComponentName) mAdjTarget).flattenToShortString());
1193             } else if (mAdjTarget != null) {
1194                 sb.append(mAdjTarget.toString());
1195             } else {
1196                 sb.append("{null}");
1197             }
1198             sb.append("<=");
1199             if (mAdjSource instanceof ProcessRecord) {
1200                 sb.append("Proc{");
1201                 sb.append(((ProcessRecord) mAdjSource).toShortString());
1202                 sb.append("}");
1203             } else if (mAdjSource != null) {
1204                 sb.append(mAdjSource.toString());
1205             } else {
1206                 sb.append("{null}");
1207             }
1208             return sb.toString();
1209         }
1210         return null;
1211     }
1212 
1213     @GuardedBy({"mService", "mProcLock"})
onCleanupApplicationRecordLSP()1214     void onCleanupApplicationRecordLSP() {
1215         if (TRACE_OOM_ADJ) {
1216             Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER,
1217                     "oom:" + mApp.processName + "/u" + mApp.uid, 0);
1218         }
1219         setHasForegroundActivities(false);
1220         mHasShownUi = false;
1221         mForcingToImportant = null;
1222         mCurRawAdj = mSetRawAdj = mCurAdj = mSetAdj = mVerifiedAdj = ProcessList.INVALID_ADJ;
1223         mCurCapability = mSetCapability = PROCESS_CAPABILITY_NONE;
1224         mCurSchedGroup = mSetSchedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
1225         mCurProcState = mCurRawProcState = mSetProcState = PROCESS_STATE_NONEXISTENT;
1226         for (int i = 0; i < mCachedCompatChanges.length; i++) {
1227             mCachedCompatChanges[i] = VALUE_INVALID;
1228         }
1229     }
1230 
1231     @GuardedBy("mService")
isBackgroundRestricted()1232     boolean isBackgroundRestricted() {
1233         return mBackgroundRestricted;
1234     }
1235 
1236     @GuardedBy("mService")
setBackgroundRestricted(boolean restricted)1237     void setBackgroundRestricted(boolean restricted) {
1238         mBackgroundRestricted = restricted;
1239     }
1240 
1241     @GuardedBy("mService")
isCurBoundByNonBgRestrictedApp()1242     boolean isCurBoundByNonBgRestrictedApp() {
1243         return mCurBoundByNonBgRestrictedApp;
1244     }
1245 
1246     @GuardedBy("mService")
setCurBoundByNonBgRestrictedApp(boolean bound)1247     void setCurBoundByNonBgRestrictedApp(boolean bound) {
1248         mCurBoundByNonBgRestrictedApp = bound;
1249     }
1250 
1251     @GuardedBy("mService")
isSetBoundByNonBgRestrictedApp()1252     boolean isSetBoundByNonBgRestrictedApp() {
1253         return mSetBoundByNonBgRestrictedApp;
1254     }
1255 
1256     @GuardedBy("mService")
setSetBoundByNonBgRestrictedApp(boolean bound)1257     void setSetBoundByNonBgRestrictedApp(boolean bound) {
1258         mSetBoundByNonBgRestrictedApp = bound;
1259     }
1260 
1261     @GuardedBy("mService")
updateLastInvisibleTime(boolean hasVisibleActivities)1262     void updateLastInvisibleTime(boolean hasVisibleActivities) {
1263         if (hasVisibleActivities) {
1264             mLastInvisibleTime = Long.MAX_VALUE;
1265         } else if (mLastInvisibleTime == Long.MAX_VALUE) {
1266             mLastInvisibleTime = SystemClock.elapsedRealtime();
1267         }
1268     }
1269 
1270     @GuardedBy("mService")
1271     @ElapsedRealtimeLong
getLastInvisibleTime()1272     long getLastInvisibleTime() {
1273         return mLastInvisibleTime;
1274     }
1275 
1276     @GuardedBy("mService")
setNoKillOnBgRestrictedAndIdle(boolean shouldNotKill)1277     void setNoKillOnBgRestrictedAndIdle(boolean shouldNotKill) {
1278         mNoKillOnBgRestrictedAndIdle = shouldNotKill;
1279     }
1280 
1281     @GuardedBy("mService")
shouldNotKillOnBgRestrictedAndIdle()1282     boolean shouldNotKillOnBgRestrictedAndIdle() {
1283         return mNoKillOnBgRestrictedAndIdle;
1284     }
1285 
1286     @GuardedBy("mService")
setSetCached(boolean cached)1287     void setSetCached(boolean cached) {
1288         mSetCached = cached;
1289     }
1290 
1291     @GuardedBy("mService")
isSetCached()1292     boolean isSetCached() {
1293         return mSetCached;
1294     }
1295 
1296     @GuardedBy("mService")
setSetNoKillOnBgRestrictedAndIdle(boolean shouldNotKill)1297     void setSetNoKillOnBgRestrictedAndIdle(boolean shouldNotKill) {
1298         mSetNoKillOnBgRestrictedAndIdle = shouldNotKill;
1299     }
1300 
1301     @GuardedBy("mService")
isSetNoKillOnBgRestrictedAndIdle()1302     boolean isSetNoKillOnBgRestrictedAndIdle() {
1303         return mSetNoKillOnBgRestrictedAndIdle;
1304     }
1305 
1306     @GuardedBy("mService")
setLastCanKillOnBgRestrictedAndIdleTime(@lapsedRealtimeLong long now)1307     void setLastCanKillOnBgRestrictedAndIdleTime(@ElapsedRealtimeLong long now) {
1308         mLastCanKillOnBgRestrictedAndIdleTime = now;
1309     }
1310 
1311     @ElapsedRealtimeLong
1312     @GuardedBy("mService")
getLastCanKillOnBgRestrictedAndIdleTime()1313     long getLastCanKillOnBgRestrictedAndIdleTime() {
1314         return mLastCanKillOnBgRestrictedAndIdleTime;
1315     }
1316 
setCacheOomRankerRss(long rss, long rssTimeMs)1317     public void setCacheOomRankerRss(long rss, long rssTimeMs) {
1318         mCacheOomRankerRss = rss;
1319         mCacheOomRankerRssTimeMs = rssTimeMs;
1320     }
1321 
1322     @GuardedBy("mService")
getCacheOomRankerRss()1323     public long getCacheOomRankerRss() {
1324         return mCacheOomRankerRss;
1325     }
1326 
1327     @GuardedBy("mService")
getCacheOomRankerRssTimeMs()1328     public long getCacheOomRankerRssTimeMs() {
1329         return mCacheOomRankerRssTimeMs;
1330     }
1331 
1332     @GuardedBy({"mService", "mProcLock"})
dump(PrintWriter pw, String prefix, long nowUptime)1333     void dump(PrintWriter pw, String prefix, long nowUptime) {
1334         if (mReportedInteraction || mFgInteractionTime != 0) {
1335             pw.print(prefix); pw.print("reportedInteraction=");
1336             pw.print(mReportedInteraction);
1337             if (mInteractionEventTime != 0) {
1338                 pw.print(" time=");
1339                 TimeUtils.formatDuration(mInteractionEventTime, SystemClock.elapsedRealtime(), pw);
1340             }
1341             if (mFgInteractionTime != 0) {
1342                 pw.print(" fgInteractionTime=");
1343                 TimeUtils.formatDuration(mFgInteractionTime, SystemClock.elapsedRealtime(), pw);
1344             }
1345             pw.println();
1346         }
1347         pw.print(prefix); pw.print("adjSeq="); pw.print(mAdjSeq);
1348         pw.print(" lruSeq="); pw.println(mApp.getLruSeq());
1349         pw.print(prefix); pw.print("oom adj: max="); pw.print(mMaxAdj);
1350         pw.print(" curRaw="); pw.print(mCurRawAdj);
1351         pw.print(" setRaw="); pw.print(mSetRawAdj);
1352         pw.print(" cur="); pw.print(mCurAdj);
1353         pw.print(" set="); pw.println(mSetAdj);
1354         pw.print(prefix); pw.print("mCurSchedGroup="); pw.print(mCurSchedGroup);
1355         pw.print(" setSchedGroup="); pw.print(mSetSchedGroup);
1356         pw.print(" systemNoUi="); pw.println(mSystemNoUi);
1357         pw.print(prefix); pw.print("curProcState="); pw.print(getCurProcState());
1358         pw.print(" mRepProcState="); pw.print(mRepProcState);
1359         pw.print(" setProcState="); pw.print(mSetProcState);
1360         pw.print(" lastStateTime=");
1361         TimeUtils.formatDuration(getLastStateTime(), nowUptime, pw);
1362         pw.println();
1363         pw.print(prefix); pw.print("curCapability=");
1364         ActivityManager.printCapabilitiesFull(pw, mCurCapability);
1365         pw.print(" setCapability=");
1366         ActivityManager.printCapabilitiesFull(pw, mSetCapability);
1367         pw.println();
1368         if (mBackgroundRestricted) {
1369             pw.print(" backgroundRestricted=");
1370             pw.print(mBackgroundRestricted);
1371             pw.print(" boundByNonBgRestrictedApp=");
1372             pw.print(mSetBoundByNonBgRestrictedApp);
1373         }
1374         pw.println();
1375         if (mHasShownUi || mApp.mProfile.hasPendingUiClean()) {
1376             pw.print(prefix); pw.print("hasShownUi="); pw.print(mHasShownUi);
1377             pw.print(" pendingUiClean="); pw.println(mApp.mProfile.hasPendingUiClean());
1378         }
1379         pw.print(prefix); pw.print("cached="); pw.print(isCached());
1380         pw.print(" empty="); pw.println(isEmpty());
1381         if (mServiceB) {
1382             pw.print(prefix); pw.print("serviceb="); pw.print(mServiceB);
1383             pw.print(" serviceHighRam="); pw.println(mServiceHighRam);
1384         }
1385         if (mNotCachedSinceIdle) {
1386             pw.print(prefix); pw.print("notCachedSinceIdle="); pw.print(mNotCachedSinceIdle);
1387             if (mService.mAppProfiler.isProfilingPss()) {
1388                 pw.print(" initialIdlePss=");
1389             } else {
1390                 pw.print(" initialIdleRss=");
1391             }
1392             pw.println(mApp.mProfile.getInitialIdlePssOrRss());
1393         }
1394         if (hasTopUi() || hasOverlayUi() || mRunningRemoteAnimation) {
1395             pw.print(prefix); pw.print("hasTopUi="); pw.print(hasTopUi());
1396             pw.print(" hasOverlayUi="); pw.print(hasOverlayUi());
1397             pw.print(" runningRemoteAnimation="); pw.println(mRunningRemoteAnimation);
1398         }
1399         if (mHasForegroundActivities || mRepForegroundActivities) {
1400             pw.print(prefix);
1401             pw.print("foregroundActivities="); pw.print(mHasForegroundActivities);
1402             pw.print(" (rep="); pw.print(mRepForegroundActivities); pw.println(")");
1403         }
1404         if (mSetProcState > ActivityManager.PROCESS_STATE_SERVICE) {
1405             pw.print(prefix);
1406             pw.print("whenUnimportant=");
1407             TimeUtils.formatDuration(mWhenUnimportant - nowUptime, pw);
1408             pw.println();
1409         }
1410         if (mLastTopTime > 0) {
1411             pw.print(prefix); pw.print("lastTopTime=");
1412             TimeUtils.formatDuration(mLastTopTime, nowUptime, pw);
1413             pw.println();
1414         }
1415         if (mLastInvisibleTime > 0 && mLastInvisibleTime < Long.MAX_VALUE) {
1416             pw.print(prefix); pw.print("lastInvisibleTime=");
1417             final long elapsedRealtimeNow = SystemClock.elapsedRealtime();
1418             final long currentTimeNow = System.currentTimeMillis();
1419             final long lastInvisibleCurrentTime =
1420                     currentTimeNow - elapsedRealtimeNow + mLastInvisibleTime;
1421             TimeUtils.dumpTimeWithDelta(pw, lastInvisibleCurrentTime, currentTimeNow);
1422             pw.println();
1423         }
1424         if (mHasStartedServices) {
1425             pw.print(prefix); pw.print("hasStartedServices="); pw.println(mHasStartedServices);
1426         }
1427     }
1428 }
1429