blob: 6cb1097c7ddf524b3c6d4989f04a930797dd420c [file] [log] [blame]
Dianne Hackbornd23e0d62015-05-15 16:36:12 -07001/*
2 * Copyright (C) 2015 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
17package com.android.server.am;
18
Sudheer Shankaf4923ea2017-03-27 15:36:35 -070019import android.Manifest;
Dianne Hackbornd23e0d62015-05-15 16:36:12 -070020import android.app.ActivityManager;
Sudheer Shankaf4923ea2017-03-27 15:36:35 -070021import android.content.pm.PackageManager;
Dianne Hackbornbef28fe2015-10-29 17:57:11 -070022import android.os.SystemClock;
Dianne Hackbornd23e0d62015-05-15 16:36:12 -070023import android.os.UserHandle;
Dianne Hackbornbef28fe2015-10-29 17:57:11 -070024import android.util.TimeUtils;
Yi Jin148d7f42017-11-28 14:23:56 -080025import android.util.proto.ProtoOutputStream;
26import android.util.proto.ProtoUtils;
Dianne Hackbornd23e0d62015-05-15 16:36:12 -070027
Sudheer Shanka84a48952017-03-08 18:19:01 -080028import com.android.internal.annotations.GuardedBy;
Wale Ogunwalebff2df42018-10-18 17:09:19 -070029import com.android.server.wm.ActivityTaskManagerInternal;
Sudheer Shanka84a48952017-03-08 18:19:01 -080030
Dianne Hackbornd23e0d62015-05-15 16:36:12 -070031/**
32 * Overall information about a uid that has actively running processes.
33 */
34public final class UidRecord {
35 final int uid;
Wale Ogunwalebff2df42018-10-18 17:09:19 -070036 private int mCurProcState;
Dianne Hackbornd23e0d62015-05-15 16:36:12 -070037 int setProcState = ActivityManager.PROCESS_STATE_NONEXISTENT;
Dianne Hackbornbef28fe2015-10-29 17:57:11 -070038 long lastBackgroundTime;
Dianne Hackborne07641d2016-11-09 15:07:23 -080039 boolean ephemeral;
Dianne Hackbornbe68d492017-05-03 18:04:05 -070040 boolean foregroundServices;
Dianne Hackborn85e35642017-01-12 15:10:57 -080041 boolean curWhitelist;
42 boolean setWhitelist;
Dianne Hackbornbef28fe2015-10-29 17:57:11 -070043 boolean idle;
Dianne Hackborn3e99f652017-07-05 16:33:56 -070044 boolean setIdle;
Dianne Hackbornd23e0d62015-05-15 16:36:12 -070045 int numProcs;
Wale Ogunwalebff2df42018-10-18 17:09:19 -070046 final ActivityTaskManagerInternal mAtmInternal;
Sudheer Shanka51ab3ac2017-03-07 15:38:01 -080047
Sudheer Shanka88c4d1c2017-02-23 16:34:40 -080048 /**
Wale Ogunwalebff2df42018-10-18 17:09:19 -070049 * Sequence number associated with the {@link #mCurProcState}. This is incremented using
Sudheer Shanka88c4d1c2017-02-23 16:34:40 -080050 * {@link ActivityManagerService#mProcStateSeqCounter}
Wale Ogunwalebff2df42018-10-18 17:09:19 -070051 * when {@link #mCurProcState} changes from background to foreground or vice versa.
Sudheer Shanka88c4d1c2017-02-23 16:34:40 -080052 */
Sudheer Shankaf4923ea2017-03-27 15:36:35 -070053 @GuardedBy("networkStateUpdate")
Sudheer Shanka88c4d1c2017-02-23 16:34:40 -080054 long curProcStateSeq;
Sudheer Shanka51ab3ac2017-03-07 15:38:01 -080055
Sudheer Shankae7361852017-03-07 11:51:46 -080056 /**
57 * Last seq number for which NetworkPolicyManagerService notified ActivityManagerService that
58 * network policies rules were updated.
59 */
Sudheer Shankaf4923ea2017-03-27 15:36:35 -070060 @GuardedBy("networkStateUpdate")
Sudheer Shankae7361852017-03-07 11:51:46 -080061 long lastNetworkUpdatedProcStateSeq;
Dianne Hackbornd23e0d62015-05-15 16:36:12 -070062
Sudheer Shanka51ab3ac2017-03-07 15:38:01 -080063 /**
64 * Last seq number for which AcitivityManagerService dispatched uid state change to
65 * NetworkPolicyManagerService.
66 */
Sudheer Shankaf4923ea2017-03-27 15:36:35 -070067 @GuardedBy("networkStateUpdate")
Sudheer Shanka51ab3ac2017-03-07 15:38:01 -080068 long lastDispatchedProcStateSeq;
69
Sudheer Shanka84a48952017-03-08 18:19:01 -080070 /**
71 * Indicates if any thread is waiting for network rules to get updated for {@link #uid}.
72 */
Sudheer Shankaf4923ea2017-03-27 15:36:35 -070073 volatile boolean waitingForNetwork;
Sudheer Shanka84a48952017-03-08 18:19:01 -080074
Sudheer Shankaf4923ea2017-03-27 15:36:35 -070075 /**
76 * Indicates whether this uid has internet permission or not.
77 */
78 volatile boolean hasInternetPermission;
79
80 /**
81 * This object is used for waiting for the network state to get updated.
82 */
83 final Object networkStateLock = new Object();
Sudheer Shanka84a48952017-03-08 18:19:01 -080084
Dianne Hackbornbef28fe2015-10-29 17:57:11 -070085 static final int CHANGE_PROCSTATE = 0;
Dianne Hackborn3e99f652017-07-05 16:33:56 -070086 static final int CHANGE_GONE = 1<<0;
87 static final int CHANGE_IDLE = 1<<1;
88 static final int CHANGE_ACTIVE = 1<<2;
89 static final int CHANGE_CACHED = 1<<3;
90 static final int CHANGE_UNCACHED = 1<<4;
Dianne Hackbornbef28fe2015-10-29 17:57:11 -070091
Yi Jin148d7f42017-11-28 14:23:56 -080092 // Keep the enum lists in sync
93 private static int[] ORIG_ENUMS = new int[] {
94 CHANGE_GONE,
95 CHANGE_IDLE,
96 CHANGE_ACTIVE,
97 CHANGE_CACHED,
98 CHANGE_UNCACHED,
99 };
100 private static int[] PROTO_ENUMS = new int[] {
101 UidRecordProto.CHANGE_GONE,
102 UidRecordProto.CHANGE_IDLE,
103 UidRecordProto.CHANGE_ACTIVE,
104 UidRecordProto.CHANGE_CACHED,
105 UidRecordProto.CHANGE_UNCACHED,
106 };
107
Dianne Hackbornd23e0d62015-05-15 16:36:12 -0700108 static final class ChangeItem {
109 UidRecord uidRecord;
110 int uid;
Dianne Hackbornbef28fe2015-10-29 17:57:11 -0700111 int change;
Dianne Hackbornd23e0d62015-05-15 16:36:12 -0700112 int processState;
Dianne Hackborne07641d2016-11-09 15:07:23 -0800113 boolean ephemeral;
Sudheer Shanka80255802017-03-04 14:48:53 -0800114 long procStateSeq;
Dianne Hackbornd23e0d62015-05-15 16:36:12 -0700115 }
116
117 ChangeItem pendingChange;
Dianne Hackborn3e99f652017-07-05 16:33:56 -0700118 int lastReportedChange;
Dianne Hackbornd23e0d62015-05-15 16:36:12 -0700119
Wale Ogunwalebff2df42018-10-18 17:09:19 -0700120 public UidRecord(int _uid, ActivityTaskManagerInternal atmInternal) {
Dianne Hackbornd23e0d62015-05-15 16:36:12 -0700121 uid = _uid;
Dianne Hackborn333394a2017-03-23 16:11:25 -0700122 idle = true;
Wale Ogunwalebff2df42018-10-18 17:09:19 -0700123 mAtmInternal = atmInternal;
Dianne Hackbornd23e0d62015-05-15 16:36:12 -0700124 reset();
125 }
126
Wale Ogunwalebff2df42018-10-18 17:09:19 -0700127 public int getCurProcState() {
128 return mCurProcState;
129 }
130
131 public void setCurProcState(int curProcState) {
132 mCurProcState = curProcState;
133 if (mAtmInternal != null) {
134 mAtmInternal.onUidProcStateChanged(uid, curProcState);
135 }
136 }
137
Dianne Hackbornd23e0d62015-05-15 16:36:12 -0700138 public void reset() {
Wale Ogunwalebff2df42018-10-18 17:09:19 -0700139 setCurProcState(ActivityManager.PROCESS_STATE_CACHED_EMPTY);
Dianne Hackbornbe68d492017-05-03 18:04:05 -0700140 foregroundServices = false;
Dianne Hackbornd23e0d62015-05-15 16:36:12 -0700141 }
142
Sudheer Shankaf4923ea2017-03-27 15:36:35 -0700143 public void updateHasInternetPermission() {
144 hasInternetPermission = ActivityManager.checkUidPermission(Manifest.permission.INTERNET,
145 uid) == PackageManager.PERMISSION_GRANTED;
146 }
147
Sudheer Shanka51ab3ac2017-03-07 15:38:01 -0800148 /**
Dianne Hackborn3e99f652017-07-05 16:33:56 -0700149 * If the change being dispatched is not CHANGE_GONE (not interested in
Sudheer Shanka51ab3ac2017-03-07 15:38:01 -0800150 * these changes), then update the {@link #lastDispatchedProcStateSeq} with
151 * {@link #curProcStateSeq}.
152 */
153 public void updateLastDispatchedProcStateSeq(int changeToDispatch) {
Dianne Hackborn3e99f652017-07-05 16:33:56 -0700154 if ((changeToDispatch & CHANGE_GONE) == 0) {
Sudheer Shanka51ab3ac2017-03-07 15:38:01 -0800155 lastDispatchedProcStateSeq = curProcStateSeq;
156 }
157 }
158
Yi Jin148d7f42017-11-28 14:23:56 -0800159
160 void writeToProto(ProtoOutputStream proto, long fieldId) {
161 long token = proto.start(fieldId);
Yi Jin148d7f42017-11-28 14:23:56 -0800162 proto.write(UidRecordProto.UID, uid);
Wale Ogunwalebff2df42018-10-18 17:09:19 -0700163 proto.write(UidRecordProto.CURRENT, ProcessList.makeProcStateProtoEnum(mCurProcState));
Yi Jin148d7f42017-11-28 14:23:56 -0800164 proto.write(UidRecordProto.EPHEMERAL, ephemeral);
165 proto.write(UidRecordProto.FG_SERVICES, foregroundServices);
166 proto.write(UidRecordProto.WHILELIST, curWhitelist);
167 ProtoUtils.toDuration(proto, UidRecordProto.LAST_BACKGROUND_TIME,
168 lastBackgroundTime, SystemClock.elapsedRealtime());
169 proto.write(UidRecordProto.IDLE, idle);
170 if (lastReportedChange != 0) {
171 ProtoUtils.writeBitWiseFlagsToProtoEnum(proto, UidRecordProto.LAST_REPORTED_CHANGES,
172 lastReportedChange, ORIG_ENUMS, PROTO_ENUMS);
173 }
174 proto.write(UidRecordProto.NUM_PROCS, numProcs);
175
176 long seqToken = proto.start(UidRecordProto.NETWORK_STATE_UPDATE);
177 proto.write(UidRecordProto.ProcStateSequence.CURURENT, curProcStateSeq);
178 proto.write(UidRecordProto.ProcStateSequence.LAST_NETWORK_UPDATED,
179 lastNetworkUpdatedProcStateSeq);
180 proto.write(UidRecordProto.ProcStateSequence.LAST_DISPATCHED, lastDispatchedProcStateSeq);
181 proto.end(seqToken);
182
183 proto.end(token);
184 }
185
Dianne Hackbornd23e0d62015-05-15 16:36:12 -0700186 public String toString() {
187 StringBuilder sb = new StringBuilder(128);
188 sb.append("UidRecord{");
189 sb.append(Integer.toHexString(System.identityHashCode(this)));
190 sb.append(' ');
191 UserHandle.formatUid(sb, uid);
192 sb.append(' ');
Wale Ogunwalebff2df42018-10-18 17:09:19 -0700193 sb.append(ProcessList.makeProcStateString(mCurProcState));
Dianne Hackborne07641d2016-11-09 15:07:23 -0800194 if (ephemeral) {
195 sb.append(" ephemeral");
196 }
Dianne Hackbornbe68d492017-05-03 18:04:05 -0700197 if (foregroundServices) {
198 sb.append(" fgServices");
199 }
Dianne Hackborn85e35642017-01-12 15:10:57 -0800200 if (curWhitelist) {
201 sb.append(" whitelist");
202 }
Dianne Hackbornbef28fe2015-10-29 17:57:11 -0700203 if (lastBackgroundTime > 0) {
204 sb.append(" bg:");
205 TimeUtils.formatDuration(SystemClock.elapsedRealtime()-lastBackgroundTime, sb);
206 }
207 if (idle) {
208 sb.append(" idle");
209 }
Dianne Hackborn3e99f652017-07-05 16:33:56 -0700210 if (lastReportedChange != 0) {
211 sb.append(" change:");
212 boolean printed = false;
213 if ((lastReportedChange & CHANGE_GONE) != 0) {
214 printed = true;
215 sb.append("gone");
216 }
217 if ((lastReportedChange & CHANGE_IDLE) != 0) {
218 if (printed) {
219 sb.append("|");
220 }
221 printed = true;
222 sb.append("idle");
223 }
224 if ((lastReportedChange & CHANGE_ACTIVE) != 0) {
225 if (printed) {
226 sb.append("|");
227 }
228 printed = true;
229 sb.append("active");
230 }
231 if ((lastReportedChange & CHANGE_CACHED) != 0) {
232 if (printed) {
233 sb.append("|");
234 }
235 printed = true;
236 sb.append("cached");
237 }
238 if ((lastReportedChange & CHANGE_UNCACHED) != 0) {
239 if (printed) {
240 sb.append("|");
241 }
242 sb.append("uncached");
243 }
244 }
Dianne Hackbornbef28fe2015-10-29 17:57:11 -0700245 sb.append(" procs:");
Dianne Hackbornd23e0d62015-05-15 16:36:12 -0700246 sb.append(numProcs);
Dianne Hackborn0aa43132017-03-22 11:42:03 -0700247 sb.append(" seq(");
Sudheer Shanka88c4d1c2017-02-23 16:34:40 -0800248 sb.append(curProcStateSeq);
Dianne Hackborn0aa43132017-03-22 11:42:03 -0700249 sb.append(",");
Sudheer Shankae7361852017-03-07 11:51:46 -0800250 sb.append(lastNetworkUpdatedProcStateSeq);
Dianne Hackborn0aa43132017-03-22 11:42:03 -0700251 sb.append(",");
Sudheer Shanka51ab3ac2017-03-07 15:38:01 -0800252 sb.append(lastDispatchedProcStateSeq);
Dianne Hackborn0aa43132017-03-22 11:42:03 -0700253 sb.append(")}");
Dianne Hackbornd23e0d62015-05-15 16:36:12 -0700254 return sb.toString();
255 }
256}