• 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 java.io.FileDescriptor;
20 import java.io.PrintWriter;
21 import java.util.ArrayList;
22 
23 import android.app.ActivityManager;
24 import android.app.AppGlobals;
25 import android.app.AppOpsManager;
26 import android.content.ComponentName;
27 import android.content.IIntentReceiver;
28 import android.content.Intent;
29 import android.content.pm.ActivityInfo;
30 import android.content.pm.PackageInfo;
31 import android.content.pm.PackageManager;
32 import android.content.pm.ResolveInfo;
33 import android.os.Bundle;
34 import android.os.Handler;
35 import android.os.IBinder;
36 import android.os.Message;
37 import android.os.Process;
38 import android.os.RemoteException;
39 import android.os.SystemClock;
40 import android.os.UserHandle;
41 import android.util.EventLog;
42 import android.util.Log;
43 import android.util.Slog;
44 
45 /**
46  * BROADCASTS
47  *
48  * We keep two broadcast queues and associated bookkeeping, one for those at
49  * foreground priority, and one for normal (background-priority) broadcasts.
50  */
51 public final class BroadcastQueue {
52     static final String TAG = "BroadcastQueue";
53     static final String TAG_MU = ActivityManagerService.TAG_MU;
54     static final boolean DEBUG_BROADCAST = ActivityManagerService.DEBUG_BROADCAST;
55     static final boolean DEBUG_BROADCAST_LIGHT = ActivityManagerService.DEBUG_BROADCAST_LIGHT;
56     static final boolean DEBUG_MU = ActivityManagerService.DEBUG_MU;
57 
58     static final int MAX_BROADCAST_HISTORY = ActivityManager.isLowRamDeviceStatic() ? 10 : 50;
59     static final int MAX_BROADCAST_SUMMARY_HISTORY
60             = ActivityManager.isLowRamDeviceStatic() ? 25 : 300;
61 
62     final ActivityManagerService mService;
63 
64     /**
65      * Recognizable moniker for this queue
66      */
67     final String mQueueName;
68 
69     /**
70      * Timeout period for this queue's broadcasts
71      */
72     final long mTimeoutPeriod;
73 
74     /**
75      * If true, we can delay broadcasts while waiting services to finish in the previous
76      * receiver's process.
77      */
78     final boolean mDelayBehindServices;
79 
80     /**
81      * Lists of all active broadcasts that are to be executed immediately
82      * (without waiting for another broadcast to finish).  Currently this only
83      * contains broadcasts to registered receivers, to avoid spinning up
84      * a bunch of processes to execute IntentReceiver components.  Background-
85      * and foreground-priority broadcasts are queued separately.
86      */
87     final ArrayList<BroadcastRecord> mParallelBroadcasts = new ArrayList<BroadcastRecord>();
88 
89     /**
90      * List of all active broadcasts that are to be executed one at a time.
91      * The object at the top of the list is the currently activity broadcasts;
92      * those after it are waiting for the top to finish.  As with parallel
93      * broadcasts, separate background- and foreground-priority queues are
94      * maintained.
95      */
96     final ArrayList<BroadcastRecord> mOrderedBroadcasts = new ArrayList<BroadcastRecord>();
97 
98     /**
99      * Historical data of past broadcasts, for debugging.
100      */
101     final BroadcastRecord[] mBroadcastHistory = new BroadcastRecord[MAX_BROADCAST_HISTORY];
102 
103     /**
104      * Summary of historical data of past broadcasts, for debugging.
105      */
106     final Intent[] mBroadcastSummaryHistory = new Intent[MAX_BROADCAST_SUMMARY_HISTORY];
107 
108     /**
109      * Set when we current have a BROADCAST_INTENT_MSG in flight.
110      */
111     boolean mBroadcastsScheduled = false;
112 
113     /**
114      * True if we have a pending unexpired BROADCAST_TIMEOUT_MSG posted to our handler.
115      */
116     boolean mPendingBroadcastTimeoutMessage;
117 
118     /**
119      * Intent broadcasts that we have tried to start, but are
120      * waiting for the application's process to be created.  We only
121      * need one per scheduling class (instead of a list) because we always
122      * process broadcasts one at a time, so no others can be started while
123      * waiting for this one.
124      */
125     BroadcastRecord mPendingBroadcast = null;
126 
127     /**
128      * The receiver index that is pending, to restart the broadcast if needed.
129      */
130     int mPendingBroadcastRecvIndex;
131 
132     static final int BROADCAST_INTENT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG;
133     static final int BROADCAST_TIMEOUT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG + 1;
134 
135     final Handler mHandler = new Handler() {
136         public void handleMessage(Message msg) {
137             switch (msg.what) {
138                 case BROADCAST_INTENT_MSG: {
139                     if (DEBUG_BROADCAST) Slog.v(
140                             TAG, "Received BROADCAST_INTENT_MSG");
141                     processNextBroadcast(true);
142                 } break;
143                 case BROADCAST_TIMEOUT_MSG: {
144                     synchronized (mService) {
145                         broadcastTimeoutLocked(true);
146                     }
147                 } break;
148             }
149         }
150     };
151 
152     private final class AppNotResponding implements Runnable {
153         private final ProcessRecord mApp;
154         private final String mAnnotation;
155 
AppNotResponding(ProcessRecord app, String annotation)156         public AppNotResponding(ProcessRecord app, String annotation) {
157             mApp = app;
158             mAnnotation = annotation;
159         }
160 
161         @Override
run()162         public void run() {
163             mService.appNotResponding(mApp, null, null, false, mAnnotation);
164         }
165     }
166 
BroadcastQueue(ActivityManagerService service, String name, long timeoutPeriod, boolean allowDelayBehindServices)167     BroadcastQueue(ActivityManagerService service, String name, long timeoutPeriod,
168             boolean allowDelayBehindServices) {
169         mService = service;
170         mQueueName = name;
171         mTimeoutPeriod = timeoutPeriod;
172         mDelayBehindServices = allowDelayBehindServices;
173     }
174 
isPendingBroadcastProcessLocked(int pid)175     public boolean isPendingBroadcastProcessLocked(int pid) {
176         return mPendingBroadcast != null && mPendingBroadcast.curApp.pid == pid;
177     }
178 
enqueueParallelBroadcastLocked(BroadcastRecord r)179     public void enqueueParallelBroadcastLocked(BroadcastRecord r) {
180         mParallelBroadcasts.add(r);
181     }
182 
enqueueOrderedBroadcastLocked(BroadcastRecord r)183     public void enqueueOrderedBroadcastLocked(BroadcastRecord r) {
184         mOrderedBroadcasts.add(r);
185     }
186 
replaceParallelBroadcastLocked(BroadcastRecord r)187     public final boolean replaceParallelBroadcastLocked(BroadcastRecord r) {
188         for (int i=mParallelBroadcasts.size()-1; i>=0; i--) {
189             if (r.intent.filterEquals(mParallelBroadcasts.get(i).intent)) {
190                 if (DEBUG_BROADCAST) Slog.v(TAG,
191                         "***** DROPPING PARALLEL ["
192                 + mQueueName + "]: " + r.intent);
193                 mParallelBroadcasts.set(i, r);
194                 return true;
195             }
196         }
197         return false;
198     }
199 
replaceOrderedBroadcastLocked(BroadcastRecord r)200     public final boolean replaceOrderedBroadcastLocked(BroadcastRecord r) {
201         for (int i=mOrderedBroadcasts.size()-1; i>0; i--) {
202             if (r.intent.filterEquals(mOrderedBroadcasts.get(i).intent)) {
203                 if (DEBUG_BROADCAST) Slog.v(TAG,
204                         "***** DROPPING ORDERED ["
205                         + mQueueName + "]: " + r.intent);
206                 mOrderedBroadcasts.set(i, r);
207                 return true;
208             }
209         }
210         return false;
211     }
212 
processCurBroadcastLocked(BroadcastRecord r, ProcessRecord app)213     private final void processCurBroadcastLocked(BroadcastRecord r,
214             ProcessRecord app) throws RemoteException {
215         if (DEBUG_BROADCAST)  Slog.v(TAG,
216                 "Process cur broadcast " + r + " for app " + app);
217         if (app.thread == null) {
218             throw new RemoteException();
219         }
220         r.receiver = app.thread.asBinder();
221         r.curApp = app;
222         app.curReceiver = r;
223         app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_RECEIVER);
224         mService.updateLruProcessLocked(app, false, null);
225         mService.updateOomAdjLocked();
226 
227         // Tell the application to launch this receiver.
228         r.intent.setComponent(r.curComponent);
229 
230         boolean started = false;
231         try {
232             if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG,
233                     "Delivering to component " + r.curComponent
234                     + ": " + r);
235             mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
236             app.thread.scheduleReceiver(new Intent(r.intent), r.curReceiver,
237                     mService.compatibilityInfoForPackageLocked(r.curReceiver.applicationInfo),
238                     r.resultCode, r.resultData, r.resultExtras, r.ordered, r.userId,
239                     app.repProcState);
240             if (DEBUG_BROADCAST)  Slog.v(TAG,
241                     "Process cur broadcast " + r + " DELIVERED for app " + app);
242             started = true;
243         } finally {
244             if (!started) {
245                 if (DEBUG_BROADCAST)  Slog.v(TAG,
246                         "Process cur broadcast " + r + ": NOT STARTED!");
247                 r.receiver = null;
248                 r.curApp = null;
249                 app.curReceiver = null;
250             }
251         }
252     }
253 
sendPendingBroadcastsLocked(ProcessRecord app)254     public boolean sendPendingBroadcastsLocked(ProcessRecord app) {
255         boolean didSomething = false;
256         final BroadcastRecord br = mPendingBroadcast;
257         if (br != null && br.curApp.pid == app.pid) {
258             try {
259                 mPendingBroadcast = null;
260                 processCurBroadcastLocked(br, app);
261                 didSomething = true;
262             } catch (Exception e) {
263                 Slog.w(TAG, "Exception in new application when starting receiver "
264                         + br.curComponent.flattenToShortString(), e);
265                 logBroadcastReceiverDiscardLocked(br);
266                 finishReceiverLocked(br, br.resultCode, br.resultData,
267                         br.resultExtras, br.resultAbort, false);
268                 scheduleBroadcastsLocked();
269                 // We need to reset the state if we failed to start the receiver.
270                 br.state = BroadcastRecord.IDLE;
271                 throw new RuntimeException(e.getMessage());
272             }
273         }
274         return didSomething;
275     }
276 
skipPendingBroadcastLocked(int pid)277     public void skipPendingBroadcastLocked(int pid) {
278         final BroadcastRecord br = mPendingBroadcast;
279         if (br != null && br.curApp.pid == pid) {
280             br.state = BroadcastRecord.IDLE;
281             br.nextReceiver = mPendingBroadcastRecvIndex;
282             mPendingBroadcast = null;
283             scheduleBroadcastsLocked();
284         }
285     }
286 
skipCurrentReceiverLocked(ProcessRecord app)287     public void skipCurrentReceiverLocked(ProcessRecord app) {
288         boolean reschedule = false;
289         BroadcastRecord r = app.curReceiver;
290         if (r != null) {
291             // The current broadcast is waiting for this app's receiver
292             // to be finished.  Looks like that's not going to happen, so
293             // let the broadcast continue.
294             logBroadcastReceiverDiscardLocked(r);
295             finishReceiverLocked(r, r.resultCode, r.resultData,
296                     r.resultExtras, r.resultAbort, false);
297             reschedule = true;
298         }
299 
300         r = mPendingBroadcast;
301         if (r != null && r.curApp == app) {
302             if (DEBUG_BROADCAST) Slog.v(TAG,
303                     "[" + mQueueName + "] skip & discard pending app " + r);
304             logBroadcastReceiverDiscardLocked(r);
305             finishReceiverLocked(r, r.resultCode, r.resultData,
306                     r.resultExtras, r.resultAbort, false);
307             reschedule = true;
308         }
309         if (reschedule) {
310             scheduleBroadcastsLocked();
311         }
312     }
313 
scheduleBroadcastsLocked()314     public void scheduleBroadcastsLocked() {
315         if (DEBUG_BROADCAST) Slog.v(TAG, "Schedule broadcasts ["
316                 + mQueueName + "]: current="
317                 + mBroadcastsScheduled);
318 
319         if (mBroadcastsScheduled) {
320             return;
321         }
322         mHandler.sendMessage(mHandler.obtainMessage(BROADCAST_INTENT_MSG, this));
323         mBroadcastsScheduled = true;
324     }
325 
getMatchingOrderedReceiver(IBinder receiver)326     public BroadcastRecord getMatchingOrderedReceiver(IBinder receiver) {
327         if (mOrderedBroadcasts.size() > 0) {
328             final BroadcastRecord r = mOrderedBroadcasts.get(0);
329             if (r != null && r.receiver == receiver) {
330                 return r;
331             }
332         }
333         return null;
334     }
335 
finishReceiverLocked(BroadcastRecord r, int resultCode, String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices)336     public boolean finishReceiverLocked(BroadcastRecord r, int resultCode,
337             String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices) {
338         final int state = r.state;
339         final ActivityInfo receiver = r.curReceiver;
340         r.state = BroadcastRecord.IDLE;
341         if (state == BroadcastRecord.IDLE) {
342             Slog.w(TAG, "finishReceiver [" + mQueueName + "] called but state is IDLE");
343         }
344         r.receiver = null;
345         r.intent.setComponent(null);
346         if (r.curApp != null) {
347             r.curApp.curReceiver = null;
348         }
349         if (r.curFilter != null) {
350             r.curFilter.receiverList.curBroadcast = null;
351         }
352         r.curFilter = null;
353         r.curReceiver = null;
354         r.curApp = null;
355         mPendingBroadcast = null;
356 
357         r.resultCode = resultCode;
358         r.resultData = resultData;
359         r.resultExtras = resultExtras;
360         if (resultAbort && (r.intent.getFlags()&Intent.FLAG_RECEIVER_NO_ABORT) == 0) {
361             r.resultAbort = resultAbort;
362         } else {
363             r.resultAbort = false;
364         }
365 
366         if (waitForServices && r.curComponent != null && r.queue.mDelayBehindServices
367                 && r.queue.mOrderedBroadcasts.size() > 0
368                 && r.queue.mOrderedBroadcasts.get(0) == r) {
369             ActivityInfo nextReceiver;
370             if (r.nextReceiver < r.receivers.size()) {
371                 Object obj = r.receivers.get(r.nextReceiver);
372                 nextReceiver = (obj instanceof ActivityInfo) ? (ActivityInfo)obj : null;
373             } else {
374                 nextReceiver = null;
375             }
376             // Don't do this if the next receive is in the same process as the current one.
377             if (receiver == null || nextReceiver == null
378                     || receiver.applicationInfo.uid != nextReceiver.applicationInfo.uid
379                     || !receiver.processName.equals(nextReceiver.processName)) {
380                 // In this case, we are ready to process the next receiver for the current broadcast,
381                 // but are on a queue that would like to wait for services to finish before moving
382                 // on.  If there are background services currently starting, then we will go into a
383                 // special state where we hold off on continuing this broadcast until they are done.
384                 if (mService.mServices.hasBackgroundServices(r.userId)) {
385                     Slog.i(ActivityManagerService.TAG, "Delay finish: "
386                             + r.curComponent.flattenToShortString());
387                     r.state = BroadcastRecord.WAITING_SERVICES;
388                     return false;
389                 }
390             }
391         }
392 
393         r.curComponent = null;
394 
395         // We will process the next receiver right now if this is finishing
396         // an app receiver (which is always asynchronous) or after we have
397         // come back from calling a receiver.
398         return state == BroadcastRecord.APP_RECEIVE
399                 || state == BroadcastRecord.CALL_DONE_RECEIVE;
400     }
401 
backgroundServicesFinishedLocked(int userId)402     public void backgroundServicesFinishedLocked(int userId) {
403         if (mOrderedBroadcasts.size() > 0) {
404             BroadcastRecord br = mOrderedBroadcasts.get(0);
405             if (br.userId == userId && br.state == BroadcastRecord.WAITING_SERVICES) {
406                 Slog.i(ActivityManagerService.TAG, "Resuming delayed broadcast");
407                 br.curComponent = null;
408                 br.state = BroadcastRecord.IDLE;
409                 processNextBroadcast(false);
410             }
411         }
412     }
413 
performReceiveLocked(ProcessRecord app, IIntentReceiver receiver, Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky, int sendingUser)414     private static void performReceiveLocked(ProcessRecord app, IIntentReceiver receiver,
415             Intent intent, int resultCode, String data, Bundle extras,
416             boolean ordered, boolean sticky, int sendingUser) throws RemoteException {
417         // Send the intent to the receiver asynchronously using one-way binder calls.
418         if (app != null && app.thread != null) {
419             // If we have an app thread, do the call through that so it is
420             // correctly ordered with other one-way calls.
421             app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode,
422                     data, extras, ordered, sticky, sendingUser, app.repProcState);
423         } else {
424             receiver.performReceive(intent, resultCode, data, extras, ordered,
425                     sticky, sendingUser);
426         }
427     }
428 
deliverToRegisteredReceiverLocked(BroadcastRecord r, BroadcastFilter filter, boolean ordered)429     private final void deliverToRegisteredReceiverLocked(BroadcastRecord r,
430             BroadcastFilter filter, boolean ordered) {
431         boolean skip = false;
432         if (filter.requiredPermission != null) {
433             int perm = mService.checkComponentPermission(filter.requiredPermission,
434                     r.callingPid, r.callingUid, -1, true);
435             if (perm != PackageManager.PERMISSION_GRANTED) {
436                 Slog.w(TAG, "Permission Denial: broadcasting "
437                         + r.intent.toString()
438                         + " from " + r.callerPackage + " (pid="
439                         + r.callingPid + ", uid=" + r.callingUid + ")"
440                         + " requires " + filter.requiredPermission
441                         + " due to registered receiver " + filter);
442                 skip = true;
443             }
444         }
445         if (!skip && r.requiredPermission != null) {
446             int perm = mService.checkComponentPermission(r.requiredPermission,
447                     filter.receiverList.pid, filter.receiverList.uid, -1, true);
448             if (perm != PackageManager.PERMISSION_GRANTED) {
449                 Slog.w(TAG, "Permission Denial: receiving "
450                         + r.intent.toString()
451                         + " to " + filter.receiverList.app
452                         + " (pid=" + filter.receiverList.pid
453                         + ", uid=" + filter.receiverList.uid + ")"
454                         + " requires " + r.requiredPermission
455                         + " due to sender " + r.callerPackage
456                         + " (uid " + r.callingUid + ")");
457                 skip = true;
458             }
459         }
460         if (r.appOp != AppOpsManager.OP_NONE) {
461             int mode = mService.mAppOpsService.noteOperation(r.appOp,
462                     filter.receiverList.uid, filter.packageName);
463             if (mode != AppOpsManager.MODE_ALLOWED) {
464                 if (DEBUG_BROADCAST)  Slog.v(TAG,
465                         "App op " + r.appOp + " not allowed for broadcast to uid "
466                         + filter.receiverList.uid + " pkg " + filter.packageName);
467                 skip = true;
468             }
469         }
470         if (!skip) {
471             skip = !mService.mIntentFirewall.checkBroadcast(r.intent, r.callingUid,
472                     r.callingPid, r.resolvedType, filter.receiverList.uid);
473         }
474 
475         if (filter.receiverList.app == null || filter.receiverList.app.crashing) {
476             Slog.w(TAG, "Skipping deliver [" + mQueueName + "] " + r
477                     + " to " + filter.receiverList + ": process crashing");
478             skip = true;
479         }
480 
481         if (!skip) {
482             // If this is not being sent as an ordered broadcast, then we
483             // don't want to touch the fields that keep track of the current
484             // state of ordered broadcasts.
485             if (ordered) {
486                 r.receiver = filter.receiverList.receiver.asBinder();
487                 r.curFilter = filter;
488                 filter.receiverList.curBroadcast = r;
489                 r.state = BroadcastRecord.CALL_IN_RECEIVE;
490                 if (filter.receiverList.app != null) {
491                     // Bump hosting application to no longer be in background
492                     // scheduling class.  Note that we can't do that if there
493                     // isn't an app...  but we can only be in that case for
494                     // things that directly call the IActivityManager API, which
495                     // are already core system stuff so don't matter for this.
496                     r.curApp = filter.receiverList.app;
497                     filter.receiverList.app.curReceiver = r;
498                     mService.updateOomAdjLocked(r.curApp, true);
499                 }
500             }
501             try {
502                 if (DEBUG_BROADCAST_LIGHT) {
503                     int seq = r.intent.getIntExtra("seq", -1);
504                     Slog.i(TAG, "Delivering to " + filter
505                             + " (seq=" + seq + "): " + r);
506                 }
507                 performReceiveLocked(filter.receiverList.app, filter.receiverList.receiver,
508                     new Intent(r.intent), r.resultCode, r.resultData,
509                     r.resultExtras, r.ordered, r.initialSticky, r.userId);
510                 if (ordered) {
511                     r.state = BroadcastRecord.CALL_DONE_RECEIVE;
512                 }
513             } catch (RemoteException e) {
514                 Slog.w(TAG, "Failure sending broadcast " + r.intent, e);
515                 if (ordered) {
516                     r.receiver = null;
517                     r.curFilter = null;
518                     filter.receiverList.curBroadcast = null;
519                     if (filter.receiverList.app != null) {
520                         filter.receiverList.app.curReceiver = null;
521                     }
522                 }
523             }
524         }
525     }
526 
processNextBroadcast(boolean fromMsg)527     final void processNextBroadcast(boolean fromMsg) {
528         synchronized(mService) {
529             BroadcastRecord r;
530 
531             if (DEBUG_BROADCAST) Slog.v(TAG, "processNextBroadcast ["
532                     + mQueueName + "]: "
533                     + mParallelBroadcasts.size() + " broadcasts, "
534                     + mOrderedBroadcasts.size() + " ordered broadcasts");
535 
536             mService.updateCpuStats();
537 
538             if (fromMsg) {
539                 mBroadcastsScheduled = false;
540             }
541 
542             // First, deliver any non-serialized broadcasts right away.
543             while (mParallelBroadcasts.size() > 0) {
544                 r = mParallelBroadcasts.remove(0);
545                 r.dispatchTime = SystemClock.uptimeMillis();
546                 r.dispatchClockTime = System.currentTimeMillis();
547                 final int N = r.receivers.size();
548                 if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing parallel broadcast ["
549                         + mQueueName + "] " + r);
550                 for (int i=0; i<N; i++) {
551                     Object target = r.receivers.get(i);
552                     if (DEBUG_BROADCAST)  Slog.v(TAG,
553                             "Delivering non-ordered on [" + mQueueName + "] to registered "
554                             + target + ": " + r);
555                     deliverToRegisteredReceiverLocked(r, (BroadcastFilter)target, false);
556                 }
557                 addBroadcastToHistoryLocked(r);
558                 if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Done with parallel broadcast ["
559                         + mQueueName + "] " + r);
560             }
561 
562             // Now take care of the next serialized one...
563 
564             // If we are waiting for a process to come up to handle the next
565             // broadcast, then do nothing at this point.  Just in case, we
566             // check that the process we're waiting for still exists.
567             if (mPendingBroadcast != null) {
568                 if (DEBUG_BROADCAST_LIGHT) {
569                     Slog.v(TAG, "processNextBroadcast ["
570                             + mQueueName + "]: waiting for "
571                             + mPendingBroadcast.curApp);
572                 }
573 
574                 boolean isDead;
575                 synchronized (mService.mPidsSelfLocked) {
576                     ProcessRecord proc = mService.mPidsSelfLocked.get(mPendingBroadcast.curApp.pid);
577                     isDead = proc == null || proc.crashing;
578                 }
579                 if (!isDead) {
580                     // It's still alive, so keep waiting
581                     return;
582                 } else {
583                     Slog.w(TAG, "pending app  ["
584                             + mQueueName + "]" + mPendingBroadcast.curApp
585                             + " died before responding to broadcast");
586                     mPendingBroadcast.state = BroadcastRecord.IDLE;
587                     mPendingBroadcast.nextReceiver = mPendingBroadcastRecvIndex;
588                     mPendingBroadcast = null;
589                 }
590             }
591 
592             boolean looped = false;
593 
594             do {
595                 if (mOrderedBroadcasts.size() == 0) {
596                     // No more broadcasts pending, so all done!
597                     mService.scheduleAppGcsLocked();
598                     if (looped) {
599                         // If we had finished the last ordered broadcast, then
600                         // make sure all processes have correct oom and sched
601                         // adjustments.
602                         mService.updateOomAdjLocked();
603                     }
604                     return;
605                 }
606                 r = mOrderedBroadcasts.get(0);
607                 boolean forceReceive = false;
608 
609                 // Ensure that even if something goes awry with the timeout
610                 // detection, we catch "hung" broadcasts here, discard them,
611                 // and continue to make progress.
612                 //
613                 // This is only done if the system is ready so that PRE_BOOT_COMPLETED
614                 // receivers don't get executed with timeouts. They're intended for
615                 // one time heavy lifting after system upgrades and can take
616                 // significant amounts of time.
617                 int numReceivers = (r.receivers != null) ? r.receivers.size() : 0;
618                 if (mService.mProcessesReady && r.dispatchTime > 0) {
619                     long now = SystemClock.uptimeMillis();
620                     if ((numReceivers > 0) &&
621                             (now > r.dispatchTime + (2*mTimeoutPeriod*numReceivers))) {
622                         Slog.w(TAG, "Hung broadcast ["
623                                 + mQueueName + "] discarded after timeout failure:"
624                                 + " now=" + now
625                                 + " dispatchTime=" + r.dispatchTime
626                                 + " startTime=" + r.receiverTime
627                                 + " intent=" + r.intent
628                                 + " numReceivers=" + numReceivers
629                                 + " nextReceiver=" + r.nextReceiver
630                                 + " state=" + r.state);
631                         broadcastTimeoutLocked(false); // forcibly finish this broadcast
632                         forceReceive = true;
633                         r.state = BroadcastRecord.IDLE;
634                     }
635                 }
636 
637                 if (r.state != BroadcastRecord.IDLE) {
638                     if (DEBUG_BROADCAST) Slog.d(TAG,
639                             "processNextBroadcast("
640                             + mQueueName + ") called when not idle (state="
641                             + r.state + ")");
642                     return;
643                 }
644 
645                 if (r.receivers == null || r.nextReceiver >= numReceivers
646                         || r.resultAbort || forceReceive) {
647                     // No more receivers for this broadcast!  Send the final
648                     // result if requested...
649                     if (r.resultTo != null) {
650                         try {
651                             if (DEBUG_BROADCAST) {
652                                 int seq = r.intent.getIntExtra("seq", -1);
653                                 Slog.i(TAG, "Finishing broadcast ["
654                                         + mQueueName + "] " + r.intent.getAction()
655                                         + " seq=" + seq + " app=" + r.callerApp);
656                             }
657                             performReceiveLocked(r.callerApp, r.resultTo,
658                                 new Intent(r.intent), r.resultCode,
659                                 r.resultData, r.resultExtras, false, false, r.userId);
660                             // Set this to null so that the reference
661                             // (local and remote) isn't kept in the mBroadcastHistory.
662                             r.resultTo = null;
663                         } catch (RemoteException e) {
664                             Slog.w(TAG, "Failure ["
665                                     + mQueueName + "] sending broadcast result of "
666                                     + r.intent, e);
667                         }
668                     }
669 
670                     if (DEBUG_BROADCAST) Slog.v(TAG, "Cancelling BROADCAST_TIMEOUT_MSG");
671                     cancelBroadcastTimeoutLocked();
672 
673                     if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Finished with ordered broadcast "
674                             + r);
675 
676                     // ... and on to the next...
677                     addBroadcastToHistoryLocked(r);
678                     mOrderedBroadcasts.remove(0);
679                     r = null;
680                     looped = true;
681                     continue;
682                 }
683             } while (r == null);
684 
685             // Get the next receiver...
686             int recIdx = r.nextReceiver++;
687 
688             // Keep track of when this receiver started, and make sure there
689             // is a timeout message pending to kill it if need be.
690             r.receiverTime = SystemClock.uptimeMillis();
691             if (recIdx == 0) {
692                 r.dispatchTime = r.receiverTime;
693                 r.dispatchClockTime = System.currentTimeMillis();
694                 if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing ordered broadcast ["
695                         + mQueueName + "] " + r);
696             }
697             if (! mPendingBroadcastTimeoutMessage) {
698                 long timeoutTime = r.receiverTime + mTimeoutPeriod;
699                 if (DEBUG_BROADCAST) Slog.v(TAG,
700                         "Submitting BROADCAST_TIMEOUT_MSG ["
701                         + mQueueName + "] for " + r + " at " + timeoutTime);
702                 setBroadcastTimeoutLocked(timeoutTime);
703             }
704 
705             Object nextReceiver = r.receivers.get(recIdx);
706             if (nextReceiver instanceof BroadcastFilter) {
707                 // Simple case: this is a registered receiver who gets
708                 // a direct call.
709                 BroadcastFilter filter = (BroadcastFilter)nextReceiver;
710                 if (DEBUG_BROADCAST)  Slog.v(TAG,
711                         "Delivering ordered ["
712                         + mQueueName + "] to registered "
713                         + filter + ": " + r);
714                 deliverToRegisteredReceiverLocked(r, filter, r.ordered);
715                 if (r.receiver == null || !r.ordered) {
716                     // The receiver has already finished, so schedule to
717                     // process the next one.
718                     if (DEBUG_BROADCAST) Slog.v(TAG, "Quick finishing ["
719                             + mQueueName + "]: ordered="
720                             + r.ordered + " receiver=" + r.receiver);
721                     r.state = BroadcastRecord.IDLE;
722                     scheduleBroadcastsLocked();
723                 }
724                 return;
725             }
726 
727             // Hard case: need to instantiate the receiver, possibly
728             // starting its application process to host it.
729 
730             ResolveInfo info =
731                 (ResolveInfo)nextReceiver;
732             ComponentName component = new ComponentName(
733                     info.activityInfo.applicationInfo.packageName,
734                     info.activityInfo.name);
735 
736             boolean skip = false;
737             int perm = mService.checkComponentPermission(info.activityInfo.permission,
738                     r.callingPid, r.callingUid, info.activityInfo.applicationInfo.uid,
739                     info.activityInfo.exported);
740             if (perm != PackageManager.PERMISSION_GRANTED) {
741                 if (!info.activityInfo.exported) {
742                     Slog.w(TAG, "Permission Denial: broadcasting "
743                             + r.intent.toString()
744                             + " from " + r.callerPackage + " (pid=" + r.callingPid
745                             + ", uid=" + r.callingUid + ")"
746                             + " is not exported from uid " + info.activityInfo.applicationInfo.uid
747                             + " due to receiver " + component.flattenToShortString());
748                 } else {
749                     Slog.w(TAG, "Permission Denial: broadcasting "
750                             + r.intent.toString()
751                             + " from " + r.callerPackage + " (pid=" + r.callingPid
752                             + ", uid=" + r.callingUid + ")"
753                             + " requires " + info.activityInfo.permission
754                             + " due to receiver " + component.flattenToShortString());
755                 }
756                 skip = true;
757             }
758             if (info.activityInfo.applicationInfo.uid != Process.SYSTEM_UID &&
759                 r.requiredPermission != null) {
760                 try {
761                     perm = AppGlobals.getPackageManager().
762                             checkPermission(r.requiredPermission,
763                                     info.activityInfo.applicationInfo.packageName);
764                 } catch (RemoteException e) {
765                     perm = PackageManager.PERMISSION_DENIED;
766                 }
767                 if (perm != PackageManager.PERMISSION_GRANTED) {
768                     Slog.w(TAG, "Permission Denial: receiving "
769                             + r.intent + " to "
770                             + component.flattenToShortString()
771                             + " requires " + r.requiredPermission
772                             + " due to sender " + r.callerPackage
773                             + " (uid " + r.callingUid + ")");
774                     skip = true;
775                 }
776             }
777             if (r.appOp != AppOpsManager.OP_NONE) {
778                 int mode = mService.mAppOpsService.noteOperation(r.appOp,
779                         info.activityInfo.applicationInfo.uid, info.activityInfo.packageName);
780                 if (mode != AppOpsManager.MODE_ALLOWED) {
781                     if (DEBUG_BROADCAST)  Slog.v(TAG,
782                             "App op " + r.appOp + " not allowed for broadcast to uid "
783                             + info.activityInfo.applicationInfo.uid + " pkg "
784                             + info.activityInfo.packageName);
785                     skip = true;
786                 }
787             }
788             if (!skip) {
789                 skip = !mService.mIntentFirewall.checkBroadcast(r.intent, r.callingUid,
790                         r.callingPid, r.resolvedType, info.activityInfo.applicationInfo.uid);
791             }
792             boolean isSingleton = false;
793             try {
794                 isSingleton = mService.isSingleton(info.activityInfo.processName,
795                         info.activityInfo.applicationInfo,
796                         info.activityInfo.name, info.activityInfo.flags);
797             } catch (SecurityException e) {
798                 Slog.w(TAG, e.getMessage());
799                 skip = true;
800             }
801             if ((info.activityInfo.flags&ActivityInfo.FLAG_SINGLE_USER) != 0) {
802                 if (ActivityManager.checkUidPermission(
803                         android.Manifest.permission.INTERACT_ACROSS_USERS,
804                         info.activityInfo.applicationInfo.uid)
805                                 != PackageManager.PERMISSION_GRANTED) {
806                     Slog.w(TAG, "Permission Denial: Receiver " + component.flattenToShortString()
807                             + " requests FLAG_SINGLE_USER, but app does not hold "
808                             + android.Manifest.permission.INTERACT_ACROSS_USERS);
809                     skip = true;
810                 }
811             }
812             if (r.curApp != null && r.curApp.crashing) {
813                 // If the target process is crashing, just skip it.
814                 Slog.w(TAG, "Skipping deliver ordered [" + mQueueName + "] " + r
815                         + " to " + r.curApp + ": process crashing");
816                 skip = true;
817             }
818             if (!skip) {
819                 boolean isAvailable = false;
820                 try {
821                     isAvailable = AppGlobals.getPackageManager().isPackageAvailable(
822                             info.activityInfo.packageName,
823                             UserHandle.getUserId(info.activityInfo.applicationInfo.uid));
824                 } catch (Exception e) {
825                     // all such failures mean we skip this receiver
826                     Slog.w(TAG, "Exception getting recipient info for "
827                             + info.activityInfo.packageName, e);
828                 }
829                 if (!isAvailable) {
830                     if (DEBUG_BROADCAST) {
831                         Slog.v(TAG, "Skipping delivery to " + info.activityInfo.packageName
832                                 + " / " + info.activityInfo.applicationInfo.uid
833                                 + " : package no longer available");
834                     }
835                     skip = true;
836                 }
837             }
838 
839             if (skip) {
840                 if (DEBUG_BROADCAST)  Slog.v(TAG,
841                         "Skipping delivery of ordered ["
842                         + mQueueName + "] " + r + " for whatever reason");
843                 r.receiver = null;
844                 r.curFilter = null;
845                 r.state = BroadcastRecord.IDLE;
846                 scheduleBroadcastsLocked();
847                 return;
848             }
849 
850             r.state = BroadcastRecord.APP_RECEIVE;
851             String targetProcess = info.activityInfo.processName;
852             r.curComponent = component;
853             if (r.callingUid != Process.SYSTEM_UID && isSingleton) {
854                 info.activityInfo = mService.getActivityInfoForUser(info.activityInfo, 0);
855             }
856             r.curReceiver = info.activityInfo;
857             if (DEBUG_MU && r.callingUid > UserHandle.PER_USER_RANGE) {
858                 Slog.v(TAG_MU, "Updated broadcast record activity info for secondary user, "
859                         + info.activityInfo + ", callingUid = " + r.callingUid + ", uid = "
860                         + info.activityInfo.applicationInfo.uid);
861             }
862 
863             // Broadcast is being executed, its package can't be stopped.
864             try {
865                 AppGlobals.getPackageManager().setPackageStoppedState(
866                         r.curComponent.getPackageName(), false, UserHandle.getUserId(r.callingUid));
867             } catch (RemoteException e) {
868             } catch (IllegalArgumentException e) {
869                 Slog.w(TAG, "Failed trying to unstop package "
870                         + r.curComponent.getPackageName() + ": " + e);
871             }
872 
873             // Is this receiver's application already running?
874             ProcessRecord app = mService.getProcessRecordLocked(targetProcess,
875                     info.activityInfo.applicationInfo.uid, false);
876             if (app != null && app.thread != null) {
877                 try {
878                     app.addPackage(info.activityInfo.packageName, mService.mProcessStats);
879                     processCurBroadcastLocked(r, app);
880                     return;
881                 } catch (RemoteException e) {
882                     Slog.w(TAG, "Exception when sending broadcast to "
883                           + r.curComponent, e);
884                 } catch (RuntimeException e) {
885                     Log.wtf(TAG, "Failed sending broadcast to "
886                             + r.curComponent + " with " + r.intent, e);
887                     // If some unexpected exception happened, just skip
888                     // this broadcast.  At this point we are not in the call
889                     // from a client, so throwing an exception out from here
890                     // will crash the entire system instead of just whoever
891                     // sent the broadcast.
892                     logBroadcastReceiverDiscardLocked(r);
893                     finishReceiverLocked(r, r.resultCode, r.resultData,
894                             r.resultExtras, r.resultAbort, false);
895                     scheduleBroadcastsLocked();
896                     // We need to reset the state if we failed to start the receiver.
897                     r.state = BroadcastRecord.IDLE;
898                     return;
899                 }
900 
901                 // If a dead object exception was thrown -- fall through to
902                 // restart the application.
903             }
904 
905             // Not running -- get it started, to be executed when the app comes up.
906             if (DEBUG_BROADCAST)  Slog.v(TAG,
907                     "Need to start app ["
908                     + mQueueName + "] " + targetProcess + " for broadcast " + r);
909             if ((r.curApp=mService.startProcessLocked(targetProcess,
910                     info.activityInfo.applicationInfo, true,
911                     r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND,
912                     "broadcast", r.curComponent,
913                     (r.intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0, false, false))
914                             == null) {
915                 // Ah, this recipient is unavailable.  Finish it if necessary,
916                 // and mark the broadcast record as ready for the next.
917                 Slog.w(TAG, "Unable to launch app "
918                         + info.activityInfo.applicationInfo.packageName + "/"
919                         + info.activityInfo.applicationInfo.uid + " for broadcast "
920                         + r.intent + ": process is bad");
921                 logBroadcastReceiverDiscardLocked(r);
922                 finishReceiverLocked(r, r.resultCode, r.resultData,
923                         r.resultExtras, r.resultAbort, false);
924                 scheduleBroadcastsLocked();
925                 r.state = BroadcastRecord.IDLE;
926                 return;
927             }
928 
929             mPendingBroadcast = r;
930             mPendingBroadcastRecvIndex = recIdx;
931         }
932     }
933 
setBroadcastTimeoutLocked(long timeoutTime)934     final void setBroadcastTimeoutLocked(long timeoutTime) {
935         if (! mPendingBroadcastTimeoutMessage) {
936             Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG, this);
937             mHandler.sendMessageAtTime(msg, timeoutTime);
938             mPendingBroadcastTimeoutMessage = true;
939         }
940     }
941 
cancelBroadcastTimeoutLocked()942     final void cancelBroadcastTimeoutLocked() {
943         if (mPendingBroadcastTimeoutMessage) {
944             mHandler.removeMessages(BROADCAST_TIMEOUT_MSG, this);
945             mPendingBroadcastTimeoutMessage = false;
946         }
947     }
948 
broadcastTimeoutLocked(boolean fromMsg)949     final void broadcastTimeoutLocked(boolean fromMsg) {
950         if (fromMsg) {
951             mPendingBroadcastTimeoutMessage = false;
952         }
953 
954         if (mOrderedBroadcasts.size() == 0) {
955             return;
956         }
957 
958         long now = SystemClock.uptimeMillis();
959         BroadcastRecord r = mOrderedBroadcasts.get(0);
960         if (fromMsg) {
961             if (mService.mDidDexOpt) {
962                 // Delay timeouts until dexopt finishes.
963                 mService.mDidDexOpt = false;
964                 long timeoutTime = SystemClock.uptimeMillis() + mTimeoutPeriod;
965                 setBroadcastTimeoutLocked(timeoutTime);
966                 return;
967             }
968             if (!mService.mProcessesReady) {
969                 // Only process broadcast timeouts if the system is ready. That way
970                 // PRE_BOOT_COMPLETED broadcasts can't timeout as they are intended
971                 // to do heavy lifting for system up.
972                 return;
973             }
974 
975             long timeoutTime = r.receiverTime + mTimeoutPeriod;
976             if (timeoutTime > now) {
977                 // We can observe premature timeouts because we do not cancel and reset the
978                 // broadcast timeout message after each receiver finishes.  Instead, we set up
979                 // an initial timeout then kick it down the road a little further as needed
980                 // when it expires.
981                 if (DEBUG_BROADCAST) Slog.v(TAG,
982                         "Premature timeout ["
983                         + mQueueName + "] @ " + now + ": resetting BROADCAST_TIMEOUT_MSG for "
984                         + timeoutTime);
985                 setBroadcastTimeoutLocked(timeoutTime);
986                 return;
987             }
988         }
989 
990         BroadcastRecord br = mOrderedBroadcasts.get(0);
991         if (br.state == BroadcastRecord.WAITING_SERVICES) {
992             // In this case the broadcast had already finished, but we had decided to wait
993             // for started services to finish as well before going on.  So if we have actually
994             // waited long enough time timeout the broadcast, let's give up on the whole thing
995             // and just move on to the next.
996             Slog.i(ActivityManagerService.TAG, "Waited long enough for: " + (br.curComponent != null
997                     ? br.curComponent.flattenToShortString() : "(null)"));
998             br.curComponent = null;
999             br.state = BroadcastRecord.IDLE;
1000             processNextBroadcast(false);
1001             return;
1002         }
1003 
1004         Slog.w(TAG, "Timeout of broadcast " + r + " - receiver=" + r. receiver
1005                 + ", started " + (now - r.receiverTime) + "ms ago");
1006         r.receiverTime = now;
1007         r.anrCount++;
1008 
1009         // Current receiver has passed its expiration date.
1010         if (r.nextReceiver <= 0) {
1011             Slog.w(TAG, "Timeout on receiver with nextReceiver <= 0");
1012             return;
1013         }
1014 
1015         ProcessRecord app = null;
1016         String anrMessage = null;
1017 
1018         Object curReceiver = r.receivers.get(r.nextReceiver-1);
1019         Slog.w(TAG, "Receiver during timeout: " + curReceiver);
1020         logBroadcastReceiverDiscardLocked(r);
1021         if (curReceiver instanceof BroadcastFilter) {
1022             BroadcastFilter bf = (BroadcastFilter)curReceiver;
1023             if (bf.receiverList.pid != 0
1024                     && bf.receiverList.pid != ActivityManagerService.MY_PID) {
1025                 synchronized (mService.mPidsSelfLocked) {
1026                     app = mService.mPidsSelfLocked.get(
1027                             bf.receiverList.pid);
1028                 }
1029             }
1030         } else {
1031             app = r.curApp;
1032         }
1033 
1034         if (app != null) {
1035             anrMessage = "Broadcast of " + r.intent.toString();
1036         }
1037 
1038         if (mPendingBroadcast == r) {
1039             mPendingBroadcast = null;
1040         }
1041 
1042         // Move on to the next receiver.
1043         finishReceiverLocked(r, r.resultCode, r.resultData,
1044                 r.resultExtras, r.resultAbort, false);
1045         scheduleBroadcastsLocked();
1046 
1047         if (anrMessage != null) {
1048             // Post the ANR to the handler since we do not want to process ANRs while
1049             // potentially holding our lock.
1050             mHandler.post(new AppNotResponding(app, anrMessage));
1051         }
1052     }
1053 
addBroadcastToHistoryLocked(BroadcastRecord r)1054     private final void addBroadcastToHistoryLocked(BroadcastRecord r) {
1055         if (r.callingUid < 0) {
1056             // This was from a registerReceiver() call; ignore it.
1057             return;
1058         }
1059         System.arraycopy(mBroadcastHistory, 0, mBroadcastHistory, 1,
1060                 MAX_BROADCAST_HISTORY-1);
1061         r.finishTime = SystemClock.uptimeMillis();
1062         mBroadcastHistory[0] = r;
1063         System.arraycopy(mBroadcastSummaryHistory, 0, mBroadcastSummaryHistory, 1,
1064                 MAX_BROADCAST_SUMMARY_HISTORY-1);
1065         mBroadcastSummaryHistory[0] = r.intent;
1066     }
1067 
logBroadcastReceiverDiscardLocked(BroadcastRecord r)1068     final void logBroadcastReceiverDiscardLocked(BroadcastRecord r) {
1069         if (r.nextReceiver > 0) {
1070             Object curReceiver = r.receivers.get(r.nextReceiver-1);
1071             if (curReceiver instanceof BroadcastFilter) {
1072                 BroadcastFilter bf = (BroadcastFilter) curReceiver;
1073                 EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_FILTER,
1074                         bf.owningUserId, System.identityHashCode(r),
1075                         r.intent.getAction(),
1076                         r.nextReceiver - 1,
1077                         System.identityHashCode(bf));
1078             } else {
1079                 ResolveInfo ri = (ResolveInfo)curReceiver;
1080                 EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP,
1081                         UserHandle.getUserId(ri.activityInfo.applicationInfo.uid),
1082                         System.identityHashCode(r), r.intent.getAction(),
1083                         r.nextReceiver - 1, ri.toString());
1084             }
1085         } else {
1086             Slog.w(TAG, "Discarding broadcast before first receiver is invoked: "
1087                     + r);
1088             EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP,
1089                     -1, System.identityHashCode(r),
1090                     r.intent.getAction(),
1091                     r.nextReceiver,
1092                     "NONE");
1093         }
1094     }
1095 
dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args, int opti, boolean dumpAll, String dumpPackage, boolean needSep)1096     final boolean dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args,
1097             int opti, boolean dumpAll, String dumpPackage, boolean needSep) {
1098         if (mParallelBroadcasts.size() > 0 || mOrderedBroadcasts.size() > 0
1099                 || mPendingBroadcast != null) {
1100             boolean printed = false;
1101             for (int i=mParallelBroadcasts.size()-1; i>=0; i--) {
1102                 BroadcastRecord br = mParallelBroadcasts.get(i);
1103                 if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) {
1104                     continue;
1105                 }
1106                 if (!printed) {
1107                     if (needSep) {
1108                         pw.println();
1109                     }
1110                     needSep = true;
1111                     printed = true;
1112                     pw.println("  Active broadcasts [" + mQueueName + "]:");
1113                 }
1114                 pw.println("  Active Broadcast " + mQueueName + " #" + i + ":");
1115                 br.dump(pw, "    ");
1116             }
1117             printed = false;
1118             needSep = true;
1119             for (int i=mOrderedBroadcasts.size()-1; i>=0; i--) {
1120                 BroadcastRecord br = mOrderedBroadcasts.get(i);
1121                 if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) {
1122                     continue;
1123                 }
1124                 if (!printed) {
1125                     if (needSep) {
1126                         pw.println();
1127                     }
1128                     needSep = true;
1129                     printed = true;
1130                     pw.println("  Active ordered broadcasts [" + mQueueName + "]:");
1131                 }
1132                 pw.println("  Active Ordered Broadcast " + mQueueName + " #" + i + ":");
1133                 mOrderedBroadcasts.get(i).dump(pw, "    ");
1134             }
1135             if (dumpPackage == null || (mPendingBroadcast != null
1136                     && dumpPackage.equals(mPendingBroadcast.callerPackage))) {
1137                 if (needSep) {
1138                     pw.println();
1139                 }
1140                 pw.println("  Pending broadcast [" + mQueueName + "]:");
1141                 if (mPendingBroadcast != null) {
1142                     mPendingBroadcast.dump(pw, "    ");
1143                 } else {
1144                     pw.println("    (null)");
1145                 }
1146                 needSep = true;
1147             }
1148         }
1149 
1150         int i;
1151         boolean printed = false;
1152         for (i=0; i<MAX_BROADCAST_HISTORY; i++) {
1153             BroadcastRecord r = mBroadcastHistory[i];
1154             if (r == null) {
1155                 break;
1156             }
1157             if (dumpPackage != null && !dumpPackage.equals(r.callerPackage)) {
1158                 continue;
1159             }
1160             if (!printed) {
1161                 if (needSep) {
1162                     pw.println();
1163                 }
1164                 needSep = true;
1165                 pw.println("  Historical broadcasts [" + mQueueName + "]:");
1166                 printed = true;
1167             }
1168             if (dumpAll) {
1169                 pw.print("  Historical Broadcast " + mQueueName + " #");
1170                         pw.print(i); pw.println(":");
1171                 r.dump(pw, "    ");
1172             } else {
1173                 pw.print("  #"); pw.print(i); pw.print(": "); pw.println(r);
1174                 pw.print("    ");
1175                 pw.println(r.intent.toShortString(false, true, true, false));
1176                 if (r.targetComp != null && r.targetComp != r.intent.getComponent()) {
1177                     pw.print("    targetComp: "); pw.println(r.targetComp.toShortString());
1178                 }
1179                 Bundle bundle = r.intent.getExtras();
1180                 if (bundle != null) {
1181                     pw.print("    extras: "); pw.println(bundle.toString());
1182                 }
1183             }
1184         }
1185 
1186         if (dumpPackage == null) {
1187             if (dumpAll) {
1188                 i = 0;
1189                 printed = false;
1190             }
1191             for (; i<MAX_BROADCAST_SUMMARY_HISTORY; i++) {
1192                 Intent intent = mBroadcastSummaryHistory[i];
1193                 if (intent == null) {
1194                     break;
1195                 }
1196                 if (!printed) {
1197                     if (needSep) {
1198                         pw.println();
1199                     }
1200                     needSep = true;
1201                     pw.println("  Historical broadcasts summary [" + mQueueName + "]:");
1202                     printed = true;
1203                 }
1204                 if (!dumpAll && i >= 50) {
1205                     pw.println("  ...");
1206                     break;
1207                 }
1208                 pw.print("  #"); pw.print(i); pw.print(": ");
1209                 pw.println(intent.toShortString(false, true, true, false));
1210                 Bundle bundle = intent.getExtras();
1211                 if (bundle != null) {
1212                     pw.print("    extras: "); pw.println(bundle.toString());
1213                 }
1214             }
1215         }
1216 
1217         return needSep;
1218     }
1219 }
1220