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