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