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 com.android.internal.annotations.GuardedBy; 20 import com.android.internal.annotations.VisibleForTesting; 21 22 import java.io.PrintWriter; 23 24 /** 25 * The state info of app when it's cached, used by the optimizer. 26 */ 27 final class ProcessCachedOptimizerRecord { 28 private final ProcessRecord mApp; 29 30 private final ActivityManagerGlobalLock mProcLock; 31 32 @VisibleForTesting 33 static final String IS_FROZEN = "isFrozen"; 34 35 /** 36 * The last time that this process was compacted. 37 */ 38 @GuardedBy("mProcLock") 39 private long mLastCompactTime; 40 41 /** 42 * The most recent compaction action requested for this app. 43 */ 44 @GuardedBy("mProcLock") 45 private int mReqCompactAction; 46 47 /** 48 * The most recent compaction action performed for this app. 49 */ 50 @GuardedBy("mProcLock") 51 private int mLastCompactAction; 52 53 /** 54 * This process has been scheduled for a memory compaction. 55 */ 56 @GuardedBy("mProcLock") 57 private boolean mPendingCompact; 58 59 @GuardedBy("mProcLock") private boolean mForceCompact; 60 61 /** 62 * True when the process is frozen. 63 */ 64 @GuardedBy("mProcLock") 65 private boolean mFrozen; 66 67 /** 68 * An override on the freeze state is in progress. 69 */ 70 @GuardedBy("mProcLock") 71 boolean mFreezerOverride; 72 73 /** 74 * Last time the app was (un)frozen, 0 for never. 75 */ 76 @GuardedBy("mProcLock") 77 private long mFreezeUnfreezeTime; 78 79 /** 80 * True if a process has a WPRI binding from an unfrozen process. 81 */ 82 @GuardedBy("mProcLock") 83 private boolean mShouldNotFreeze; 84 85 /** 86 * Exempt from freezer (now for system apps with INSTALL_PACKAGES permission) 87 */ 88 @GuardedBy("mProcLock") 89 private boolean mFreezeExempt; 90 91 /** 92 * This process has been scheduled for freezing 93 */ 94 @GuardedBy("mProcLock") 95 private boolean mPendingFreeze; 96 97 @GuardedBy("mProcLock") getLastCompactTime()98 long getLastCompactTime() { 99 return mLastCompactTime; 100 } 101 102 @GuardedBy("mProcLock") setLastCompactTime(long lastCompactTime)103 void setLastCompactTime(long lastCompactTime) { 104 mLastCompactTime = lastCompactTime; 105 } 106 107 @GuardedBy("mProcLock") getReqCompactAction()108 int getReqCompactAction() { 109 return mReqCompactAction; 110 } 111 112 @GuardedBy("mProcLock") setReqCompactAction(int reqCompactAction)113 void setReqCompactAction(int reqCompactAction) { 114 mReqCompactAction = reqCompactAction; 115 } 116 117 @GuardedBy("mProcLock") getLastCompactAction()118 int getLastCompactAction() { 119 return mLastCompactAction; 120 } 121 122 @GuardedBy("mProcLock") setLastCompactAction(int lastCompactAction)123 void setLastCompactAction(int lastCompactAction) { 124 mLastCompactAction = lastCompactAction; 125 } 126 127 @GuardedBy("mProcLock") hasPendingCompact()128 boolean hasPendingCompact() { 129 return mPendingCompact; 130 } 131 132 @GuardedBy("mProcLock") setHasPendingCompact(boolean pendingCompact)133 void setHasPendingCompact(boolean pendingCompact) { 134 mPendingCompact = pendingCompact; 135 } 136 137 @GuardedBy("mProcLock") isForceCompact()138 boolean isForceCompact() { 139 return mForceCompact; 140 } 141 142 @GuardedBy("mProcLock") setForceCompact(boolean forceCompact)143 void setForceCompact(boolean forceCompact) { 144 mForceCompact = forceCompact; 145 } 146 147 @GuardedBy("mProcLock") isFrozen()148 boolean isFrozen() { 149 return mFrozen; 150 } 151 152 @GuardedBy("mProcLock") setFrozen(boolean frozen)153 void setFrozen(boolean frozen) { 154 mFrozen = frozen; 155 } 156 157 @GuardedBy("mProcLock") hasFreezerOverride()158 boolean hasFreezerOverride() { 159 return mFreezerOverride; 160 } 161 162 @GuardedBy("mProcLock") setFreezerOverride(boolean freezerOverride)163 void setFreezerOverride(boolean freezerOverride) { 164 mFreezerOverride = freezerOverride; 165 } 166 167 @GuardedBy("mProcLock") getFreezeUnfreezeTime()168 long getFreezeUnfreezeTime() { 169 return mFreezeUnfreezeTime; 170 } 171 172 @GuardedBy("mProcLock") setFreezeUnfreezeTime(long freezeUnfreezeTime)173 void setFreezeUnfreezeTime(long freezeUnfreezeTime) { 174 mFreezeUnfreezeTime = freezeUnfreezeTime; 175 } 176 177 @GuardedBy("mProcLock") shouldNotFreeze()178 boolean shouldNotFreeze() { 179 return mShouldNotFreeze; 180 } 181 182 @GuardedBy("mProcLock") setShouldNotFreeze(boolean shouldNotFreeze)183 void setShouldNotFreeze(boolean shouldNotFreeze) { 184 mShouldNotFreeze = shouldNotFreeze; 185 } 186 187 @GuardedBy("mProcLock") isFreezeExempt()188 boolean isFreezeExempt() { 189 return mFreezeExempt; 190 } 191 192 @GuardedBy("mProcLock") setPendingFreeze(boolean freeze)193 void setPendingFreeze(boolean freeze) { 194 mPendingFreeze = freeze; 195 } 196 197 @GuardedBy("mProcLock") isPendingFreeze()198 boolean isPendingFreeze() { 199 return mPendingFreeze; 200 } 201 202 @GuardedBy("mProcLock") setFreezeExempt(boolean exempt)203 void setFreezeExempt(boolean exempt) { 204 mFreezeExempt = exempt; 205 } 206 ProcessCachedOptimizerRecord(ProcessRecord app)207 ProcessCachedOptimizerRecord(ProcessRecord app) { 208 mApp = app; 209 mProcLock = app.mService.mProcLock; 210 } 211 init(long nowUptime)212 void init(long nowUptime) { 213 mFreezeUnfreezeTime = nowUptime; 214 } 215 216 @GuardedBy("mProcLock") dump(PrintWriter pw, String prefix, long nowUptime)217 void dump(PrintWriter pw, String prefix, long nowUptime) { 218 pw.print(prefix); pw.print("lastCompactTime="); pw.print(mLastCompactTime); 219 pw.print(" lastCompactAction="); pw.println(mLastCompactAction); 220 pw.print(prefix); 221 pw.print("hasPendingCompaction="); 222 pw.print(mPendingCompact); 223 pw.print(prefix); pw.print("isFreezeExempt="); pw.print(mFreezeExempt); 224 pw.print(" isPendingFreeze="); pw.print(mPendingFreeze); 225 pw.print(" " + IS_FROZEN + "="); pw.println(mFrozen); 226 } 227 } 228