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