blob: 5b3b2a8ed3d88a3de7eece84b8cf7d92f06a6c9e [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2006 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
Dianne Hackbornf51f6122013-02-04 18:23:34 -080019import android.app.AppOpsManager;
Dianne Hackborna750a632015-06-16 17:18:23 -070020import android.app.BroadcastOptions;
Suchi Amalapurapu1ccac752009-06-12 10:09:58 -070021import android.content.IIntentReceiver;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080022import android.content.ComponentName;
23import android.content.Intent;
24import android.content.pm.ActivityInfo;
25import android.content.pm.ResolveInfo;
26import android.os.Binder;
27import android.os.Bundle;
28import android.os.IBinder;
29import android.os.SystemClock;
Wale Ogunwaleca1c1252015-05-15 12:49:13 -070030import android.os.UserHandle;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080031import android.util.PrintWriterPrinter;
Dianne Hackborn39792d22010-08-19 18:01:52 -070032import android.util.TimeUtils;
Yi Jin129fc6c2017-09-28 15:48:38 -070033import android.util.proto.ProtoOutputStream;
34
35import com.android.server.am.proto.BroadcastRecordProto;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080036
37import java.io.PrintWriter;
Dianne Hackborn865907d2015-10-21 17:12:53 -070038import java.text.SimpleDateFormat;
Fyodor Kupolovd4fd8c72015-07-13 19:19:25 -070039import java.util.Arrays;
Dianne Hackbornd99b2932011-08-18 14:39:58 -070040import java.util.Date;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080041import java.util.List;
Wale Ogunwaleca1c1252015-05-15 12:49:13 -070042import java.util.Set;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080043
44/**
45 * An active intent broadcast.
46 */
Dianne Hackbornbe4e6aa2013-06-07 13:25:29 -070047final class BroadcastRecord extends Binder {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080048 final Intent intent; // the original intent that generated us
Dianne Hackborna40cfeb2013-03-25 17:49:36 -070049 final ComponentName targetComp; // original component name set on the intent
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080050 final ProcessRecord callerApp; // process that sent this
51 final String callerPackage; // who sent this
52 final int callingPid; // the pid of who sent this
53 final int callingUid; // the uid of who sent this
Chad Brubaker816c83b2017-03-02 10:27:59 -080054 final boolean callerInstantApp; // caller is an Instant App?
Dianne Hackborn68d881c2009-10-05 13:58:17 -070055 final boolean ordered; // serialize the send to receivers?
56 final boolean sticky; // originated from existing sticky data?
Dianne Hackborn12527f92009-11-11 17:39:50 -080057 final boolean initialSticky; // initial broadcast from register to sticky?
Dianne Hackborn786b4402012-08-27 15:14:02 -070058 final int userId; // user id this broadcast was for
Ben Gruver49660c72013-08-06 19:54:08 -070059 final String resolvedType; // the resolved data type
Fyodor Kupolovd4fd8c72015-07-13 19:19:25 -070060 final String[] requiredPermissions; // permissions the caller has required
Dianne Hackbornf51f6122013-02-04 18:23:34 -080061 final int appOp; // an app op that is associated with this broadcast
Dianne Hackborna750a632015-06-16 17:18:23 -070062 final BroadcastOptions options; // BroadcastOptions supplied by caller
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080063 final List receivers; // contains BroadcastFilter and ResolveInfo
Dianne Hackborne0e413e2015-12-09 17:22:26 -080064 final int[] delivery; // delivery state of each receiver
Johannes Carlssonb5a86542010-10-27 10:08:10 +020065 IIntentReceiver resultTo; // who receives final result if non-null
Jeff Brown9fb3fd12014-09-29 15:32:12 -070066 long enqueueClockTime; // the clock time the broadcast was enqueued
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080067 long dispatchTime; // when dispatch started on this set of receivers
Dianne Hackbornd99b2932011-08-18 14:39:58 -070068 long dispatchClockTime; // the clock time the dispatch started
Dianne Hackborn12527f92009-11-11 17:39:50 -080069 long receiverTime; // when current receiver started for timeouts.
70 long finishTime; // when we finished the broadcast.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080071 int resultCode; // current result code value.
72 String resultData; // current result data value.
73 Bundle resultExtras; // current result extra data values.
74 boolean resultAbort; // current result abortBroadcast value.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080075 int nextReceiver; // next receiver to be executed.
76 IBinder receiver; // who is currently running, null if none.
77 int state;
78 int anrCount; // has this broadcast record hit any ANRs?
Dianne Hackbornbc02a392016-06-02 17:15:08 -070079 int manifestCount; // number of manifest receivers dispatched.
80 int manifestSkipCount; // number of manifest receivers skipped.
Dianne Hackborn40c8db52012-02-10 18:59:48 -080081 BroadcastQueue queue; // the outbound queue handling this broadcast
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080082
83 static final int IDLE = 0;
84 static final int APP_RECEIVE = 1;
85 static final int CALL_IN_RECEIVE = 2;
86 static final int CALL_DONE_RECEIVE = 3;
Dianne Hackborn6285a322013-09-18 12:09:47 -070087 static final int WAITING_SERVICES = 4;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080088
Dianne Hackborne0e413e2015-12-09 17:22:26 -080089 static final int DELIVERY_PENDING = 0;
90 static final int DELIVERY_DELIVERED = 1;
91 static final int DELIVERY_SKIPPED = 2;
92 static final int DELIVERY_TIMEOUT = 3;
93
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080094 // The following are set when we are calling a receiver (one that
95 // was found in our list of registered receivers).
96 BroadcastFilter curFilter;
97
98 // The following are set only when we are launching a receiver (one
99 // that was found by querying the package manager).
100 ProcessRecord curApp; // hosting application of current receiver.
101 ComponentName curComponent; // the receiver class that is currently running.
102 ActivityInfo curReceiver; // info about the receiver that is currently running.
103
Dianne Hackborn865907d2015-10-21 17:12:53 -0700104 void dump(PrintWriter pw, String prefix, SimpleDateFormat sdf) {
Dianne Hackborn39792d22010-08-19 18:01:52 -0700105 final long now = SystemClock.uptimeMillis();
106
Dianne Hackborn786b4402012-08-27 15:14:02 -0700107 pw.print(prefix); pw.print(this); pw.print(" to user "); pw.println(userId);
Dianne Hackbornc0bd7472012-10-09 14:00:30 -0700108 pw.print(prefix); pw.println(intent.toInsecureString());
Dianne Hackborna40cfeb2013-03-25 17:49:36 -0700109 if (targetComp != null && targetComp != intent.getComponent()) {
110 pw.print(prefix); pw.print(" targetComp: "); pw.println(targetComp.toShortString());
111 }
Dianne Hackbornc0bd7472012-10-09 14:00:30 -0700112 Bundle bundle = intent.getExtras();
113 if (bundle != null) {
Dianne Hackborna40cfeb2013-03-25 17:49:36 -0700114 pw.print(prefix); pw.print(" extras: "); pw.println(bundle.toString());
Dianne Hackborn12527f92009-11-11 17:39:50 -0800115 }
Dianne Hackborn043fcd92010-10-06 14:27:34 -0700116 pw.print(prefix); pw.print("caller="); pw.print(callerPackage); pw.print(" ");
117 pw.print(callerApp != null ? callerApp.toShortString() : "null");
Dianne Hackborn39792d22010-08-19 18:01:52 -0700118 pw.print(" pid="); pw.print(callingPid);
119 pw.print(" uid="); pw.println(callingUid);
Fyodor Kupolovd4fd8c72015-07-13 19:19:25 -0700120 if ((requiredPermissions != null && requiredPermissions.length > 0)
121 || appOp != AppOpsManager.OP_NONE) {
122 pw.print(prefix); pw.print("requiredPermissions=");
123 pw.print(Arrays.toString(requiredPermissions));
124 pw.print(" appOp="); pw.println(appOp);
Dianne Hackborn12527f92009-11-11 17:39:50 -0800125 }
Dianne Hackborna750a632015-06-16 17:18:23 -0700126 if (options != null) {
127 pw.print(prefix); pw.print("options="); pw.println(options.toBundle());
128 }
Jeff Brown9fb3fd12014-09-29 15:32:12 -0700129 pw.print(prefix); pw.print("enqueueClockTime=");
Dianne Hackborn865907d2015-10-21 17:12:53 -0700130 pw.print(sdf.format(new Date(enqueueClockTime)));
Jeff Brown9fb3fd12014-09-29 15:32:12 -0700131 pw.print(" dispatchClockTime=");
Dianne Hackborn865907d2015-10-21 17:12:53 -0700132 pw.println(sdf.format(new Date(dispatchClockTime)));
Dianne Hackborn39792d22010-08-19 18:01:52 -0700133 pw.print(prefix); pw.print("dispatchTime=");
134 TimeUtils.formatDuration(dispatchTime, now, pw);
Dianne Hackborn865907d2015-10-21 17:12:53 -0700135 pw.print(" (");
136 TimeUtils.formatDuration(dispatchClockTime-enqueueClockTime, pw);
137 pw.print(" since enq)");
Dianne Hackborn12527f92009-11-11 17:39:50 -0800138 if (finishTime != 0) {
Dianne Hackborn39792d22010-08-19 18:01:52 -0700139 pw.print(" finishTime="); TimeUtils.formatDuration(finishTime, now, pw);
Dianne Hackborn865907d2015-10-21 17:12:53 -0700140 pw.print(" (");
141 TimeUtils.formatDuration(finishTime-dispatchTime, pw);
142 pw.print(" since disp)");
Dianne Hackborn12527f92009-11-11 17:39:50 -0800143 } else {
Dianne Hackborn39792d22010-08-19 18:01:52 -0700144 pw.print(" receiverTime="); TimeUtils.formatDuration(receiverTime, now, pw);
Dianne Hackborn12527f92009-11-11 17:39:50 -0800145 }
Dianne Hackborn39792d22010-08-19 18:01:52 -0700146 pw.println("");
Dianne Hackborn12527f92009-11-11 17:39:50 -0800147 if (anrCount != 0) {
Dianne Hackborn39792d22010-08-19 18:01:52 -0700148 pw.print(prefix); pw.print("anrCount="); pw.println(anrCount);
Dianne Hackborn12527f92009-11-11 17:39:50 -0800149 }
150 if (resultTo != null || resultCode != -1 || resultData != null) {
Dianne Hackborn39792d22010-08-19 18:01:52 -0700151 pw.print(prefix); pw.print("resultTo="); pw.print(resultTo);
152 pw.print(" resultCode="); pw.print(resultCode);
153 pw.print(" resultData="); pw.println(resultData);
Dianne Hackborn12527f92009-11-11 17:39:50 -0800154 }
155 if (resultExtras != null) {
Dianne Hackborn39792d22010-08-19 18:01:52 -0700156 pw.print(prefix); pw.print("resultExtras="); pw.println(resultExtras);
Dianne Hackborn12527f92009-11-11 17:39:50 -0800157 }
158 if (resultAbort || ordered || sticky || initialSticky) {
Dianne Hackborn39792d22010-08-19 18:01:52 -0700159 pw.print(prefix); pw.print("resultAbort="); pw.print(resultAbort);
160 pw.print(" ordered="); pw.print(ordered);
161 pw.print(" sticky="); pw.print(sticky);
162 pw.print(" initialSticky="); pw.println(initialSticky);
Dianne Hackborn12527f92009-11-11 17:39:50 -0800163 }
164 if (nextReceiver != 0 || receiver != null) {
Dianne Hackborn39792d22010-08-19 18:01:52 -0700165 pw.print(prefix); pw.print("nextReceiver="); pw.print(nextReceiver);
166 pw.print(" receiver="); pw.println(receiver);
Dianne Hackborn12527f92009-11-11 17:39:50 -0800167 }
168 if (curFilter != null) {
Dianne Hackborn39792d22010-08-19 18:01:52 -0700169 pw.print(prefix); pw.print("curFilter="); pw.println(curFilter);
Dianne Hackborn12527f92009-11-11 17:39:50 -0800170 }
171 if (curReceiver != null) {
Dianne Hackborn39792d22010-08-19 18:01:52 -0700172 pw.print(prefix); pw.print("curReceiver="); pw.println(curReceiver);
Dianne Hackborn12527f92009-11-11 17:39:50 -0800173 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800174 if (curApp != null) {
Dianne Hackborn39792d22010-08-19 18:01:52 -0700175 pw.print(prefix); pw.print("curApp="); pw.println(curApp);
176 pw.print(prefix); pw.print("curComponent=");
177 pw.println((curComponent != null ? curComponent.toShortString() : "--"));
Dianne Hackborn399cccb2010-04-13 22:57:49 -0700178 if (curReceiver != null && curReceiver.applicationInfo != null) {
Dianne Hackborn39792d22010-08-19 18:01:52 -0700179 pw.print(prefix); pw.print("curSourceDir=");
180 pw.println(curReceiver.applicationInfo.sourceDir);
Dianne Hackborn399cccb2010-04-13 22:57:49 -0700181 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800182 }
Dianne Hackborn786b4402012-08-27 15:14:02 -0700183 if (state != IDLE) {
184 String stateStr = " (?)";
185 switch (state) {
186 case APP_RECEIVE: stateStr=" (APP_RECEIVE)"; break;
187 case CALL_IN_RECEIVE: stateStr=" (CALL_IN_RECEIVE)"; break;
188 case CALL_DONE_RECEIVE: stateStr=" (CALL_DONE_RECEIVE)"; break;
Dianne Hackborn6285a322013-09-18 12:09:47 -0700189 case WAITING_SERVICES: stateStr=" (WAITING_SERVICES)"; break;
Dianne Hackborn786b4402012-08-27 15:14:02 -0700190 }
191 pw.print(prefix); pw.print("state="); pw.print(state); pw.println(stateStr);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800192 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800193 final int N = receivers != null ? receivers.size() : 0;
194 String p2 = prefix + " ";
195 PrintWriterPrinter printer = new PrintWriterPrinter(pw);
Wale Ogunwaleca1c1252015-05-15 12:49:13 -0700196 for (int i = 0; i < N; i++) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800197 Object o = receivers.get(i);
Dianne Hackborne0e413e2015-12-09 17:22:26 -0800198 pw.print(prefix);
199 switch (delivery[i]) {
200 case DELIVERY_PENDING: pw.print("Pending"); break;
201 case DELIVERY_DELIVERED: pw.print("Deliver"); break;
202 case DELIVERY_SKIPPED: pw.print("Skipped"); break;
203 case DELIVERY_TIMEOUT: pw.print("Timeout"); break;
204 default: pw.print("???????"); break;
205 }
206 pw.print(" #"); pw.print(i); pw.print(": ");
207 if (o instanceof BroadcastFilter) {
208 pw.println(o);
209 ((BroadcastFilter) o).dumpBrief(pw, p2);
210 } else if (o instanceof ResolveInfo) {
211 pw.println("(manifest)");
212 ((ResolveInfo) o).dump(printer, p2, 0);
213 } else {
214 pw.println(o);
215 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800216 }
217 }
218
Dianne Hackborn40c8db52012-02-10 18:59:48 -0800219 BroadcastRecord(BroadcastQueue _queue,
Christopher Tatef46723b2012-01-26 14:19:24 -0800220 Intent _intent, ProcessRecord _callerApp, String _callerPackage,
Chad Brubaker816c83b2017-03-02 10:27:59 -0800221 int _callingPid, int _callingUid, boolean _callerInstantApp, String _resolvedType,
222 String[] _requiredPermissions, int _appOp, BroadcastOptions _options, List _receivers,
223 IIntentReceiver _resultTo, int _resultCode, String _resultData, Bundle _resultExtras,
224 boolean _serialized, boolean _sticky, boolean _initialSticky, int _userId) {
Dianne Hackborn448489a2016-09-29 10:55:10 -0700225 if (_intent == null) {
226 throw new NullPointerException("Can't construct with a null intent");
227 }
Christopher Tatef46723b2012-01-26 14:19:24 -0800228 queue = _queue;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800229 intent = _intent;
Dianne Hackborna40cfeb2013-03-25 17:49:36 -0700230 targetComp = _intent.getComponent();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800231 callerApp = _callerApp;
232 callerPackage = _callerPackage;
233 callingPid = _callingPid;
234 callingUid = _callingUid;
Chad Brubaker816c83b2017-03-02 10:27:59 -0800235 callerInstantApp = _callerInstantApp;
Ben Gruver49660c72013-08-06 19:54:08 -0700236 resolvedType = _resolvedType;
Fyodor Kupolovd4fd8c72015-07-13 19:19:25 -0700237 requiredPermissions = _requiredPermissions;
Dianne Hackbornf51f6122013-02-04 18:23:34 -0800238 appOp = _appOp;
Dianne Hackborna750a632015-06-16 17:18:23 -0700239 options = _options;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800240 receivers = _receivers;
Dianne Hackborne0e413e2015-12-09 17:22:26 -0800241 delivery = new int[_receivers != null ? _receivers.size() : 0];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800242 resultTo = _resultTo;
243 resultCode = _resultCode;
244 resultData = _resultData;
245 resultExtras = _resultExtras;
246 ordered = _serialized;
Dianne Hackborn68d881c2009-10-05 13:58:17 -0700247 sticky = _sticky;
Dianne Hackborn12527f92009-11-11 17:39:50 -0800248 initialSticky = _initialSticky;
Dianne Hackborn786b4402012-08-27 15:14:02 -0700249 userId = _userId;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800250 nextReceiver = 0;
251 state = IDLE;
252 }
253
Makoto Onuki97f82f22017-05-31 16:20:21 -0700254 /**
255 * Copy constructor which takes a different intent.
256 * Only used by {@link #maybeStripForHistory}.
257 */
258 private BroadcastRecord(BroadcastRecord from, Intent newIntent) {
259 intent = newIntent;
260 targetComp = newIntent.getComponent();
261
262 callerApp = from.callerApp;
263 callerPackage = from.callerPackage;
264 callingPid = from.callingPid;
265 callingUid = from.callingUid;
266 callerInstantApp = from.callerInstantApp;
267 ordered = from.ordered;
268 sticky = from.sticky;
269 initialSticky = from.initialSticky;
270 userId = from.userId;
271 resolvedType = from.resolvedType;
272 requiredPermissions = from.requiredPermissions;
273 appOp = from.appOp;
274 options = from.options;
275 receivers = from.receivers;
276 delivery = from.delivery;
277 resultTo = from.resultTo;
278 enqueueClockTime = from.enqueueClockTime;
279 dispatchTime = from.dispatchTime;
280 dispatchClockTime = from.dispatchClockTime;
281 receiverTime = from.receiverTime;
282 finishTime = from.finishTime;
283 resultCode = from.resultCode;
284 resultData = from.resultData;
285 resultExtras = from.resultExtras;
286 resultAbort = from.resultAbort;
287 nextReceiver = from.nextReceiver;
288 receiver = from.receiver;
289 state = from.state;
290 anrCount = from.anrCount;
291 manifestCount = from.manifestCount;
292 manifestSkipCount = from.manifestSkipCount;
293 queue = from.queue;
294 }
295
296 public BroadcastRecord maybeStripForHistory() {
297 if (!intent.canStripForHistory()) {
298 return this;
299 }
300 return new BroadcastRecord(this, intent.maybeStripForHistory());
301 }
302
Wale Ogunwaleca1c1252015-05-15 12:49:13 -0700303 boolean cleanupDisabledPackageReceiversLocked(
304 String packageName, Set<String> filterByClasses, int userId, boolean doit) {
305 if ((userId != UserHandle.USER_ALL && this.userId != userId) || receivers == null) {
306 return false;
307 }
308
309 boolean didSomething = false;
310 Object o;
311 for (int i = receivers.size() - 1; i >= 0; i--) {
312 o = receivers.get(i);
313 if (!(o instanceof ResolveInfo)) {
314 continue;
315 }
316 ActivityInfo info = ((ResolveInfo)o).activityInfo;
317
318 final boolean sameComponent = packageName == null
319 || (info.applicationInfo.packageName.equals(packageName)
320 && (filterByClasses == null || filterByClasses.contains(info.name)));
321 if (sameComponent) {
322 if (!doit) {
323 return true;
324 }
325 didSomething = true;
326 receivers.remove(i);
Wale Ogunwale9a6e13c2015-08-03 15:21:44 -0700327 if (i < nextReceiver) {
328 nextReceiver--;
329 }
Wale Ogunwaleca1c1252015-05-15 12:49:13 -0700330 }
331 }
Wale Ogunwale9a6e13c2015-08-03 15:21:44 -0700332 nextReceiver = Math.min(nextReceiver, receivers.size());
Wale Ogunwaleca1c1252015-05-15 12:49:13 -0700333
334 return didSomething;
335 }
336
Yi Jin129fc6c2017-09-28 15:48:38 -0700337 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800338 public String toString() {
339 return "BroadcastRecord{"
340 + Integer.toHexString(System.identityHashCode(this))
Dianne Hackbornb12e1352012-09-26 11:39:20 -0700341 + " u" + userId + " " + intent.getAction() + "}";
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800342 }
Yi Jin129fc6c2017-09-28 15:48:38 -0700343
344 public void writeToProto(ProtoOutputStream proto, long fieldId) {
345 long token = proto.start(fieldId);
346 proto.write(BroadcastRecordProto.USER_ID, userId);
347 proto.write(BroadcastRecordProto.INTENT_ACTION, intent.getAction());
348 proto.end(token);
349 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800350}