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 & 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