Home | History | Annotate | Download | only in am
      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 {
    162         public BroadcastHandler(Looper looper) {
    163             super(looper, null, true);
    164         }
    165 
    166         @Override
    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 
    194         public AppNotResponding(ProcessRecord app, String annotation) {
    195             mApp = app;
    196             mAnnotation = annotation;
    197         }
    198 
    199         @Override
    200         public void run() {
    201             mService.mAppErrors.appNotResponding(mApp, null, null, false, mAnnotation);
    202         }
    203     }
    204 
    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 
    214     public boolean isPendingBroadcastProcessLocked(int pid) {
    215         return mPendingBroadcast != null && mPendingBroadcast.curApp.pid == pid;
    216     }
    217 
    218     public void enqueueParallelBroadcastLocked(BroadcastRecord r) {
    219         mParallelBroadcasts.add(r);
    220         r.enqueueClockTime = System.currentTimeMillis();
    221     }
    222 
    223     public void enqueueOrderedBroadcastLocked(BroadcastRecord r) {
    224         mOrderedBroadcasts.add(r);
    225         r.enqueueClockTime = System.currentTimeMillis();
    226     }
    227 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
   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 
   1279     final void cancelBroadcastTimeoutLocked() {
   1280         if (mPendingBroadcastTimeoutMessage) {
   1281             mHandler.removeMessages(BROADCAST_TIMEOUT_MSG, this);
   1282             mPendingBroadcastTimeoutMessage = false;
   1283         }
   1284     }
   1285 
   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 
   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 
   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 
   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 
   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 
   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