• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 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 android.content.pm.IPackageManager;
20 import android.content.pm.PermissionInfo;
21 import android.os.Trace;
22 import java.io.FileDescriptor;
23 import java.io.PrintWriter;
24 import java.text.SimpleDateFormat;
25 import java.util.ArrayList;
26 import java.util.Date;
27 import java.util.Set;
28 
29 import android.app.ActivityManager;
30 import android.app.AppGlobals;
31 import android.app.AppOpsManager;
32 import android.app.BroadcastOptions;
33 import android.app.PendingIntent;
34 import android.content.ComponentName;
35 import android.content.IIntentReceiver;
36 import android.content.IIntentSender;
37 import android.content.Intent;
38 import android.content.IntentSender;
39 import android.content.pm.ActivityInfo;
40 import android.content.pm.PackageManager;
41 import android.content.pm.ResolveInfo;
42 import android.os.Bundle;
43 import android.os.Handler;
44 import android.os.IBinder;
45 import android.os.Looper;
46 import android.os.Message;
47 import android.os.Process;
48 import android.os.RemoteException;
49 import android.os.SystemClock;
50 import android.os.UserHandle;
51 import android.util.EventLog;
52 import android.util.Slog;
53 import android.util.TimeUtils;
54 import android.util.proto.ProtoOutputStream;
55 
56 import static com.android.server.am.ActivityManagerDebugConfig.*;
57 
58 /**
59  * BROADCASTS
60  *
61  * We keep two broadcast queues and associated bookkeeping, one for those at
62  * foreground priority, and one for normal (background-priority) broadcasts.
63  */
64 public final class BroadcastQueue {
65     private static final String TAG = "BroadcastQueue";
66     private static final String TAG_MU = TAG + POSTFIX_MU;
67     private static final String TAG_BROADCAST = TAG + POSTFIX_BROADCAST;
68 
69     static final int MAX_BROADCAST_HISTORY = ActivityManager.isLowRamDeviceStatic() ? 10 : 50;
70     static final int MAX_BROADCAST_SUMMARY_HISTORY
71             = ActivityManager.isLowRamDeviceStatic() ? 25 : 300;
72 
73     final ActivityManagerService mService;
74 
75     /**
76      * Recognizable moniker for this queue
77      */
78     final String mQueueName;
79 
80     /**
81      * Timeout period for this queue's broadcasts
82      */
83     final long mTimeoutPeriod;
84 
85     /**
86      * If true, we can delay broadcasts while waiting services to finish in the previous
87      * receiver's process.
88      */
89     final boolean mDelayBehindServices;
90 
91     /**
92      * Lists of all active broadcasts that are to be executed immediately
93      * (without waiting for another broadcast to finish).  Currently this only
94      * contains broadcasts to registered receivers, to avoid spinning up
95      * a bunch of processes to execute IntentReceiver components.  Background-
96      * and foreground-priority broadcasts are queued separately.
97      */
98     final ArrayList<BroadcastRecord> mParallelBroadcasts = new ArrayList<>();
99 
100     /**
101      * List of all active broadcasts that are to be executed one at a time.
102      * The object at the top of the list is the currently activity broadcasts;
103      * those after it are waiting for the top to finish.  As with parallel
104      * broadcasts, separate background- and foreground-priority queues are
105      * maintained.
106      */
107     final ArrayList<BroadcastRecord> mOrderedBroadcasts = new ArrayList<>();
108 
109     /**
110      * Historical data of past broadcasts, for debugging.  This is a ring buffer
111      * whose last element is at mHistoryNext.
112      */
113     final BroadcastRecord[] mBroadcastHistory = new BroadcastRecord[MAX_BROADCAST_HISTORY];
114     int mHistoryNext = 0;
115 
116     /**
117      * Summary of historical data of past broadcasts, for debugging.  This is a
118      * ring buffer whose last element is at mSummaryHistoryNext.
119      */
120     final Intent[] mBroadcastSummaryHistory = new Intent[MAX_BROADCAST_SUMMARY_HISTORY];
121     int mSummaryHistoryNext = 0;
122 
123     /**
124      * Various milestone timestamps of entries in the mBroadcastSummaryHistory ring
125      * buffer, also tracked via the mSummaryHistoryNext index.  These are all in wall
126      * clock time, not elapsed.
127      */
128     final long[] mSummaryHistoryEnqueueTime = new  long[MAX_BROADCAST_SUMMARY_HISTORY];
129     final long[] mSummaryHistoryDispatchTime = new  long[MAX_BROADCAST_SUMMARY_HISTORY];
130     final long[] mSummaryHistoryFinishTime = new  long[MAX_BROADCAST_SUMMARY_HISTORY];
131 
132     /**
133      * Set when we current have a BROADCAST_INTENT_MSG in flight.
134      */
135     boolean mBroadcastsScheduled = false;
136 
137     /**
138      * True if we have a pending unexpired BROADCAST_TIMEOUT_MSG posted to our handler.
139      */
140     boolean mPendingBroadcastTimeoutMessage;
141 
142     /**
143      * Intent broadcasts that we have tried to start, but are
144      * waiting for the application's process to be created.  We only
145      * need one per scheduling class (instead of a list) because we always
146      * process broadcasts one at a time, so no others can be started while
147      * waiting for this one.
148      */
149     BroadcastRecord mPendingBroadcast = null;
150 
151     /**
152      * The receiver index that is pending, to restart the broadcast if needed.
153      */
154     int mPendingBroadcastRecvIndex;
155 
156     static final int BROADCAST_INTENT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG;
157     static final int BROADCAST_TIMEOUT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG + 1;
158 
159     final BroadcastHandler mHandler;
160 
161     private final class BroadcastHandler extends Handler {
BroadcastHandler(Looper looper)162         public BroadcastHandler(Looper looper) {
163             super(looper, null, true);
164         }
165 
166         @Override
handleMessage(Message msg)167         public void handleMessage(Message msg) {
168             switch (msg.what) {
169                 case BROADCAST_INTENT_MSG: {
170                     if (DEBUG_BROADCAST) Slog.v(
171                             TAG_BROADCAST, "Received BROADCAST_INTENT_MSG");
172                     processNextBroadcast(true);
173                 } break;
174                 case BROADCAST_TIMEOUT_MSG: {
175                     synchronized (mService) {
176                         broadcastTimeoutLocked(true);
177                     }
178                 } break;
179             }
180         }
181     }
182 
183     private final class AppNotResponding implements Runnable {
184         private final ProcessRecord mApp;
185         private final String mAnnotation;
186 
AppNotResponding(ProcessRecord app, String annotation)187         public AppNotResponding(ProcessRecord app, String annotation) {
188             mApp = app;
189             mAnnotation = annotation;
190         }
191 
192         @Override
run()193         public void run() {
194             mService.mAppErrors.appNotResponding(mApp, null, null, false, mAnnotation);
195         }
196     }
197 
BroadcastQueue(ActivityManagerService service, Handler handler, String name, long timeoutPeriod, boolean allowDelayBehindServices)198     BroadcastQueue(ActivityManagerService service, Handler handler,
199             String name, long timeoutPeriod, boolean allowDelayBehindServices) {
200         mService = service;
201         mHandler = new BroadcastHandler(handler.getLooper());
202         mQueueName = name;
203         mTimeoutPeriod = timeoutPeriod;
204         mDelayBehindServices = allowDelayBehindServices;
205     }
206 
207     @Override
toString()208     public String toString() {
209         return mQueueName;
210     }
211 
isPendingBroadcastProcessLocked(int pid)212     public boolean isPendingBroadcastProcessLocked(int pid) {
213         return mPendingBroadcast != null && mPendingBroadcast.curApp.pid == pid;
214     }
215 
enqueueParallelBroadcastLocked(BroadcastRecord r)216     public void enqueueParallelBroadcastLocked(BroadcastRecord r) {
217         mParallelBroadcasts.add(r);
218         enqueueBroadcastHelper(r);
219     }
220 
enqueueOrderedBroadcastLocked(BroadcastRecord r)221     public void enqueueOrderedBroadcastLocked(BroadcastRecord r) {
222         mOrderedBroadcasts.add(r);
223         enqueueBroadcastHelper(r);
224     }
225 
226     /**
227      * Don't call this method directly; call enqueueParallelBroadcastLocked or
228      * enqueueOrderedBroadcastLocked.
229      */
enqueueBroadcastHelper(BroadcastRecord r)230     private void enqueueBroadcastHelper(BroadcastRecord r) {
231         r.enqueueClockTime = System.currentTimeMillis();
232 
233         if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
234             Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
235                 createBroadcastTraceTitle(r, BroadcastRecord.DELIVERY_PENDING),
236                 System.identityHashCode(r));
237         }
238     }
239 
240     /**
241      * Find the same intent from queued parallel broadcast, replace with a new one and return
242      * the old one.
243      */
replaceParallelBroadcastLocked(BroadcastRecord r)244     public final BroadcastRecord replaceParallelBroadcastLocked(BroadcastRecord r) {
245         return replaceBroadcastLocked(mParallelBroadcasts, r, "PARALLEL");
246     }
247 
248     /**
249      * Find the same intent from queued ordered broadcast, replace with a new one and return
250      * the old one.
251      */
replaceOrderedBroadcastLocked(BroadcastRecord r)252     public final BroadcastRecord replaceOrderedBroadcastLocked(BroadcastRecord r) {
253         return replaceBroadcastLocked(mOrderedBroadcasts, r, "ORDERED");
254     }
255 
replaceBroadcastLocked(ArrayList<BroadcastRecord> queue, BroadcastRecord r, String typeForLogging)256     private BroadcastRecord replaceBroadcastLocked(ArrayList<BroadcastRecord> queue,
257             BroadcastRecord r, String typeForLogging) {
258         final Intent intent = r.intent;
259         for (int i = queue.size() - 1; i > 0; i--) {
260             final BroadcastRecord old = queue.get(i);
261             if (old.userId == r.userId && intent.filterEquals(old.intent)) {
262                 if (DEBUG_BROADCAST) {
263                     Slog.v(TAG_BROADCAST, "***** DROPPING "
264                             + typeForLogging + " [" + mQueueName + "]: " + intent);
265                 }
266                 queue.set(i, r);
267                 return old;
268             }
269         }
270         return null;
271     }
272 
processCurBroadcastLocked(BroadcastRecord r, ProcessRecord app, boolean skipOomAdj)273     private final void processCurBroadcastLocked(BroadcastRecord r,
274             ProcessRecord app, boolean skipOomAdj) throws RemoteException {
275         if (DEBUG_BROADCAST)  Slog.v(TAG_BROADCAST,
276                 "Process cur broadcast " + r + " for app " + app);
277         if (app.thread == null) {
278             throw new RemoteException();
279         }
280         if (app.inFullBackup) {
281             skipReceiverLocked(r);
282             return;
283         }
284 
285         r.receiver = app.thread.asBinder();
286         r.curApp = app;
287         app.curReceivers.add(r);
288         app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_RECEIVER);
289         mService.updateLruProcessLocked(app, false, null);
290         if (!skipOomAdj) {
291             mService.updateOomAdjLocked();
292         }
293 
294         // Tell the application to launch this receiver.
295         r.intent.setComponent(r.curComponent);
296 
297         boolean started = false;
298         try {
299             if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST,
300                     "Delivering to component " + r.curComponent
301                     + ": " + r);
302             mService.notifyPackageUse(r.intent.getComponent().getPackageName(),
303                                       PackageManager.NOTIFY_PACKAGE_USE_BROADCAST_RECEIVER);
304             app.thread.scheduleReceiver(new Intent(r.intent), r.curReceiver,
305                     mService.compatibilityInfoForPackageLocked(r.curReceiver.applicationInfo),
306                     r.resultCode, r.resultData, r.resultExtras, r.ordered, r.userId,
307                     app.repProcState);
308             if (DEBUG_BROADCAST)  Slog.v(TAG_BROADCAST,
309                     "Process cur broadcast " + r + " DELIVERED for app " + app);
310             started = true;
311         } finally {
312             if (!started) {
313                 if (DEBUG_BROADCAST)  Slog.v(TAG_BROADCAST,
314                         "Process cur broadcast " + r + ": NOT STARTED!");
315                 r.receiver = null;
316                 r.curApp = null;
317                 app.curReceivers.remove(r);
318             }
319         }
320     }
321 
sendPendingBroadcastsLocked(ProcessRecord app)322     public boolean sendPendingBroadcastsLocked(ProcessRecord app) {
323         boolean didSomething = false;
324         final BroadcastRecord br = mPendingBroadcast;
325         if (br != null && br.curApp.pid > 0 && br.curApp.pid == app.pid) {
326             if (br.curApp != app) {
327                 Slog.e(TAG, "App mismatch when sending pending broadcast to "
328                         + app.processName + ", intended target is " + br.curApp.processName);
329                 return false;
330             }
331             try {
332                 mPendingBroadcast = null;
333                 processCurBroadcastLocked(br, app, false);
334                 didSomething = true;
335             } catch (Exception e) {
336                 Slog.w(TAG, "Exception in new application when starting receiver "
337                         + br.curComponent.flattenToShortString(), e);
338                 logBroadcastReceiverDiscardLocked(br);
339                 finishReceiverLocked(br, br.resultCode, br.resultData,
340                         br.resultExtras, br.resultAbort, false);
341                 scheduleBroadcastsLocked();
342                 // We need to reset the state if we failed to start the receiver.
343                 br.state = BroadcastRecord.IDLE;
344                 throw new RuntimeException(e.getMessage());
345             }
346         }
347         return didSomething;
348     }
349 
skipPendingBroadcastLocked(int pid)350     public void skipPendingBroadcastLocked(int pid) {
351         final BroadcastRecord br = mPendingBroadcast;
352         if (br != null && br.curApp.pid == pid) {
353             br.state = BroadcastRecord.IDLE;
354             br.nextReceiver = mPendingBroadcastRecvIndex;
355             mPendingBroadcast = null;
356             scheduleBroadcastsLocked();
357         }
358     }
359 
skipCurrentReceiverLocked(ProcessRecord app)360     public void skipCurrentReceiverLocked(ProcessRecord app) {
361         BroadcastRecord r = null;
362         if (mOrderedBroadcasts.size() > 0) {
363             BroadcastRecord br = mOrderedBroadcasts.get(0);
364             if (br.curApp == app) {
365                 r = br;
366             }
367         }
368         if (r == null && mPendingBroadcast != null && mPendingBroadcast.curApp == app) {
369             if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
370                     "[" + mQueueName + "] skip & discard pending app " + r);
371             r = mPendingBroadcast;
372         }
373 
374         if (r != null) {
375             skipReceiverLocked(r);
376         }
377     }
378 
skipReceiverLocked(BroadcastRecord r)379     private void skipReceiverLocked(BroadcastRecord r) {
380         logBroadcastReceiverDiscardLocked(r);
381         finishReceiverLocked(r, r.resultCode, r.resultData,
382                 r.resultExtras, r.resultAbort, false);
383         scheduleBroadcastsLocked();
384     }
385 
scheduleBroadcastsLocked()386     public void scheduleBroadcastsLocked() {
387         if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Schedule broadcasts ["
388                 + mQueueName + "]: current="
389                 + mBroadcastsScheduled);
390 
391         if (mBroadcastsScheduled) {
392             return;
393         }
394         mHandler.sendMessage(mHandler.obtainMessage(BROADCAST_INTENT_MSG, this));
395         mBroadcastsScheduled = true;
396     }
397 
getMatchingOrderedReceiver(IBinder receiver)398     public BroadcastRecord getMatchingOrderedReceiver(IBinder receiver) {
399         if (mOrderedBroadcasts.size() > 0) {
400             final BroadcastRecord r = mOrderedBroadcasts.get(0);
401             if (r != null && r.receiver == receiver) {
402                 return r;
403             }
404         }
405         return null;
406     }
407 
finishReceiverLocked(BroadcastRecord r, int resultCode, String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices)408     public boolean finishReceiverLocked(BroadcastRecord r, int resultCode,
409             String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices) {
410         final int state = r.state;
411         final ActivityInfo receiver = r.curReceiver;
412         r.state = BroadcastRecord.IDLE;
413         if (state == BroadcastRecord.IDLE) {
414             Slog.w(TAG, "finishReceiver [" + mQueueName + "] called but state is IDLE");
415         }
416         r.receiver = null;
417         r.intent.setComponent(null);
418         if (r.curApp != null && r.curApp.curReceivers.contains(r)) {
419             r.curApp.curReceivers.remove(r);
420         }
421         if (r.curFilter != null) {
422             r.curFilter.receiverList.curBroadcast = null;
423         }
424         r.curFilter = null;
425         r.curReceiver = null;
426         r.curApp = null;
427         mPendingBroadcast = null;
428 
429         r.resultCode = resultCode;
430         r.resultData = resultData;
431         r.resultExtras = resultExtras;
432         if (resultAbort && (r.intent.getFlags()&Intent.FLAG_RECEIVER_NO_ABORT) == 0) {
433             r.resultAbort = resultAbort;
434         } else {
435             r.resultAbort = false;
436         }
437 
438         if (waitForServices && r.curComponent != null && r.queue.mDelayBehindServices
439                 && r.queue.mOrderedBroadcasts.size() > 0
440                 && r.queue.mOrderedBroadcasts.get(0) == r) {
441             ActivityInfo nextReceiver;
442             if (r.nextReceiver < r.receivers.size()) {
443                 Object obj = r.receivers.get(r.nextReceiver);
444                 nextReceiver = (obj instanceof ActivityInfo) ? (ActivityInfo)obj : null;
445             } else {
446                 nextReceiver = null;
447             }
448             // Don't do this if the next receive is in the same process as the current one.
449             if (receiver == null || nextReceiver == null
450                     || receiver.applicationInfo.uid != nextReceiver.applicationInfo.uid
451                     || !receiver.processName.equals(nextReceiver.processName)) {
452                 // In this case, we are ready to process the next receiver for the current broadcast,
453                 // but are on a queue that would like to wait for services to finish before moving
454                 // on.  If there are background services currently starting, then we will go into a
455                 // special state where we hold off on continuing this broadcast until they are done.
456                 if (mService.mServices.hasBackgroundServicesLocked(r.userId)) {
457                     Slog.i(TAG, "Delay finish: " + r.curComponent.flattenToShortString());
458                     r.state = BroadcastRecord.WAITING_SERVICES;
459                     return false;
460                 }
461             }
462         }
463 
464         r.curComponent = null;
465 
466         // We will process the next receiver right now if this is finishing
467         // an app receiver (which is always asynchronous) or after we have
468         // come back from calling a receiver.
469         return state == BroadcastRecord.APP_RECEIVE
470                 || state == BroadcastRecord.CALL_DONE_RECEIVE;
471     }
472 
backgroundServicesFinishedLocked(int userId)473     public void backgroundServicesFinishedLocked(int userId) {
474         if (mOrderedBroadcasts.size() > 0) {
475             BroadcastRecord br = mOrderedBroadcasts.get(0);
476             if (br.userId == userId && br.state == BroadcastRecord.WAITING_SERVICES) {
477                 Slog.i(TAG, "Resuming delayed broadcast");
478                 br.curComponent = null;
479                 br.state = BroadcastRecord.IDLE;
480                 processNextBroadcast(false);
481             }
482         }
483     }
484 
performReceiveLocked(ProcessRecord app, IIntentReceiver receiver, Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky, int sendingUser)485     void performReceiveLocked(ProcessRecord app, IIntentReceiver receiver,
486             Intent intent, int resultCode, String data, Bundle extras,
487             boolean ordered, boolean sticky, int sendingUser) throws RemoteException {
488         // Send the intent to the receiver asynchronously using one-way binder calls.
489         if (app != null) {
490             if (app.thread != null) {
491                 // If we have an app thread, do the call through that so it is
492                 // correctly ordered with other one-way calls.
493                 try {
494                     app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode,
495                             data, extras, ordered, sticky, sendingUser, app.repProcState);
496                 // TODO: Uncomment this when (b/28322359) is fixed and we aren't getting
497                 // DeadObjectException when the process isn't actually dead.
498                 //} catch (DeadObjectException ex) {
499                 // Failed to call into the process.  It's dying so just let it die and move on.
500                 //    throw ex;
501                 } catch (RemoteException ex) {
502                     // Failed to call into the process. It's either dying or wedged. Kill it gently.
503                     synchronized (mService) {
504                         Slog.w(TAG, "Can't deliver broadcast to " + app.processName
505                                 + " (pid " + app.pid + "). Crashing it.");
506                         app.scheduleCrash("can't deliver broadcast");
507                     }
508                     throw ex;
509                 }
510             } else {
511                 // Application has died. Receiver doesn't exist.
512                 throw new RemoteException("app.thread must not be null");
513             }
514         } else {
515             receiver.performReceive(intent, resultCode, data, extras, ordered,
516                     sticky, sendingUser);
517         }
518     }
519 
deliverToRegisteredReceiverLocked(BroadcastRecord r, BroadcastFilter filter, boolean ordered, int index)520     private void deliverToRegisteredReceiverLocked(BroadcastRecord r,
521             BroadcastFilter filter, boolean ordered, int index) {
522         boolean skip = false;
523         if (filter.requiredPermission != null) {
524             int perm = mService.checkComponentPermission(filter.requiredPermission,
525                     r.callingPid, r.callingUid, -1, true);
526             if (perm != PackageManager.PERMISSION_GRANTED) {
527                 Slog.w(TAG, "Permission Denial: broadcasting "
528                         + r.intent.toString()
529                         + " from " + r.callerPackage + " (pid="
530                         + r.callingPid + ", uid=" + r.callingUid + ")"
531                         + " requires " + filter.requiredPermission
532                         + " due to registered receiver " + filter);
533                 skip = true;
534             } else {
535                 final int opCode = AppOpsManager.permissionToOpCode(filter.requiredPermission);
536                 if (opCode != AppOpsManager.OP_NONE
537                         && mService.mAppOpsService.noteOperation(opCode, r.callingUid,
538                                 r.callerPackage) != AppOpsManager.MODE_ALLOWED) {
539                     Slog.w(TAG, "Appop Denial: broadcasting "
540                             + r.intent.toString()
541                             + " from " + r.callerPackage + " (pid="
542                             + r.callingPid + ", uid=" + r.callingUid + ")"
543                             + " requires appop " + AppOpsManager.permissionToOp(
544                                     filter.requiredPermission)
545                             + " due to registered receiver " + filter);
546                     skip = true;
547                 }
548             }
549         }
550         if (!skip && r.requiredPermissions != null && r.requiredPermissions.length > 0) {
551             for (int i = 0; i < r.requiredPermissions.length; i++) {
552                 String requiredPermission = r.requiredPermissions[i];
553                 int perm = mService.checkComponentPermission(requiredPermission,
554                         filter.receiverList.pid, filter.receiverList.uid, -1, true);
555                 if (perm != PackageManager.PERMISSION_GRANTED) {
556                     Slog.w(TAG, "Permission Denial: receiving "
557                             + r.intent.toString()
558                             + " to " + filter.receiverList.app
559                             + " (pid=" + filter.receiverList.pid
560                             + ", uid=" + filter.receiverList.uid + ")"
561                             + " requires " + requiredPermission
562                             + " due to sender " + r.callerPackage
563                             + " (uid " + r.callingUid + ")");
564                     skip = true;
565                     break;
566                 }
567                 int appOp = AppOpsManager.permissionToOpCode(requiredPermission);
568                 if (appOp != AppOpsManager.OP_NONE && appOp != r.appOp
569                         && mService.mAppOpsService.noteOperation(appOp,
570                         filter.receiverList.uid, filter.packageName)
571                         != AppOpsManager.MODE_ALLOWED) {
572                     Slog.w(TAG, "Appop Denial: receiving "
573                             + r.intent.toString()
574                             + " to " + filter.receiverList.app
575                             + " (pid=" + filter.receiverList.pid
576                             + ", uid=" + filter.receiverList.uid + ")"
577                             + " requires appop " + AppOpsManager.permissionToOp(
578                             requiredPermission)
579                             + " due to sender " + r.callerPackage
580                             + " (uid " + r.callingUid + ")");
581                     skip = true;
582                     break;
583                 }
584             }
585         }
586         if (!skip && (r.requiredPermissions == null || r.requiredPermissions.length == 0)) {
587             int perm = mService.checkComponentPermission(null,
588                     filter.receiverList.pid, filter.receiverList.uid, -1, true);
589             if (perm != PackageManager.PERMISSION_GRANTED) {
590                 Slog.w(TAG, "Permission Denial: security check failed when receiving "
591                         + r.intent.toString()
592                         + " to " + filter.receiverList.app
593                         + " (pid=" + filter.receiverList.pid
594                         + ", uid=" + filter.receiverList.uid + ")"
595                         + " due to sender " + r.callerPackage
596                         + " (uid " + r.callingUid + ")");
597                 skip = true;
598             }
599         }
600         if (!skip && r.appOp != AppOpsManager.OP_NONE
601                 && mService.mAppOpsService.noteOperation(r.appOp,
602                 filter.receiverList.uid, filter.packageName)
603                 != AppOpsManager.MODE_ALLOWED) {
604             Slog.w(TAG, "Appop Denial: receiving "
605                     + r.intent.toString()
606                     + " to " + filter.receiverList.app
607                     + " (pid=" + filter.receiverList.pid
608                     + ", uid=" + filter.receiverList.uid + ")"
609                     + " requires appop " + AppOpsManager.opToName(r.appOp)
610                     + " due to sender " + r.callerPackage
611                     + " (uid " + r.callingUid + ")");
612             skip = true;
613         }
614 
615         if (!mService.mIntentFirewall.checkBroadcast(r.intent, r.callingUid,
616                 r.callingPid, r.resolvedType, filter.receiverList.uid)) {
617             skip = true;
618         }
619 
620         if (!skip && (filter.receiverList.app == null || filter.receiverList.app.killed
621                 || filter.receiverList.app.crashing)) {
622             Slog.w(TAG, "Skipping deliver [" + mQueueName + "] " + r
623                     + " to " + filter.receiverList + ": process gone or crashing");
624             skip = true;
625         }
626 
627         // Ensure that broadcasts are only sent to other Instant Apps if they are marked as
628         // visible to Instant Apps.
629         final boolean visibleToInstantApps =
630                 (r.intent.getFlags() & Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS) != 0;
631 
632         if (!skip && !visibleToInstantApps && filter.instantApp
633                 && filter.receiverList.uid != r.callingUid) {
634             Slog.w(TAG, "Instant App Denial: receiving "
635                     + r.intent.toString()
636                     + " to " + filter.receiverList.app
637                     + " (pid=" + filter.receiverList.pid
638                     + ", uid=" + filter.receiverList.uid + ")"
639                     + " due to sender " + r.callerPackage
640                     + " (uid " + r.callingUid + ")"
641                     + " not specifying FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS");
642             skip = true;
643         }
644 
645         if (!skip && !filter.visibleToInstantApp && r.callerInstantApp
646                 && filter.receiverList.uid != r.callingUid) {
647             Slog.w(TAG, "Instant App Denial: receiving "
648                     + r.intent.toString()
649                     + " to " + filter.receiverList.app
650                     + " (pid=" + filter.receiverList.pid
651                     + ", uid=" + filter.receiverList.uid + ")"
652                     + " requires receiver be visible to instant apps"
653                     + " due to sender " + r.callerPackage
654                     + " (uid " + r.callingUid + ")");
655             skip = true;
656         }
657 
658         if (skip) {
659             r.delivery[index] = BroadcastRecord.DELIVERY_SKIPPED;
660             return;
661         }
662 
663         // If permissions need a review before any of the app components can run, we drop
664         // the broadcast and if the calling app is in the foreground and the broadcast is
665         // explicit we launch the review UI passing it a pending intent to send the skipped
666         // broadcast.
667         if (mService.mPermissionReviewRequired) {
668             if (!requestStartTargetPermissionsReviewIfNeededLocked(r, filter.packageName,
669                     filter.owningUserId)) {
670                 r.delivery[index] = BroadcastRecord.DELIVERY_SKIPPED;
671                 return;
672             }
673         }
674 
675         r.delivery[index] = BroadcastRecord.DELIVERY_DELIVERED;
676 
677         // If this is not being sent as an ordered broadcast, then we
678         // don't want to touch the fields that keep track of the current
679         // state of ordered broadcasts.
680         if (ordered) {
681             r.receiver = filter.receiverList.receiver.asBinder();
682             r.curFilter = filter;
683             filter.receiverList.curBroadcast = r;
684             r.state = BroadcastRecord.CALL_IN_RECEIVE;
685             if (filter.receiverList.app != null) {
686                 // Bump hosting application to no longer be in background
687                 // scheduling class.  Note that we can't do that if there
688                 // isn't an app...  but we can only be in that case for
689                 // things that directly call the IActivityManager API, which
690                 // are already core system stuff so don't matter for this.
691                 r.curApp = filter.receiverList.app;
692                 filter.receiverList.app.curReceivers.add(r);
693                 mService.updateOomAdjLocked(r.curApp, true);
694             }
695         }
696         try {
697             if (DEBUG_BROADCAST_LIGHT) Slog.i(TAG_BROADCAST,
698                     "Delivering to " + filter + " : " + r);
699             if (filter.receiverList.app != null && filter.receiverList.app.inFullBackup) {
700                 // Skip delivery if full backup in progress
701                 // If it's an ordered broadcast, we need to continue to the next receiver.
702                 if (ordered) {
703                     skipReceiverLocked(r);
704                 }
705             } else {
706                 performReceiveLocked(filter.receiverList.app, filter.receiverList.receiver,
707                         new Intent(r.intent), r.resultCode, r.resultData,
708                         r.resultExtras, r.ordered, r.initialSticky, r.userId);
709             }
710             if (ordered) {
711                 r.state = BroadcastRecord.CALL_DONE_RECEIVE;
712             }
713         } catch (RemoteException e) {
714             Slog.w(TAG, "Failure sending broadcast " + r.intent, e);
715             if (ordered) {
716                 r.receiver = null;
717                 r.curFilter = null;
718                 filter.receiverList.curBroadcast = null;
719                 if (filter.receiverList.app != null) {
720                     filter.receiverList.app.curReceivers.remove(r);
721                 }
722             }
723         }
724     }
725 
requestStartTargetPermissionsReviewIfNeededLocked( BroadcastRecord receiverRecord, String receivingPackageName, final int receivingUserId)726     private boolean requestStartTargetPermissionsReviewIfNeededLocked(
727             BroadcastRecord receiverRecord, String receivingPackageName,
728             final int receivingUserId) {
729         if (!mService.getPackageManagerInternalLocked().isPermissionsReviewRequired(
730                 receivingPackageName, receivingUserId)) {
731             return true;
732         }
733 
734         final boolean callerForeground = receiverRecord.callerApp != null
735                 ? receiverRecord.callerApp.setSchedGroup != ProcessList.SCHED_GROUP_BACKGROUND
736                 : true;
737 
738         // Show a permission review UI only for explicit broadcast from a foreground app
739         if (callerForeground && receiverRecord.intent.getComponent() != null) {
740             IIntentSender target = mService.getIntentSenderLocked(
741                     ActivityManager.INTENT_SENDER_BROADCAST, receiverRecord.callerPackage,
742                     receiverRecord.callingUid, receiverRecord.userId, null, null, 0,
743                     new Intent[]{receiverRecord.intent},
744                     new String[]{receiverRecord.intent.resolveType(mService.mContext
745                             .getContentResolver())},
746                     PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT
747                             | PendingIntent.FLAG_IMMUTABLE, null);
748 
749             final Intent intent = new Intent(Intent.ACTION_REVIEW_PERMISSIONS);
750             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
751                     | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
752             intent.putExtra(Intent.EXTRA_PACKAGE_NAME, receivingPackageName);
753             intent.putExtra(Intent.EXTRA_INTENT, new IntentSender(target));
754 
755             if (DEBUG_PERMISSIONS_REVIEW) {
756                 Slog.i(TAG, "u" + receivingUserId + " Launching permission review for package "
757                         + receivingPackageName);
758             }
759 
760             mHandler.post(new Runnable() {
761                 @Override
762                 public void run() {
763                     mService.mContext.startActivityAsUser(intent, new UserHandle(receivingUserId));
764                 }
765             });
766         } else {
767             Slog.w(TAG, "u" + receivingUserId + " Receiving a broadcast in package"
768                     + receivingPackageName + " requires a permissions review");
769         }
770 
771         return false;
772     }
773 
scheduleTempWhitelistLocked(int uid, long duration, BroadcastRecord r)774     final void scheduleTempWhitelistLocked(int uid, long duration, BroadcastRecord r) {
775         if (duration > Integer.MAX_VALUE) {
776             duration = Integer.MAX_VALUE;
777         }
778         // XXX ideally we should pause the broadcast until everything behind this is done,
779         // or else we will likely start dispatching the broadcast before we have opened
780         // access to the app (there is a lot of asynchronicity behind this).  It is probably
781         // not that big a deal, however, because the main purpose here is to allow apps
782         // to hold wake locks, and they will be able to acquire their wake lock immediately
783         // it just won't be enabled until we get through this work.
784         StringBuilder b = new StringBuilder();
785         b.append("broadcast:");
786         UserHandle.formatUid(b, r.callingUid);
787         b.append(":");
788         if (r.intent.getAction() != null) {
789             b.append(r.intent.getAction());
790         } else if (r.intent.getComponent() != null) {
791             r.intent.getComponent().appendShortString(b);
792         } else if (r.intent.getData() != null) {
793             b.append(r.intent.getData());
794         }
795         mService.tempWhitelistUidLocked(uid, duration, b.toString());
796     }
797 
798     /**
799      * Return true if all given permissions are signature-only perms.
800      */
isSignaturePerm(String[] perms)801     final boolean isSignaturePerm(String[] perms) {
802         if (perms == null) {
803             return false;
804         }
805         IPackageManager pm = AppGlobals.getPackageManager();
806         for (int i = perms.length-1; i >= 0; i--) {
807             try {
808                 PermissionInfo pi = pm.getPermissionInfo(perms[i], "android", 0);
809                 if ((pi.protectionLevel & (PermissionInfo.PROTECTION_MASK_BASE
810                         | PermissionInfo.PROTECTION_FLAG_PRIVILEGED))
811                         != PermissionInfo.PROTECTION_SIGNATURE) {
812                     // If this a signature permission and NOT allowed for privileged apps, it
813                     // is okay...  otherwise, nope!
814                     return false;
815                 }
816             } catch (RemoteException e) {
817                 return false;
818             }
819         }
820         return true;
821     }
822 
processNextBroadcast(boolean fromMsg)823     final void processNextBroadcast(boolean fromMsg) {
824         synchronized (mService) {
825             processNextBroadcastLocked(fromMsg, false);
826         }
827     }
828 
processNextBroadcastLocked(boolean fromMsg, boolean skipOomAdj)829     final void processNextBroadcastLocked(boolean fromMsg, boolean skipOomAdj) {
830         BroadcastRecord r;
831 
832         if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "processNextBroadcast ["
833                 + mQueueName + "]: "
834                 + mParallelBroadcasts.size() + " parallel broadcasts, "
835                 + mOrderedBroadcasts.size() + " ordered broadcasts");
836 
837         mService.updateCpuStats();
838 
839         if (fromMsg) {
840             mBroadcastsScheduled = false;
841         }
842 
843         // First, deliver any non-serialized broadcasts right away.
844         while (mParallelBroadcasts.size() > 0) {
845             r = mParallelBroadcasts.remove(0);
846             r.dispatchTime = SystemClock.uptimeMillis();
847             r.dispatchClockTime = System.currentTimeMillis();
848 
849             if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
850                 Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER,
851                     createBroadcastTraceTitle(r, BroadcastRecord.DELIVERY_PENDING),
852                     System.identityHashCode(r));
853                 Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
854                     createBroadcastTraceTitle(r, BroadcastRecord.DELIVERY_DELIVERED),
855                     System.identityHashCode(r));
856             }
857 
858             final int N = r.receivers.size();
859             if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST, "Processing parallel broadcast ["
860                     + mQueueName + "] " + r);
861             for (int i=0; i<N; i++) {
862                 Object target = r.receivers.get(i);
863                 if (DEBUG_BROADCAST)  Slog.v(TAG_BROADCAST,
864                         "Delivering non-ordered on [" + mQueueName + "] to registered "
865                         + target + ": " + r);
866                 deliverToRegisteredReceiverLocked(r, (BroadcastFilter)target, false, i);
867             }
868             addBroadcastToHistoryLocked(r);
869             if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST, "Done with parallel broadcast ["
870                     + mQueueName + "] " + r);
871         }
872 
873         // Now take care of the next serialized one...
874 
875         // If we are waiting for a process to come up to handle the next
876         // broadcast, then do nothing at this point.  Just in case, we
877         // check that the process we're waiting for still exists.
878         if (mPendingBroadcast != null) {
879             if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST,
880                     "processNextBroadcast [" + mQueueName + "]: waiting for "
881                     + mPendingBroadcast.curApp);
882 
883             boolean isDead;
884             if (mPendingBroadcast.curApp.pid > 0) {
885                 synchronized (mService.mPidsSelfLocked) {
886                     ProcessRecord proc = mService.mPidsSelfLocked.get(
887                             mPendingBroadcast.curApp.pid);
888                     isDead = proc == null || proc.crashing;
889                 }
890             } else {
891                 final ProcessRecord proc = mService.mProcessNames.get(
892                         mPendingBroadcast.curApp.processName, mPendingBroadcast.curApp.uid);
893                 isDead = proc == null || !proc.pendingStart;
894             }
895             if (!isDead) {
896                 // It's still alive, so keep waiting
897                 return;
898             } else {
899                 Slog.w(TAG, "pending app  ["
900                         + mQueueName + "]" + mPendingBroadcast.curApp
901                         + " died before responding to broadcast");
902                 mPendingBroadcast.state = BroadcastRecord.IDLE;
903                 mPendingBroadcast.nextReceiver = mPendingBroadcastRecvIndex;
904                 mPendingBroadcast = null;
905             }
906         }
907 
908         boolean looped = false;
909 
910         do {
911             if (mOrderedBroadcasts.size() == 0) {
912                 // No more broadcasts pending, so all done!
913                 mService.scheduleAppGcsLocked();
914                 if (looped) {
915                     // If we had finished the last ordered broadcast, then
916                     // make sure all processes have correct oom and sched
917                     // adjustments.
918                     mService.updateOomAdjLocked();
919                 }
920                 return;
921             }
922             r = mOrderedBroadcasts.get(0);
923             boolean forceReceive = false;
924 
925             // Ensure that even if something goes awry with the timeout
926             // detection, we catch "hung" broadcasts here, discard them,
927             // and continue to make progress.
928             //
929             // This is only done if the system is ready so that PRE_BOOT_COMPLETED
930             // receivers don't get executed with timeouts. They're intended for
931             // one time heavy lifting after system upgrades and can take
932             // significant amounts of time.
933             int numReceivers = (r.receivers != null) ? r.receivers.size() : 0;
934             if (mService.mProcessesReady && r.dispatchTime > 0) {
935                 long now = SystemClock.uptimeMillis();
936                 if ((numReceivers > 0) &&
937                         (now > r.dispatchTime + (2*mTimeoutPeriod*numReceivers))) {
938                     Slog.w(TAG, "Hung broadcast ["
939                             + mQueueName + "] discarded after timeout failure:"
940                             + " now=" + now
941                             + " dispatchTime=" + r.dispatchTime
942                             + " startTime=" + r.receiverTime
943                             + " intent=" + r.intent
944                             + " numReceivers=" + numReceivers
945                             + " nextReceiver=" + r.nextReceiver
946                             + " state=" + r.state);
947                     broadcastTimeoutLocked(false); // forcibly finish this broadcast
948                     forceReceive = true;
949                     r.state = BroadcastRecord.IDLE;
950                 }
951             }
952 
953             if (r.state != BroadcastRecord.IDLE) {
954                 if (DEBUG_BROADCAST) Slog.d(TAG_BROADCAST,
955                         "processNextBroadcast("
956                         + mQueueName + ") called when not idle (state="
957                         + r.state + ")");
958                 return;
959             }
960 
961             if (r.receivers == null || r.nextReceiver >= numReceivers
962                     || r.resultAbort || forceReceive) {
963                 // No more receivers for this broadcast!  Send the final
964                 // result if requested...
965                 if (r.resultTo != null) {
966                     try {
967                         if (DEBUG_BROADCAST) Slog.i(TAG_BROADCAST,
968                                 "Finishing broadcast [" + mQueueName + "] "
969                                 + r.intent.getAction() + " app=" + r.callerApp);
970                         performReceiveLocked(r.callerApp, r.resultTo,
971                             new Intent(r.intent), r.resultCode,
972                             r.resultData, r.resultExtras, false, false, r.userId);
973                         // Set this to null so that the reference
974                         // (local and remote) isn't kept in the mBroadcastHistory.
975                         r.resultTo = null;
976                     } catch (RemoteException e) {
977                         r.resultTo = null;
978                         Slog.w(TAG, "Failure ["
979                                 + mQueueName + "] sending broadcast result of "
980                                 + r.intent, e);
981 
982                     }
983                 }
984 
985                 if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Cancelling BROADCAST_TIMEOUT_MSG");
986                 cancelBroadcastTimeoutLocked();
987 
988                 if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST,
989                         "Finished with ordered broadcast " + r);
990 
991                 // ... and on to the next...
992                 addBroadcastToHistoryLocked(r);
993                 if (r.intent.getComponent() == null && r.intent.getPackage() == null
994                         && (r.intent.getFlags()&Intent.FLAG_RECEIVER_REGISTERED_ONLY) == 0) {
995                     // This was an implicit broadcast... let's record it for posterity.
996                     mService.addBroadcastStatLocked(r.intent.getAction(), r.callerPackage,
997                             r.manifestCount, r.manifestSkipCount, r.finishTime-r.dispatchTime);
998                 }
999                 mOrderedBroadcasts.remove(0);
1000                 r = null;
1001                 looped = true;
1002                 continue;
1003             }
1004         } while (r == null);
1005 
1006         // Get the next receiver...
1007         int recIdx = r.nextReceiver++;
1008 
1009         // Keep track of when this receiver started, and make sure there
1010         // is a timeout message pending to kill it if need be.
1011         r.receiverTime = SystemClock.uptimeMillis();
1012         if (recIdx == 0) {
1013             r.dispatchTime = r.receiverTime;
1014             r.dispatchClockTime = System.currentTimeMillis();
1015             if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
1016                 Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER,
1017                     createBroadcastTraceTitle(r, BroadcastRecord.DELIVERY_PENDING),
1018                     System.identityHashCode(r));
1019                 Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
1020                     createBroadcastTraceTitle(r, BroadcastRecord.DELIVERY_DELIVERED),
1021                     System.identityHashCode(r));
1022             }
1023             if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST, "Processing ordered broadcast ["
1024                     + mQueueName + "] " + r);
1025         }
1026         if (! mPendingBroadcastTimeoutMessage) {
1027             long timeoutTime = r.receiverTime + mTimeoutPeriod;
1028             if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
1029                     "Submitting BROADCAST_TIMEOUT_MSG ["
1030                     + mQueueName + "] for " + r + " at " + timeoutTime);
1031             setBroadcastTimeoutLocked(timeoutTime);
1032         }
1033 
1034         final BroadcastOptions brOptions = r.options;
1035         final Object nextReceiver = r.receivers.get(recIdx);
1036 
1037         if (nextReceiver instanceof BroadcastFilter) {
1038             // Simple case: this is a registered receiver who gets
1039             // a direct call.
1040             BroadcastFilter filter = (BroadcastFilter)nextReceiver;
1041             if (DEBUG_BROADCAST)  Slog.v(TAG_BROADCAST,
1042                     "Delivering ordered ["
1043                     + mQueueName + "] to registered "
1044                     + filter + ": " + r);
1045             deliverToRegisteredReceiverLocked(r, filter, r.ordered, recIdx);
1046             if (r.receiver == null || !r.ordered) {
1047                 // The receiver has already finished, so schedule to
1048                 // process the next one.
1049                 if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Quick finishing ["
1050                         + mQueueName + "]: ordered="
1051                         + r.ordered + " receiver=" + r.receiver);
1052                 r.state = BroadcastRecord.IDLE;
1053                 scheduleBroadcastsLocked();
1054             } else {
1055                 if (brOptions != null && brOptions.getTemporaryAppWhitelistDuration() > 0) {
1056                     scheduleTempWhitelistLocked(filter.owningUid,
1057                             brOptions.getTemporaryAppWhitelistDuration(), r);
1058                 }
1059             }
1060             return;
1061         }
1062 
1063         // Hard case: need to instantiate the receiver, possibly
1064         // starting its application process to host it.
1065 
1066         ResolveInfo info =
1067             (ResolveInfo)nextReceiver;
1068         ComponentName component = new ComponentName(
1069                 info.activityInfo.applicationInfo.packageName,
1070                 info.activityInfo.name);
1071 
1072         boolean skip = false;
1073         if (brOptions != null &&
1074                 (info.activityInfo.applicationInfo.targetSdkVersion
1075                         < brOptions.getMinManifestReceiverApiLevel() ||
1076                 info.activityInfo.applicationInfo.targetSdkVersion
1077                         > brOptions.getMaxManifestReceiverApiLevel())) {
1078             skip = true;
1079         }
1080         int perm = mService.checkComponentPermission(info.activityInfo.permission,
1081                 r.callingPid, r.callingUid, info.activityInfo.applicationInfo.uid,
1082                 info.activityInfo.exported);
1083         if (!skip && perm != PackageManager.PERMISSION_GRANTED) {
1084             if (!info.activityInfo.exported) {
1085                 Slog.w(TAG, "Permission Denial: broadcasting "
1086                         + r.intent.toString()
1087                         + " from " + r.callerPackage + " (pid=" + r.callingPid
1088                         + ", uid=" + r.callingUid + ")"
1089                         + " is not exported from uid " + info.activityInfo.applicationInfo.uid
1090                         + " due to receiver " + component.flattenToShortString());
1091             } else {
1092                 Slog.w(TAG, "Permission Denial: broadcasting "
1093                         + r.intent.toString()
1094                         + " from " + r.callerPackage + " (pid=" + r.callingPid
1095                         + ", uid=" + r.callingUid + ")"
1096                         + " requires " + info.activityInfo.permission
1097                         + " due to receiver " + component.flattenToShortString());
1098             }
1099             skip = true;
1100         } else if (!skip && info.activityInfo.permission != null) {
1101             final int opCode = AppOpsManager.permissionToOpCode(info.activityInfo.permission);
1102             if (opCode != AppOpsManager.OP_NONE
1103                     && mService.mAppOpsService.noteOperation(opCode, r.callingUid,
1104                             r.callerPackage) != AppOpsManager.MODE_ALLOWED) {
1105                 Slog.w(TAG, "Appop Denial: broadcasting "
1106                         + r.intent.toString()
1107                         + " from " + r.callerPackage + " (pid="
1108                         + r.callingPid + ", uid=" + r.callingUid + ")"
1109                         + " requires appop " + AppOpsManager.permissionToOp(
1110                                 info.activityInfo.permission)
1111                         + " due to registered receiver "
1112                         + component.flattenToShortString());
1113                 skip = true;
1114             }
1115         }
1116         if (!skip && info.activityInfo.applicationInfo.uid != Process.SYSTEM_UID &&
1117             r.requiredPermissions != null && r.requiredPermissions.length > 0) {
1118             for (int i = 0; i < r.requiredPermissions.length; i++) {
1119                 String requiredPermission = r.requiredPermissions[i];
1120                 try {
1121                     perm = AppGlobals.getPackageManager().
1122                             checkPermission(requiredPermission,
1123                                     info.activityInfo.applicationInfo.packageName,
1124                                     UserHandle
1125                                             .getUserId(info.activityInfo.applicationInfo.uid));
1126                 } catch (RemoteException e) {
1127                     perm = PackageManager.PERMISSION_DENIED;
1128                 }
1129                 if (perm != PackageManager.PERMISSION_GRANTED) {
1130                     Slog.w(TAG, "Permission Denial: receiving "
1131                             + r.intent + " to "
1132                             + component.flattenToShortString()
1133                             + " requires " + requiredPermission
1134                             + " due to sender " + r.callerPackage
1135                             + " (uid " + r.callingUid + ")");
1136                     skip = true;
1137                     break;
1138                 }
1139                 int appOp = AppOpsManager.permissionToOpCode(requiredPermission);
1140                 if (appOp != AppOpsManager.OP_NONE && appOp != r.appOp
1141                         && mService.mAppOpsService.noteOperation(appOp,
1142                         info.activityInfo.applicationInfo.uid, info.activityInfo.packageName)
1143                         != AppOpsManager.MODE_ALLOWED) {
1144                     Slog.w(TAG, "Appop Denial: receiving "
1145                             + r.intent + " to "
1146                             + component.flattenToShortString()
1147                             + " requires appop " + AppOpsManager.permissionToOp(
1148                             requiredPermission)
1149                             + " due to sender " + r.callerPackage
1150                             + " (uid " + r.callingUid + ")");
1151                     skip = true;
1152                     break;
1153                 }
1154             }
1155         }
1156         if (!skip && r.appOp != AppOpsManager.OP_NONE
1157                 && mService.mAppOpsService.noteOperation(r.appOp,
1158                 info.activityInfo.applicationInfo.uid, info.activityInfo.packageName)
1159                 != AppOpsManager.MODE_ALLOWED) {
1160             Slog.w(TAG, "Appop Denial: receiving "
1161                     + r.intent + " to "
1162                     + component.flattenToShortString()
1163                     + " requires appop " + AppOpsManager.opToName(r.appOp)
1164                     + " due to sender " + r.callerPackage
1165                     + " (uid " + r.callingUid + ")");
1166             skip = true;
1167         }
1168         if (!skip) {
1169             skip = !mService.mIntentFirewall.checkBroadcast(r.intent, r.callingUid,
1170                     r.callingPid, r.resolvedType, info.activityInfo.applicationInfo.uid);
1171         }
1172         boolean isSingleton = false;
1173         try {
1174             isSingleton = mService.isSingleton(info.activityInfo.processName,
1175                     info.activityInfo.applicationInfo,
1176                     info.activityInfo.name, info.activityInfo.flags);
1177         } catch (SecurityException e) {
1178             Slog.w(TAG, e.getMessage());
1179             skip = true;
1180         }
1181         if ((info.activityInfo.flags&ActivityInfo.FLAG_SINGLE_USER) != 0) {
1182             if (ActivityManager.checkUidPermission(
1183                     android.Manifest.permission.INTERACT_ACROSS_USERS,
1184                     info.activityInfo.applicationInfo.uid)
1185                             != PackageManager.PERMISSION_GRANTED) {
1186                 Slog.w(TAG, "Permission Denial: Receiver " + component.flattenToShortString()
1187                         + " requests FLAG_SINGLE_USER, but app does not hold "
1188                         + android.Manifest.permission.INTERACT_ACROSS_USERS);
1189                 skip = true;
1190             }
1191         }
1192         if (!skip && info.activityInfo.applicationInfo.isInstantApp()
1193                 && r.callingUid != info.activityInfo.applicationInfo.uid) {
1194             Slog.w(TAG, "Instant App Denial: receiving "
1195                     + r.intent
1196                     + " to " + component.flattenToShortString()
1197                     + " due to sender " + r.callerPackage
1198                     + " (uid " + r.callingUid + ")"
1199                     + " Instant Apps do not support manifest receivers");
1200             skip = true;
1201         }
1202         if (!skip && r.callerInstantApp
1203                 && (info.activityInfo.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) == 0
1204                 && r.callingUid != info.activityInfo.applicationInfo.uid) {
1205             Slog.w(TAG, "Instant App Denial: receiving "
1206                     + r.intent
1207                     + " to " + component.flattenToShortString()
1208                     + " requires receiver have visibleToInstantApps set"
1209                     + " due to sender " + r.callerPackage
1210                     + " (uid " + r.callingUid + ")");
1211             skip = true;
1212         }
1213         if (r.curApp != null && r.curApp.crashing) {
1214             // If the target process is crashing, just skip it.
1215             Slog.w(TAG, "Skipping deliver ordered [" + mQueueName + "] " + r
1216                     + " to " + r.curApp + ": process crashing");
1217             skip = true;
1218         }
1219         if (!skip) {
1220             boolean isAvailable = false;
1221             try {
1222                 isAvailable = AppGlobals.getPackageManager().isPackageAvailable(
1223                         info.activityInfo.packageName,
1224                         UserHandle.getUserId(info.activityInfo.applicationInfo.uid));
1225             } catch (Exception e) {
1226                 // all such failures mean we skip this receiver
1227                 Slog.w(TAG, "Exception getting recipient info for "
1228                         + info.activityInfo.packageName, e);
1229             }
1230             if (!isAvailable) {
1231                 if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
1232                         "Skipping delivery to " + info.activityInfo.packageName + " / "
1233                         + info.activityInfo.applicationInfo.uid
1234                         + " : package no longer available");
1235                 skip = true;
1236             }
1237         }
1238 
1239         // If permissions need a review before any of the app components can run, we drop
1240         // the broadcast and if the calling app is in the foreground and the broadcast is
1241         // explicit we launch the review UI passing it a pending intent to send the skipped
1242         // broadcast.
1243         if (mService.mPermissionReviewRequired && !skip) {
1244             if (!requestStartTargetPermissionsReviewIfNeededLocked(r,
1245                     info.activityInfo.packageName, UserHandle.getUserId(
1246                             info.activityInfo.applicationInfo.uid))) {
1247                 skip = true;
1248             }
1249         }
1250 
1251         // This is safe to do even if we are skipping the broadcast, and we need
1252         // this information now to evaluate whether it is going to be allowed to run.
1253         final int receiverUid = info.activityInfo.applicationInfo.uid;
1254         // If it's a singleton, it needs to be the same app or a special app
1255         if (r.callingUid != Process.SYSTEM_UID && isSingleton
1256                 && mService.isValidSingletonCall(r.callingUid, receiverUid)) {
1257             info.activityInfo = mService.getActivityInfoForUser(info.activityInfo, 0);
1258         }
1259         String targetProcess = info.activityInfo.processName;
1260         ProcessRecord app = mService.getProcessRecordLocked(targetProcess,
1261                 info.activityInfo.applicationInfo.uid, false);
1262 
1263         if (!skip) {
1264             final int allowed = mService.getAppStartModeLocked(
1265                     info.activityInfo.applicationInfo.uid, info.activityInfo.packageName,
1266                     info.activityInfo.applicationInfo.targetSdkVersion, -1, true, false, false);
1267             if (allowed != ActivityManager.APP_START_MODE_NORMAL) {
1268                 // We won't allow this receiver to be launched if the app has been
1269                 // completely disabled from launches, or it was not explicitly sent
1270                 // to it and the app is in a state that should not receive it
1271                 // (depending on how getAppStartModeLocked has determined that).
1272                 if (allowed == ActivityManager.APP_START_MODE_DISABLED) {
1273                     Slog.w(TAG, "Background execution disabled: receiving "
1274                             + r.intent + " to "
1275                             + component.flattenToShortString());
1276                     skip = true;
1277                 } else if (((r.intent.getFlags()&Intent.FLAG_RECEIVER_EXCLUDE_BACKGROUND) != 0)
1278                         || (r.intent.getComponent() == null
1279                             && r.intent.getPackage() == null
1280                             && ((r.intent.getFlags()
1281                                     & Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND) == 0)
1282                             && !isSignaturePerm(r.requiredPermissions))) {
1283                     mService.addBackgroundCheckViolationLocked(r.intent.getAction(),
1284                             component.getPackageName());
1285                     Slog.w(TAG, "Background execution not allowed: receiving "
1286                             + r.intent + " to "
1287                             + component.flattenToShortString());
1288                     skip = true;
1289                 }
1290             }
1291         }
1292 
1293         if (!skip && !Intent.ACTION_SHUTDOWN.equals(r.intent.getAction())
1294                 && !mService.mUserController
1295                 .isUserRunning(UserHandle.getUserId(info.activityInfo.applicationInfo.uid),
1296                         0 /* flags */)) {
1297             skip = true;
1298             Slog.w(TAG,
1299                     "Skipping delivery to " + info.activityInfo.packageName + " / "
1300                             + info.activityInfo.applicationInfo.uid + " : user is not running");
1301         }
1302 
1303         if (skip) {
1304             if (DEBUG_BROADCAST)  Slog.v(TAG_BROADCAST,
1305                     "Skipping delivery of ordered [" + mQueueName + "] "
1306                     + r + " for whatever reason");
1307             r.delivery[recIdx] = BroadcastRecord.DELIVERY_SKIPPED;
1308             r.receiver = null;
1309             r.curFilter = null;
1310             r.state = BroadcastRecord.IDLE;
1311             r.manifestSkipCount++;
1312             scheduleBroadcastsLocked();
1313             return;
1314         }
1315         r.manifestCount++;
1316 
1317         r.delivery[recIdx] = BroadcastRecord.DELIVERY_DELIVERED;
1318         r.state = BroadcastRecord.APP_RECEIVE;
1319         r.curComponent = component;
1320         r.curReceiver = info.activityInfo;
1321         if (DEBUG_MU && r.callingUid > UserHandle.PER_USER_RANGE) {
1322             Slog.v(TAG_MU, "Updated broadcast record activity info for secondary user, "
1323                     + info.activityInfo + ", callingUid = " + r.callingUid + ", uid = "
1324                     + receiverUid);
1325         }
1326 
1327         if (brOptions != null && brOptions.getTemporaryAppWhitelistDuration() > 0) {
1328             scheduleTempWhitelistLocked(receiverUid,
1329                     brOptions.getTemporaryAppWhitelistDuration(), r);
1330         }
1331 
1332         // Broadcast is being executed, its package can't be stopped.
1333         try {
1334             AppGlobals.getPackageManager().setPackageStoppedState(
1335                     r.curComponent.getPackageName(), false, UserHandle.getUserId(r.callingUid));
1336         } catch (RemoteException e) {
1337         } catch (IllegalArgumentException e) {
1338             Slog.w(TAG, "Failed trying to unstop package "
1339                     + r.curComponent.getPackageName() + ": " + e);
1340         }
1341 
1342         // Is this receiver's application already running?
1343         if (app != null && app.thread != null && !app.killed) {
1344             try {
1345                 app.addPackage(info.activityInfo.packageName,
1346                         info.activityInfo.applicationInfo.versionCode, mService.mProcessStats);
1347                 processCurBroadcastLocked(r, app, skipOomAdj);
1348                 return;
1349             } catch (RemoteException e) {
1350                 Slog.w(TAG, "Exception when sending broadcast to "
1351                       + r.curComponent, e);
1352             } catch (RuntimeException e) {
1353                 Slog.wtf(TAG, "Failed sending broadcast to "
1354                         + r.curComponent + " with " + r.intent, e);
1355                 // If some unexpected exception happened, just skip
1356                 // this broadcast.  At this point we are not in the call
1357                 // from a client, so throwing an exception out from here
1358                 // will crash the entire system instead of just whoever
1359                 // sent the broadcast.
1360                 logBroadcastReceiverDiscardLocked(r);
1361                 finishReceiverLocked(r, r.resultCode, r.resultData,
1362                         r.resultExtras, r.resultAbort, false);
1363                 scheduleBroadcastsLocked();
1364                 // We need to reset the state if we failed to start the receiver.
1365                 r.state = BroadcastRecord.IDLE;
1366                 return;
1367             }
1368 
1369             // If a dead object exception was thrown -- fall through to
1370             // restart the application.
1371         }
1372 
1373         // Not running -- get it started, to be executed when the app comes up.
1374         if (DEBUG_BROADCAST)  Slog.v(TAG_BROADCAST,
1375                 "Need to start app ["
1376                 + mQueueName + "] " + targetProcess + " for broadcast " + r);
1377         if ((r.curApp=mService.startProcessLocked(targetProcess,
1378                 info.activityInfo.applicationInfo, true,
1379                 r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND,
1380                 "broadcast", r.curComponent,
1381                 (r.intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0, false, false))
1382                         == null) {
1383             // Ah, this recipient is unavailable.  Finish it if necessary,
1384             // and mark the broadcast record as ready for the next.
1385             Slog.w(TAG, "Unable to launch app "
1386                     + info.activityInfo.applicationInfo.packageName + "/"
1387                     + receiverUid + " for broadcast "
1388                     + r.intent + ": process is bad");
1389             logBroadcastReceiverDiscardLocked(r);
1390             finishReceiverLocked(r, r.resultCode, r.resultData,
1391                     r.resultExtras, r.resultAbort, false);
1392             scheduleBroadcastsLocked();
1393             r.state = BroadcastRecord.IDLE;
1394             return;
1395         }
1396 
1397         mPendingBroadcast = r;
1398         mPendingBroadcastRecvIndex = recIdx;
1399     }
1400 
setBroadcastTimeoutLocked(long timeoutTime)1401     final void setBroadcastTimeoutLocked(long timeoutTime) {
1402         if (! mPendingBroadcastTimeoutMessage) {
1403             Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG, this);
1404             mHandler.sendMessageAtTime(msg, timeoutTime);
1405             mPendingBroadcastTimeoutMessage = true;
1406         }
1407     }
1408 
cancelBroadcastTimeoutLocked()1409     final void cancelBroadcastTimeoutLocked() {
1410         if (mPendingBroadcastTimeoutMessage) {
1411             mHandler.removeMessages(BROADCAST_TIMEOUT_MSG, this);
1412             mPendingBroadcastTimeoutMessage = false;
1413         }
1414     }
1415 
broadcastTimeoutLocked(boolean fromMsg)1416     final void broadcastTimeoutLocked(boolean fromMsg) {
1417         if (fromMsg) {
1418             mPendingBroadcastTimeoutMessage = false;
1419         }
1420 
1421         if (mOrderedBroadcasts.size() == 0) {
1422             return;
1423         }
1424 
1425         long now = SystemClock.uptimeMillis();
1426         BroadcastRecord r = mOrderedBroadcasts.get(0);
1427         if (fromMsg) {
1428             if (!mService.mProcessesReady) {
1429                 // Only process broadcast timeouts if the system is ready. That way
1430                 // PRE_BOOT_COMPLETED broadcasts can't timeout as they are intended
1431                 // to do heavy lifting for system up.
1432                 return;
1433             }
1434 
1435             long timeoutTime = r.receiverTime + mTimeoutPeriod;
1436             if (timeoutTime > now) {
1437                 // We can observe premature timeouts because we do not cancel and reset the
1438                 // broadcast timeout message after each receiver finishes.  Instead, we set up
1439                 // an initial timeout then kick it down the road a little further as needed
1440                 // when it expires.
1441                 if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
1442                         "Premature timeout ["
1443                         + mQueueName + "] @ " + now + ": resetting BROADCAST_TIMEOUT_MSG for "
1444                         + timeoutTime);
1445                 setBroadcastTimeoutLocked(timeoutTime);
1446                 return;
1447             }
1448         }
1449 
1450         BroadcastRecord br = mOrderedBroadcasts.get(0);
1451         if (br.state == BroadcastRecord.WAITING_SERVICES) {
1452             // In this case the broadcast had already finished, but we had decided to wait
1453             // for started services to finish as well before going on.  So if we have actually
1454             // waited long enough time timeout the broadcast, let's give up on the whole thing
1455             // and just move on to the next.
1456             Slog.i(TAG, "Waited long enough for: " + (br.curComponent != null
1457                     ? br.curComponent.flattenToShortString() : "(null)"));
1458             br.curComponent = null;
1459             br.state = BroadcastRecord.IDLE;
1460             processNextBroadcast(false);
1461             return;
1462         }
1463 
1464         // If the receiver app is being debugged we quietly ignore unresponsiveness, just
1465         // tidying up and moving on to the next broadcast without crashing or ANRing this
1466         // app just because it's stopped at a breakpoint.
1467         final boolean debugging = (r.curApp != null && r.curApp.debugging);
1468 
1469         Slog.w(TAG, "Timeout of broadcast " + r + " - receiver=" + r.receiver
1470                 + ", started " + (now - r.receiverTime) + "ms ago");
1471         r.receiverTime = now;
1472         if (!debugging) {
1473             r.anrCount++;
1474         }
1475 
1476         ProcessRecord app = null;
1477         String anrMessage = null;
1478 
1479         Object curReceiver;
1480         if (r.nextReceiver > 0) {
1481             curReceiver = r.receivers.get(r.nextReceiver-1);
1482             r.delivery[r.nextReceiver-1] = BroadcastRecord.DELIVERY_TIMEOUT;
1483         } else {
1484             curReceiver = r.curReceiver;
1485         }
1486         Slog.w(TAG, "Receiver during timeout of " + r + " : " + curReceiver);
1487         logBroadcastReceiverDiscardLocked(r);
1488         if (curReceiver != null && curReceiver instanceof BroadcastFilter) {
1489             BroadcastFilter bf = (BroadcastFilter)curReceiver;
1490             if (bf.receiverList.pid != 0
1491                     && bf.receiverList.pid != ActivityManagerService.MY_PID) {
1492                 synchronized (mService.mPidsSelfLocked) {
1493                     app = mService.mPidsSelfLocked.get(
1494                             bf.receiverList.pid);
1495                 }
1496             }
1497         } else {
1498             app = r.curApp;
1499         }
1500 
1501         if (app != null) {
1502             anrMessage = "Broadcast of " + r.intent.toString();
1503         }
1504 
1505         if (mPendingBroadcast == r) {
1506             mPendingBroadcast = null;
1507         }
1508 
1509         // Move on to the next receiver.
1510         finishReceiverLocked(r, r.resultCode, r.resultData,
1511                 r.resultExtras, r.resultAbort, false);
1512         scheduleBroadcastsLocked();
1513 
1514         if (!debugging && anrMessage != null) {
1515             // Post the ANR to the handler since we do not want to process ANRs while
1516             // potentially holding our lock.
1517             mHandler.post(new AppNotResponding(app, anrMessage));
1518         }
1519     }
1520 
ringAdvance(int x, final int increment, final int ringSize)1521     private final int ringAdvance(int x, final int increment, final int ringSize) {
1522         x += increment;
1523         if (x < 0) return (ringSize - 1);
1524         else if (x >= ringSize) return 0;
1525         else return x;
1526     }
1527 
addBroadcastToHistoryLocked(BroadcastRecord original)1528     private final void addBroadcastToHistoryLocked(BroadcastRecord original) {
1529         if (original.callingUid < 0) {
1530             // This was from a registerReceiver() call; ignore it.
1531             return;
1532         }
1533         original.finishTime = SystemClock.uptimeMillis();
1534 
1535         if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
1536             Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER,
1537                 createBroadcastTraceTitle(original, BroadcastRecord.DELIVERY_DELIVERED),
1538                 System.identityHashCode(original));
1539         }
1540 
1541         // Note sometimes (only for sticky broadcasts?) we reuse BroadcastRecords,
1542         // So don't change the incoming record directly.
1543         final BroadcastRecord historyRecord = original.maybeStripForHistory();
1544 
1545         mBroadcastHistory[mHistoryNext] = historyRecord;
1546         mHistoryNext = ringAdvance(mHistoryNext, 1, MAX_BROADCAST_HISTORY);
1547 
1548         mBroadcastSummaryHistory[mSummaryHistoryNext] = historyRecord.intent;
1549         mSummaryHistoryEnqueueTime[mSummaryHistoryNext] = historyRecord.enqueueClockTime;
1550         mSummaryHistoryDispatchTime[mSummaryHistoryNext] = historyRecord.dispatchClockTime;
1551         mSummaryHistoryFinishTime[mSummaryHistoryNext] = System.currentTimeMillis();
1552         mSummaryHistoryNext = ringAdvance(mSummaryHistoryNext, 1, MAX_BROADCAST_SUMMARY_HISTORY);
1553     }
1554 
cleanupDisabledPackageReceiversLocked( String packageName, Set<String> filterByClasses, int userId, boolean doit)1555     boolean cleanupDisabledPackageReceiversLocked(
1556             String packageName, Set<String> filterByClasses, int userId, boolean doit) {
1557         boolean didSomething = false;
1558         for (int i = mParallelBroadcasts.size() - 1; i >= 0; i--) {
1559             didSomething |= mParallelBroadcasts.get(i).cleanupDisabledPackageReceiversLocked(
1560                     packageName, filterByClasses, userId, doit);
1561             if (!doit && didSomething) {
1562                 return true;
1563             }
1564         }
1565 
1566         for (int i = mOrderedBroadcasts.size() - 1; i >= 0; i--) {
1567             didSomething |= mOrderedBroadcasts.get(i).cleanupDisabledPackageReceiversLocked(
1568                     packageName, filterByClasses, userId, doit);
1569             if (!doit && didSomething) {
1570                 return true;
1571             }
1572         }
1573 
1574         return didSomething;
1575     }
1576 
logBroadcastReceiverDiscardLocked(BroadcastRecord r)1577     final void logBroadcastReceiverDiscardLocked(BroadcastRecord r) {
1578         final int logIndex = r.nextReceiver - 1;
1579         if (logIndex >= 0 && logIndex < r.receivers.size()) {
1580             Object curReceiver = r.receivers.get(logIndex);
1581             if (curReceiver instanceof BroadcastFilter) {
1582                 BroadcastFilter bf = (BroadcastFilter) curReceiver;
1583                 EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_FILTER,
1584                         bf.owningUserId, System.identityHashCode(r),
1585                         r.intent.getAction(), logIndex, System.identityHashCode(bf));
1586             } else {
1587                 ResolveInfo ri = (ResolveInfo) curReceiver;
1588                 EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP,
1589                         UserHandle.getUserId(ri.activityInfo.applicationInfo.uid),
1590                         System.identityHashCode(r), r.intent.getAction(), logIndex, ri.toString());
1591             }
1592         } else {
1593             if (logIndex < 0) Slog.w(TAG,
1594                     "Discarding broadcast before first receiver is invoked: " + r);
1595             EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP,
1596                     -1, System.identityHashCode(r),
1597                     r.intent.getAction(),
1598                     r.nextReceiver,
1599                     "NONE");
1600         }
1601     }
1602 
createBroadcastTraceTitle(BroadcastRecord record, int state)1603     private String createBroadcastTraceTitle(BroadcastRecord record, int state) {
1604         return String.format("Broadcast %s from %s (%s) %s",
1605                 state == BroadcastRecord.DELIVERY_PENDING ? "in queue" : "dispatched",
1606                 record.callerPackage == null ? "" : record.callerPackage,
1607                 record.callerApp == null ? "process unknown" : record.callerApp.toShortString(),
1608                 record.intent == null ? "" : record.intent.getAction());
1609     }
1610 
isIdle()1611     final boolean isIdle() {
1612         return mParallelBroadcasts.isEmpty() && mOrderedBroadcasts.isEmpty()
1613                 && (mPendingBroadcast == null);
1614     }
1615 
writeToProto(ProtoOutputStream proto, long fieldId)1616     void writeToProto(ProtoOutputStream proto, long fieldId) {
1617         long token = proto.start(fieldId);
1618         proto.write(BroadcastQueueProto.QUEUE_NAME, mQueueName);
1619         int N;
1620         N = mParallelBroadcasts.size();
1621         for (int i = N - 1; i >= 0; i--) {
1622             mParallelBroadcasts.get(i).writeToProto(proto, BroadcastQueueProto.PARALLEL_BROADCASTS);
1623         }
1624         N = mOrderedBroadcasts.size();
1625         for (int i = N - 1; i >= 0; i--) {
1626             mOrderedBroadcasts.get(i).writeToProto(proto, BroadcastQueueProto.ORDERED_BROADCASTS);
1627         }
1628         if (mPendingBroadcast != null) {
1629             mPendingBroadcast.writeToProto(proto, BroadcastQueueProto.PENDING_BROADCAST);
1630         }
1631 
1632         int lastIndex = mHistoryNext;
1633         int ringIndex = lastIndex;
1634         do {
1635             // increasing index = more recent entry, and we want to print the most
1636             // recent first and work backwards, so we roll through the ring backwards.
1637             ringIndex = ringAdvance(ringIndex, -1, MAX_BROADCAST_HISTORY);
1638             BroadcastRecord r = mBroadcastHistory[ringIndex];
1639             if (r != null) {
1640                 r.writeToProto(proto, BroadcastQueueProto.HISTORICAL_BROADCASTS);
1641             }
1642         } while (ringIndex != lastIndex);
1643 
1644         lastIndex = ringIndex = mSummaryHistoryNext;
1645         do {
1646             ringIndex = ringAdvance(ringIndex, -1, MAX_BROADCAST_SUMMARY_HISTORY);
1647             Intent intent = mBroadcastSummaryHistory[ringIndex];
1648             if (intent == null) {
1649                 continue;
1650             }
1651             long summaryToken = proto.start(BroadcastQueueProto.HISTORICAL_BROADCASTS_SUMMARY);
1652             intent.writeToProto(proto, BroadcastQueueProto.BroadcastSummary.INTENT,
1653                     false, true, true, false);
1654             proto.write(BroadcastQueueProto.BroadcastSummary.ENQUEUE_CLOCK_TIME_MS,
1655                     mSummaryHistoryEnqueueTime[ringIndex]);
1656             proto.write(BroadcastQueueProto.BroadcastSummary.DISPATCH_CLOCK_TIME_MS,
1657                     mSummaryHistoryDispatchTime[ringIndex]);
1658             proto.write(BroadcastQueueProto.BroadcastSummary.FINISH_CLOCK_TIME_MS,
1659                     mSummaryHistoryFinishTime[ringIndex]);
1660             proto.end(summaryToken);
1661         } while (ringIndex != lastIndex);
1662         proto.end(token);
1663     }
1664 
dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args, int opti, boolean dumpAll, String dumpPackage, boolean needSep)1665     final boolean dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args,
1666             int opti, boolean dumpAll, String dumpPackage, boolean needSep) {
1667         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1668         if (mParallelBroadcasts.size() > 0 || mOrderedBroadcasts.size() > 0
1669                 || mPendingBroadcast != null) {
1670             boolean printed = false;
1671             for (int i = mParallelBroadcasts.size() - 1; i >= 0; i--) {
1672                 BroadcastRecord br = mParallelBroadcasts.get(i);
1673                 if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) {
1674                     continue;
1675                 }
1676                 if (!printed) {
1677                     if (needSep) {
1678                         pw.println();
1679                     }
1680                     needSep = true;
1681                     printed = true;
1682                     pw.println("  Active broadcasts [" + mQueueName + "]:");
1683                 }
1684                 pw.println("  Active Broadcast " + mQueueName + " #" + i + ":");
1685                 br.dump(pw, "    ", sdf);
1686             }
1687             printed = false;
1688             needSep = true;
1689             for (int i = mOrderedBroadcasts.size() - 1; i >= 0; i--) {
1690                 BroadcastRecord br = mOrderedBroadcasts.get(i);
1691                 if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) {
1692                     continue;
1693                 }
1694                 if (!printed) {
1695                     if (needSep) {
1696                         pw.println();
1697                     }
1698                     needSep = true;
1699                     printed = true;
1700                     pw.println("  Active ordered broadcasts [" + mQueueName + "]:");
1701                 }
1702                 pw.println("  Active Ordered Broadcast " + mQueueName + " #" + i + ":");
1703                 mOrderedBroadcasts.get(i).dump(pw, "    ", sdf);
1704             }
1705             if (dumpPackage == null || (mPendingBroadcast != null
1706                     && dumpPackage.equals(mPendingBroadcast.callerPackage))) {
1707                 if (needSep) {
1708                     pw.println();
1709                 }
1710                 pw.println("  Pending broadcast [" + mQueueName + "]:");
1711                 if (mPendingBroadcast != null) {
1712                     mPendingBroadcast.dump(pw, "    ", sdf);
1713                 } else {
1714                     pw.println("    (null)");
1715                 }
1716                 needSep = true;
1717             }
1718         }
1719 
1720         int i;
1721         boolean printed = false;
1722 
1723         i = -1;
1724         int lastIndex = mHistoryNext;
1725         int ringIndex = lastIndex;
1726         do {
1727             // increasing index = more recent entry, and we want to print the most
1728             // recent first and work backwards, so we roll through the ring backwards.
1729             ringIndex = ringAdvance(ringIndex, -1, MAX_BROADCAST_HISTORY);
1730             BroadcastRecord r = mBroadcastHistory[ringIndex];
1731             if (r == null) {
1732                 continue;
1733             }
1734 
1735             i++; // genuine record of some sort even if we're filtering it out
1736             if (dumpPackage != null && !dumpPackage.equals(r.callerPackage)) {
1737                 continue;
1738             }
1739             if (!printed) {
1740                 if (needSep) {
1741                     pw.println();
1742                 }
1743                 needSep = true;
1744                 pw.println("  Historical broadcasts [" + mQueueName + "]:");
1745                 printed = true;
1746             }
1747             if (dumpAll) {
1748                 pw.print("  Historical Broadcast " + mQueueName + " #");
1749                         pw.print(i); pw.println(":");
1750                 r.dump(pw, "    ", sdf);
1751             } else {
1752                 pw.print("  #"); pw.print(i); pw.print(": "); pw.println(r);
1753                 pw.print("    ");
1754                 pw.println(r.intent.toShortString(false, true, true, false));
1755                 if (r.targetComp != null && r.targetComp != r.intent.getComponent()) {
1756                     pw.print("    targetComp: "); pw.println(r.targetComp.toShortString());
1757                 }
1758                 Bundle bundle = r.intent.getExtras();
1759                 if (bundle != null) {
1760                     pw.print("    extras: "); pw.println(bundle.toString());
1761                 }
1762             }
1763         } while (ringIndex != lastIndex);
1764 
1765         if (dumpPackage == null) {
1766             lastIndex = ringIndex = mSummaryHistoryNext;
1767             if (dumpAll) {
1768                 printed = false;
1769                 i = -1;
1770             } else {
1771                 // roll over the 'i' full dumps that have already been issued
1772                 for (int j = i;
1773                         j > 0 && ringIndex != lastIndex;) {
1774                     ringIndex = ringAdvance(ringIndex, -1, MAX_BROADCAST_SUMMARY_HISTORY);
1775                     BroadcastRecord r = mBroadcastHistory[ringIndex];
1776                     if (r == null) {
1777                         continue;
1778                     }
1779                     j--;
1780                 }
1781             }
1782             // done skipping; dump the remainder of the ring. 'i' is still the ordinal within
1783             // the overall broadcast history.
1784             do {
1785                 ringIndex = ringAdvance(ringIndex, -1, MAX_BROADCAST_SUMMARY_HISTORY);
1786                 Intent intent = mBroadcastSummaryHistory[ringIndex];
1787                 if (intent == null) {
1788                     continue;
1789                 }
1790                 if (!printed) {
1791                     if (needSep) {
1792                         pw.println();
1793                     }
1794                     needSep = true;
1795                     pw.println("  Historical broadcasts summary [" + mQueueName + "]:");
1796                     printed = true;
1797                 }
1798                 if (!dumpAll && i >= 50) {
1799                     pw.println("  ...");
1800                     break;
1801                 }
1802                 i++;
1803                 pw.print("  #"); pw.print(i); pw.print(": ");
1804                 pw.println(intent.toShortString(false, true, true, false));
1805                 pw.print("    ");
1806                 TimeUtils.formatDuration(mSummaryHistoryDispatchTime[ringIndex]
1807                         - mSummaryHistoryEnqueueTime[ringIndex], pw);
1808                 pw.print(" dispatch ");
1809                 TimeUtils.formatDuration(mSummaryHistoryFinishTime[ringIndex]
1810                         - mSummaryHistoryDispatchTime[ringIndex], pw);
1811                 pw.println(" finish");
1812                 pw.print("    enq=");
1813                 pw.print(sdf.format(new Date(mSummaryHistoryEnqueueTime[ringIndex])));
1814                 pw.print(" disp=");
1815                 pw.print(sdf.format(new Date(mSummaryHistoryDispatchTime[ringIndex])));
1816                 pw.print(" fin=");
1817                 pw.println(sdf.format(new Date(mSummaryHistoryFinishTime[ringIndex])));
1818                 Bundle bundle = intent.getExtras();
1819                 if (bundle != null) {
1820                     pw.print("    extras: "); pw.println(bundle.toString());
1821                 }
1822             } while (ringIndex != lastIndex);
1823         }
1824 
1825         return needSep;
1826     }
1827 }
1828