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