BroadcastQueue.java revision 6285a32f74890b761579b4f67afde1b08763fd0a
140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn/* 240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Copyright (C) 2012 The Android Open Source Project 340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * 440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * you may not use this file except in compliance with the License. 640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * You may obtain a copy of the License at 740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * 840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * 1040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Unless required by applicable law or agreed to in writing, software 1140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * See the License for the specific language governing permissions and 1440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * limitations under the License. 1540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 1640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 1740c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornpackage com.android.server.am; 1840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 1940c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport java.io.FileDescriptor; 2040c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport java.io.PrintWriter; 2140c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport java.util.ArrayList; 2240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 237d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.app.ActivityManager; 2440c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.app.AppGlobals; 25f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackbornimport android.app.AppOpsManager; 2640c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.ComponentName; 2740c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.IIntentReceiver; 2840c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.Intent; 297d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.content.pm.ActivityInfo; 3040c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.pm.PackageManager; 3140c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.pm.ResolveInfo; 3240c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Bundle; 3340c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Handler; 3440c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.IBinder; 3540c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Message; 3640c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Process; 3740c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.RemoteException; 3840c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.SystemClock; 39f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle; 4040c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.util.EventLog; 416c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackbornimport android.util.Log; 4240c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.util.Slog; 4340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 4440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn/** 4540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * BROADCASTS 4640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * 4740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * We keep two broadcast queues and associated bookkeeping, one for those at 4840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * foreground priority, and one for normal (background-priority) broadcasts. 4940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 50be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornpublic final class BroadcastQueue { 5140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final String TAG = "BroadcastQueue"; 5240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final String TAG_MU = ActivityManagerService.TAG_MU; 5340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final boolean DEBUG_BROADCAST = ActivityManagerService.DEBUG_BROADCAST; 5440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final boolean DEBUG_BROADCAST_LIGHT = ActivityManagerService.DEBUG_BROADCAST_LIGHT; 5540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final boolean DEBUG_MU = ActivityManagerService.DEBUG_MU; 5640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 576285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn static final int MAX_BROADCAST_HISTORY = ActivityManager.isLowRamDeviceStatic() ? 10 : 25; 586285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn static final int MAX_BROADCAST_SUMMARY_HISTORY 596285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn = ActivityManager.isLowRamDeviceStatic() ? 25 : 100; 6040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 6140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final ActivityManagerService mService; 6240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 6340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 6440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Recognizable moniker for this queue 6540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 6640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final String mQueueName; 6740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 6840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 6940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Timeout period for this queue's broadcasts 7040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 7140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final long mTimeoutPeriod; 7240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 7340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 746285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn * If true, we can delay broadcasts while waiting services to finish in the previous 756285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn * receiver's process. 766285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn */ 776285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn final boolean mDelayBehindServices; 786285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn 796285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn /** 8040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Lists of all active broadcasts that are to be executed immediately 8140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * (without waiting for another broadcast to finish). Currently this only 8240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * contains broadcasts to registered receivers, to avoid spinning up 8340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * a bunch of processes to execute IntentReceiver components. Background- 8440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * and foreground-priority broadcasts are queued separately. 8540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 866285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn final ArrayList<BroadcastRecord> mParallelBroadcasts = new ArrayList<BroadcastRecord>(); 876285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn 8840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 8940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * List of all active broadcasts that are to be executed one at a time. 9040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * The object at the top of the list is the currently activity broadcasts; 9140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * those after it are waiting for the top to finish. As with parallel 9240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * broadcasts, separate background- and foreground-priority queues are 9340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * maintained. 9440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 956285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn final ArrayList<BroadcastRecord> mOrderedBroadcasts = new ArrayList<BroadcastRecord>(); 9640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 9740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 9840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Historical data of past broadcasts, for debugging. 9940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 1006285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn final BroadcastRecord[] mBroadcastHistory = new BroadcastRecord[MAX_BROADCAST_HISTORY]; 10140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 10240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 103c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn * Summary of historical data of past broadcasts, for debugging. 104c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn */ 1056285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn final Intent[] mBroadcastSummaryHistory = new Intent[MAX_BROADCAST_SUMMARY_HISTORY]; 106c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn 107c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn /** 10840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Set when we current have a BROADCAST_INTENT_MSG in flight. 10940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 11040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean mBroadcastsScheduled = false; 11140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 11240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 11340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * True if we have a pending unexpired BROADCAST_TIMEOUT_MSG posted to our handler. 11440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 11540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean mPendingBroadcastTimeoutMessage; 11640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 11740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 11840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Intent broadcasts that we have tried to start, but are 11940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * waiting for the application's process to be created. We only 12040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * need one per scheduling class (instead of a list) because we always 12140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * process broadcasts one at a time, so no others can be started while 12240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * waiting for this one. 12340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 12440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord mPendingBroadcast = null; 12540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 12640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 12740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * The receiver index that is pending, to restart the broadcast if needed. 12840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 12940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int mPendingBroadcastRecvIndex; 13040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 13140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final int BROADCAST_INTENT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG; 13240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final int BROADCAST_TIMEOUT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG + 1; 13340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 13440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final Handler mHandler = new Handler() { 13540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public void handleMessage(Message msg) { 13640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn switch (msg.what) { 13740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn case BROADCAST_INTENT_MSG: { 13840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v( 13940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn TAG, "Received BROADCAST_INTENT_MSG"); 14040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn processNextBroadcast(true); 14140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } break; 14240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn case BROADCAST_TIMEOUT_MSG: { 14340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn synchronized (mService) { 14440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn broadcastTimeoutLocked(true); 14540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 14640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } break; 14740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 14840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 14940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn }; 15040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 15140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn private final class AppNotResponding implements Runnable { 15240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn private final ProcessRecord mApp; 15340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn private final String mAnnotation; 15440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 15540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public AppNotResponding(ProcessRecord app, String annotation) { 15640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mApp = app; 15740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mAnnotation = annotation; 15840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 15940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 16040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn @Override 16140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public void run() { 1625fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn mService.appNotResponding(mApp, null, null, false, mAnnotation); 16340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 16440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 16540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 1666285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn BroadcastQueue(ActivityManagerService service, String name, long timeoutPeriod, 1676285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn boolean allowDelayBehindServices) { 16840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService = service; 16940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mQueueName = name; 17040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mTimeoutPeriod = timeoutPeriod; 1716285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn mDelayBehindServices = allowDelayBehindServices; 17240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 17340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 17440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public boolean isPendingBroadcastProcessLocked(int pid) { 17540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return mPendingBroadcast != null && mPendingBroadcast.curApp.pid == pid; 17640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 17740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 17840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public void enqueueParallelBroadcastLocked(BroadcastRecord r) { 17940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mParallelBroadcasts.add(r); 18040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 18140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 18240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public void enqueueOrderedBroadcastLocked(BroadcastRecord r) { 18340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mOrderedBroadcasts.add(r); 18440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 18540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 18640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public final boolean replaceParallelBroadcastLocked(BroadcastRecord r) { 18740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn for (int i=mParallelBroadcasts.size()-1; i>=0; i--) { 18840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.intent.filterEquals(mParallelBroadcasts.get(i).intent)) { 18940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 19040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "***** DROPPING PARALLEL [" 19140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "]: " + r.intent); 19240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mParallelBroadcasts.set(i, r); 19340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return true; 19440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 19540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 19640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return false; 19740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 19840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 19940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public final boolean replaceOrderedBroadcastLocked(BroadcastRecord r) { 20040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn for (int i=mOrderedBroadcasts.size()-1; i>0; i--) { 20140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.intent.filterEquals(mOrderedBroadcasts.get(i).intent)) { 20240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 20340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "***** DROPPING ORDERED [" 20440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "]: " + r.intent); 20540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mOrderedBroadcasts.set(i, r); 20640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return true; 20740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 20840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 20940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return false; 21040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 21140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 21240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn private final void processCurBroadcastLocked(BroadcastRecord r, 21340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn ProcessRecord app) throws RemoteException { 21440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 21540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Process cur broadcast " + r + " for app " + app); 21640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (app.thread == null) { 21740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn throw new RemoteException(); 21840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 21940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiver = app.thread.asBinder(); 22040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curApp = app; 22140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn app.curReceiver = r; 222a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_RECEIVER); 223b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn mService.updateLruProcessLocked(app, true); 22440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 22540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Tell the application to launch this receiver. 22640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.intent.setComponent(r.curComponent); 22740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 22840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean started = false; 22940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn try { 23040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, 23140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Delivering to component " + r.curComponent 23240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + ": " + r); 23340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 23440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn app.thread.scheduleReceiver(new Intent(r.intent), r.curReceiver, 23540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.compatibilityInfoForPackageLocked(r.curReceiver.applicationInfo), 236a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn r.resultCode, r.resultData, r.resultExtras, r.ordered, r.userId, 237a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn app.repProcState); 23840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 23940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Process cur broadcast " + r + " DELIVERED for app " + app); 24040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn started = true; 24140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } finally { 24240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!started) { 24340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 24440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Process cur broadcast " + r + ": NOT STARTED!"); 24540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiver = null; 24640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curApp = null; 24740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn app.curReceiver = null; 24840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 24940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 25040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 25140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 25240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public boolean sendPendingBroadcastsLocked(ProcessRecord app) { 25340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean didSomething = false; 25440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final BroadcastRecord br = mPendingBroadcast; 25540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (br != null && br.curApp.pid == app.pid) { 25640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn try { 25740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast = null; 25840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn processCurBroadcastLocked(br, app); 25940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn didSomething = true; 26040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } catch (Exception e) { 26140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Exception in new application when starting receiver " 26240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + br.curComponent.flattenToShortString(), e); 26340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn logBroadcastReceiverDiscardLocked(br); 26440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn finishReceiverLocked(br, br.resultCode, br.resultData, 2656285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn br.resultExtras, br.resultAbort, false); 26640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn scheduleBroadcastsLocked(); 2677d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn // We need to reset the state if we failed to start the receiver. 26840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn br.state = BroadcastRecord.IDLE; 26940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn throw new RuntimeException(e.getMessage()); 27040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 27140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 27240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return didSomething; 27340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 27440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 27540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public void skipPendingBroadcastLocked(int pid) { 27640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final BroadcastRecord br = mPendingBroadcast; 27740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (br != null && br.curApp.pid == pid) { 27840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn br.state = BroadcastRecord.IDLE; 27940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn br.nextReceiver = mPendingBroadcastRecvIndex; 28040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast = null; 28140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn scheduleBroadcastsLocked(); 28240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 28340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 28440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 28540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public void skipCurrentReceiverLocked(ProcessRecord app) { 28640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean reschedule = false; 28740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord r = app.curReceiver; 28840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r != null) { 28940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // The current broadcast is waiting for this app's receiver 29040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // to be finished. Looks like that's not going to happen, so 29140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // let the broadcast continue. 29240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn logBroadcastReceiverDiscardLocked(r); 29340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn finishReceiverLocked(r, r.resultCode, r.resultData, 2946285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn r.resultExtras, r.resultAbort, false); 29540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn reschedule = true; 29640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 29740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 29840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r = mPendingBroadcast; 29940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r != null && r.curApp == app) { 30040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 30140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "[" + mQueueName + "] skip & discard pending app " + r); 30240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn logBroadcastReceiverDiscardLocked(r); 30340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn finishReceiverLocked(r, r.resultCode, r.resultData, 3046285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn r.resultExtras, r.resultAbort, false); 30540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn reschedule = true; 30640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 30740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (reschedule) { 30840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn scheduleBroadcastsLocked(); 30940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 31040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 31140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 31240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public void scheduleBroadcastsLocked() { 31340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, "Schedule broadcasts [" 31440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "]: current=" 31540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mBroadcastsScheduled); 31640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 31740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mBroadcastsScheduled) { 31840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 31940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 32040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mHandler.sendMessage(mHandler.obtainMessage(BROADCAST_INTENT_MSG, this)); 32140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mBroadcastsScheduled = true; 32240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 32340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 32440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public BroadcastRecord getMatchingOrderedReceiver(IBinder receiver) { 32540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mOrderedBroadcasts.size() > 0) { 32640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final BroadcastRecord r = mOrderedBroadcasts.get(0); 32740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r != null && r.receiver == receiver) { 32840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return r; 32940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 33040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 33140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return null; 33240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 33340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 33440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public boolean finishReceiverLocked(BroadcastRecord r, int resultCode, 3356285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices) { 3366285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn final int state = r.state; 33740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.IDLE; 33840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (state == BroadcastRecord.IDLE) { 3396285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn Slog.w(TAG, "finishReceiver [" + mQueueName + "] called but state is IDLE"); 34040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 34140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiver = null; 34240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.intent.setComponent(null); 34340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.curApp != null) { 34440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curApp.curReceiver = null; 34540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 34640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.curFilter != null) { 34740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curFilter.receiverList.curBroadcast = null; 34840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 34940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curFilter = null; 35040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curReceiver = null; 3516285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn r.curApp = null; 35240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast = null; 35340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 35440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultCode = resultCode; 35540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultData = resultData; 35640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultExtras = resultExtras; 3576285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn if (resultAbort && (r.intent.getFlags()&Intent.FLAG_RECEIVER_NO_ABORT) == 0) { 3586285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn r.resultAbort = resultAbort; 3596285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn } else { 3606285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn r.resultAbort = false; 3616285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn } 3626285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn 3636285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn if (waitForServices && r.curComponent != null && r.queue.mDelayBehindServices 3646285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn && r.queue.mOrderedBroadcasts.size() > 0 3656285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn && r.queue.mOrderedBroadcasts.get(0) == r) { 3666285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn // In this case, we are ready to process the next receiver for the current broadcast, 3676285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn // but are on a queue that would like to wait for services to finish before moving 3686285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn // on. If there are background services currently starting, then we will go into a 3696285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn // special state where we hold off on continuing this broadcast until they are done. 3706285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn if (mService.mServices.hasBackgroundServices(r.userId)) { 3716285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn Slog.i(ActivityManagerService.TAG, "Delay finish: " 3726285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn + r.curComponent.flattenToShortString()); 3736285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn r.state = BroadcastRecord.WAITING_SERVICES; 3746285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn return false; 3756285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn } 3766285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn } 3776285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn 3786285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn r.curComponent = null; 37940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 38040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // We will process the next receiver right now if this is finishing 38140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // an app receiver (which is always asynchronous) or after we have 38240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // come back from calling a receiver. 38340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return state == BroadcastRecord.APP_RECEIVE 38440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn || state == BroadcastRecord.CALL_DONE_RECEIVE; 38540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 38640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 3876285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn public void backgroundServicesFinishedLocked(int userId) { 3886285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn if (mOrderedBroadcasts.size() > 0) { 3896285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn BroadcastRecord br = mOrderedBroadcasts.get(0); 3906285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn if (br.userId == userId && br.state == BroadcastRecord.WAITING_SERVICES) { 3916285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn Slog.i(ActivityManagerService.TAG, "Resuming delayed broadcast"); 3926285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn br.curComponent = null; 3936285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn br.state = BroadcastRecord.IDLE; 3946285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn processNextBroadcast(false); 3956285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn } 3966285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn } 3976285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn } 3986285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn 39940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn private static void performReceiveLocked(ProcessRecord app, IIntentReceiver receiver, 40040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Intent intent, int resultCode, String data, Bundle extras, 40120e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn boolean ordered, boolean sticky, int sendingUser) throws RemoteException { 40240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Send the intent to the receiver asynchronously using one-way binder calls. 40340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (app != null && app.thread != null) { 40440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // If we have an app thread, do the call through that so it is 40540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // correctly ordered with other one-way calls. 40640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode, 407a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn data, extras, ordered, sticky, sendingUser, app.repProcState); 40840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 40920e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn receiver.performReceive(intent, resultCode, data, extras, ordered, 41020e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn sticky, sendingUser); 41140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 41240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 41340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 41440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn private final void deliverToRegisteredReceiverLocked(BroadcastRecord r, 41540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastFilter filter, boolean ordered) { 41640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean skip = false; 4178bf06edac2088ad100e67dcb00a46d3f0f95c126Amith Yamasani if (filter.requiredPermission != null) { 41840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int perm = mService.checkComponentPermission(filter.requiredPermission, 41940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.callingPid, r.callingUid, -1, true); 42040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (perm != PackageManager.PERMISSION_GRANTED) { 42140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Permission Denial: broadcasting " 42240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.intent.toString() 42340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " from " + r.callerPackage + " (pid=" 42440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.callingPid + ", uid=" + r.callingUid + ")" 42540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " requires " + filter.requiredPermission 42640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " due to registered receiver " + filter); 42740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn skip = true; 42840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 42940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 430b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn if (!skip && r.requiredPermission != null) { 43140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int perm = mService.checkComponentPermission(r.requiredPermission, 43240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn filter.receiverList.pid, filter.receiverList.uid, -1, true); 43340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (perm != PackageManager.PERMISSION_GRANTED) { 43440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Permission Denial: receiving " 43540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.intent.toString() 43640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " to " + filter.receiverList.app 43740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " (pid=" + filter.receiverList.pid 43840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + ", uid=" + filter.receiverList.uid + ")" 43940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " requires " + r.requiredPermission 44040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " due to sender " + r.callerPackage 44140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " (uid " + r.callingUid + ")"); 44240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn skip = true; 44340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 44440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 445f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn if (r.appOp != AppOpsManager.OP_NONE) { 4461304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn int mode = mService.mAppOpsService.noteOperation(r.appOp, 447f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn filter.receiverList.uid, filter.packageName); 448f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn if (mode != AppOpsManager.MODE_ALLOWED) { 449f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 450f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "App op " + r.appOp + " not allowed for broadcast to uid " 451f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn + filter.receiverList.uid + " pkg " + filter.packageName); 452f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn skip = true; 453f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn } 454f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn } 45549660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver if (!skip) { 45649660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver skip = !mService.mIntentFirewall.checkBroadcast(r.intent, r.callingUid, 45749660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver r.callingPid, r.resolvedType, filter.receiverList.uid); 45849660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver } 45940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 46040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!skip) { 46140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // If this is not being sent as an ordered broadcast, then we 46240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // don't want to touch the fields that keep track of the current 46340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // state of ordered broadcasts. 46440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (ordered) { 46540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiver = filter.receiverList.receiver.asBinder(); 46640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curFilter = filter; 46740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn filter.receiverList.curBroadcast = r; 46840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.CALL_IN_RECEIVE; 46940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (filter.receiverList.app != null) { 47040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Bump hosting application to no longer be in background 47140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // scheduling class. Note that we can't do that if there 47240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // isn't an app... but we can only be in that case for 47340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // things that directly call the IActivityManager API, which 47440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // are already core system stuff so don't matter for this. 47540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curApp = filter.receiverList.app; 47640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn filter.receiverList.app.curReceiver = r; 477a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn mService.updateOomAdjLocked(r.curApp, true); 47840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 47940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 48040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn try { 48140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST_LIGHT) { 48240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int seq = r.intent.getIntExtra("seq", -1); 48340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.i(TAG, "Delivering to " + filter 48440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " (seq=" + seq + "): " + r); 48540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 48640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn performReceiveLocked(filter.receiverList.app, filter.receiverList.receiver, 48720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn new Intent(r.intent), r.resultCode, r.resultData, 48820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn r.resultExtras, r.ordered, r.initialSticky, r.userId); 48940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (ordered) { 49040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.CALL_DONE_RECEIVE; 49140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 49240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } catch (RemoteException e) { 49340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Failure sending broadcast " + r.intent, e); 49440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (ordered) { 49540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiver = null; 49640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curFilter = null; 49740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn filter.receiverList.curBroadcast = null; 49840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (filter.receiverList.app != null) { 49940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn filter.receiverList.app.curReceiver = null; 50040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 50140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 50240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 50340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 50440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 50540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 50640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final void processNextBroadcast(boolean fromMsg) { 50740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn synchronized(mService) { 50840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord r; 50940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 51040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, "processNextBroadcast [" 51140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "]: " 51240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mParallelBroadcasts.size() + " broadcasts, " 51340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mOrderedBroadcasts.size() + " ordered broadcasts"); 51440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 51540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.updateCpuStats(); 51640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 51740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (fromMsg) { 51840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mBroadcastsScheduled = false; 51940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 52040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 52140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // First, deliver any non-serialized broadcasts right away. 52240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn while (mParallelBroadcasts.size() > 0) { 52340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r = mParallelBroadcasts.remove(0); 52440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.dispatchTime = SystemClock.uptimeMillis(); 52540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.dispatchClockTime = System.currentTimeMillis(); 52640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final int N = r.receivers.size(); 52740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing parallel broadcast [" 52840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] " + r); 52940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn for (int i=0; i<N; i++) { 53040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Object target = r.receivers.get(i); 53140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 53240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Delivering non-ordered on [" + mQueueName + "] to registered " 53340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + target + ": " + r); 53440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn deliverToRegisteredReceiverLocked(r, (BroadcastFilter)target, false); 53540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 53640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn addBroadcastToHistoryLocked(r); 53740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Done with parallel broadcast [" 53840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] " + r); 53940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 54040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 54140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Now take care of the next serialized one... 54240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 54340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // If we are waiting for a process to come up to handle the next 54440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // broadcast, then do nothing at this point. Just in case, we 54540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // check that the process we're waiting for still exists. 54640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mPendingBroadcast != null) { 54740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST_LIGHT) { 54840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.v(TAG, "processNextBroadcast [" 54940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "]: waiting for " 55040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mPendingBroadcast.curApp); 55140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 55240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 55340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean isDead; 55440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn synchronized (mService.mPidsSelfLocked) { 55540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn isDead = (mService.mPidsSelfLocked.get( 55640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast.curApp.pid) == null); 55740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 55840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!isDead) { 55940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // It's still alive, so keep waiting 56040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 56140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 56240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "pending app [" 56340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "]" + mPendingBroadcast.curApp 56440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " died before responding to broadcast"); 56540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast.state = BroadcastRecord.IDLE; 56640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast.nextReceiver = mPendingBroadcastRecvIndex; 56740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast = null; 56840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 56940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 57040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 57140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean looped = false; 57240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 57340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn do { 57440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mOrderedBroadcasts.size() == 0) { 57540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // No more broadcasts pending, so all done! 57640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.scheduleAppGcsLocked(); 57740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (looped) { 57840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // If we had finished the last ordered broadcast, then 57940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // make sure all processes have correct oom and sched 58040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // adjustments. 58140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.updateOomAdjLocked(); 58240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 58340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 58440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 58540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r = mOrderedBroadcasts.get(0); 58640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean forceReceive = false; 58740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 58840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Ensure that even if something goes awry with the timeout 58940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // detection, we catch "hung" broadcasts here, discard them, 59040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // and continue to make progress. 59140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // 59240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // This is only done if the system is ready so that PRE_BOOT_COMPLETED 59340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // receivers don't get executed with timeouts. They're intended for 59440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // one time heavy lifting after system upgrades and can take 59540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // significant amounts of time. 59640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int numReceivers = (r.receivers != null) ? r.receivers.size() : 0; 59740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mService.mProcessesReady && r.dispatchTime > 0) { 59840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn long now = SystemClock.uptimeMillis(); 59940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if ((numReceivers > 0) && 60040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn (now > r.dispatchTime + (2*mTimeoutPeriod*numReceivers))) { 60140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Hung broadcast [" 60240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] discarded after timeout failure:" 60340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " now=" + now 60440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " dispatchTime=" + r.dispatchTime 60540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " startTime=" + r.receiverTime 60640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " intent=" + r.intent 60740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " numReceivers=" + numReceivers 60840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " nextReceiver=" + r.nextReceiver 60940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " state=" + r.state); 61040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn broadcastTimeoutLocked(false); // forcibly finish this broadcast 61140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn forceReceive = true; 61240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.IDLE; 61340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 61440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 61540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 61640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.state != BroadcastRecord.IDLE) { 61740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.d(TAG, 61840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "processNextBroadcast(" 61940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + ") called when not idle (state=" 62040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.state + ")"); 62140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 62240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 62340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 62440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.receivers == null || r.nextReceiver >= numReceivers 62540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn || r.resultAbort || forceReceive) { 62640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // No more receivers for this broadcast! Send the final 62740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // result if requested... 62840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.resultTo != null) { 62940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn try { 63040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) { 63140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int seq = r.intent.getIntExtra("seq", -1); 63240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.i(TAG, "Finishing broadcast [" 63340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] " + r.intent.getAction() 63440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " seq=" + seq + " app=" + r.callerApp); 63540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 63640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn performReceiveLocked(r.callerApp, r.resultTo, 63740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn new Intent(r.intent), r.resultCode, 63820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn r.resultData, r.resultExtras, false, false, r.userId); 63940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Set this to null so that the reference 64040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // (local and remote) isnt kept in the mBroadcastHistory. 64140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultTo = null; 64240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } catch (RemoteException e) { 64340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Failure [" 64440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] sending broadcast result of " 64540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.intent, e); 64640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 64740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 64840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 64940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, "Cancelling BROADCAST_TIMEOUT_MSG"); 65040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn cancelBroadcastTimeoutLocked(); 65140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 65240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Finished with ordered broadcast " 65340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r); 65440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 65540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // ... and on to the next... 65640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn addBroadcastToHistoryLocked(r); 65740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mOrderedBroadcasts.remove(0); 65840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r = null; 65940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn looped = true; 66040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn continue; 66140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 66240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } while (r == null); 66340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 66440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Get the next receiver... 66540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int recIdx = r.nextReceiver++; 66640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 66740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Keep track of when this receiver started, and make sure there 66840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // is a timeout message pending to kill it if need be. 66940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiverTime = SystemClock.uptimeMillis(); 67040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (recIdx == 0) { 67140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.dispatchTime = r.receiverTime; 67240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.dispatchClockTime = System.currentTimeMillis(); 67340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing ordered broadcast [" 67440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] " + r); 67540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 67640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (! mPendingBroadcastTimeoutMessage) { 67740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn long timeoutTime = r.receiverTime + mTimeoutPeriod; 67840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 67940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Submitting BROADCAST_TIMEOUT_MSG [" 68040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] for " + r + " at " + timeoutTime); 68140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn setBroadcastTimeoutLocked(timeoutTime); 68240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 68340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 68440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Object nextReceiver = r.receivers.get(recIdx); 68540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (nextReceiver instanceof BroadcastFilter) { 68640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Simple case: this is a registered receiver who gets 68740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // a direct call. 68840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastFilter filter = (BroadcastFilter)nextReceiver; 68940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 69040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Delivering ordered [" 69140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] to registered " 69240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + filter + ": " + r); 69340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn deliverToRegisteredReceiverLocked(r, filter, r.ordered); 69440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.receiver == null || !r.ordered) { 69540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // The receiver has already finished, so schedule to 69640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // process the next one. 69740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, "Quick finishing [" 69840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "]: ordered=" 69940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.ordered + " receiver=" + r.receiver); 70040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.IDLE; 70140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn scheduleBroadcastsLocked(); 70240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 70340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 70440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 70540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 70640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Hard case: need to instantiate the receiver, possibly 70740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // starting its application process to host it. 70840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 70940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn ResolveInfo info = 71040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn (ResolveInfo)nextReceiver; 7117d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn ComponentName component = new ComponentName( 7127d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn info.activityInfo.applicationInfo.packageName, 7137d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn info.activityInfo.name); 71440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 71540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean skip = false; 71640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int perm = mService.checkComponentPermission(info.activityInfo.permission, 71740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.callingPid, r.callingUid, info.activityInfo.applicationInfo.uid, 71840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn info.activityInfo.exported); 71940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (perm != PackageManager.PERMISSION_GRANTED) { 72040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!info.activityInfo.exported) { 72140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Permission Denial: broadcasting " 72240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.intent.toString() 72340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " from " + r.callerPackage + " (pid=" + r.callingPid 72440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + ", uid=" + r.callingUid + ")" 72540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " is not exported from uid " + info.activityInfo.applicationInfo.uid 7267d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn + " due to receiver " + component.flattenToShortString()); 72740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 72840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Permission Denial: broadcasting " 72940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.intent.toString() 73040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " from " + r.callerPackage + " (pid=" + r.callingPid 73140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + ", uid=" + r.callingUid + ")" 73240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " requires " + info.activityInfo.permission 7337d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn + " due to receiver " + component.flattenToShortString()); 73440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 73540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn skip = true; 73640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 73740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (info.activityInfo.applicationInfo.uid != Process.SYSTEM_UID && 73840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.requiredPermission != null) { 73940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn try { 74040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn perm = AppGlobals.getPackageManager(). 74140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn checkPermission(r.requiredPermission, 74240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn info.activityInfo.applicationInfo.packageName); 74340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } catch (RemoteException e) { 74440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn perm = PackageManager.PERMISSION_DENIED; 74540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 74640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (perm != PackageManager.PERMISSION_GRANTED) { 74740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Permission Denial: receiving " 74840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.intent + " to " 7497d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn + component.flattenToShortString() 75040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " requires " + r.requiredPermission 75140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " due to sender " + r.callerPackage 75240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " (uid " + r.callingUid + ")"); 75340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn skip = true; 75440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 75540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 756f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn if (r.appOp != AppOpsManager.OP_NONE) { 7571304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn int mode = mService.mAppOpsService.noteOperation(r.appOp, 758f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn info.activityInfo.applicationInfo.uid, info.activityInfo.packageName); 759f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn if (mode != AppOpsManager.MODE_ALLOWED) { 760f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 761f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "App op " + r.appOp + " not allowed for broadcast to uid " 762f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn + info.activityInfo.applicationInfo.uid + " pkg " 763f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn + info.activityInfo.packageName); 764f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn skip = true; 765f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn } 766f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn } 76749660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver if (!skip) { 76849660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver skip = !mService.mIntentFirewall.checkBroadcast(r.intent, r.callingUid, 76949660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver r.callingPid, r.resolvedType, info.activityInfo.applicationInfo.uid); 77049660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver } 7717d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn boolean isSingleton = false; 7727d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn try { 7737d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn isSingleton = mService.isSingleton(info.activityInfo.processName, 7747d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn info.activityInfo.applicationInfo, 7757d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn info.activityInfo.name, info.activityInfo.flags); 7767d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } catch (SecurityException e) { 7777d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Slog.w(TAG, e.getMessage()); 7787d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn skip = true; 7797d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 7807d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if ((info.activityInfo.flags&ActivityInfo.FLAG_SINGLE_USER) != 0) { 7817d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (ActivityManager.checkUidPermission( 7827d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn android.Manifest.permission.INTERACT_ACROSS_USERS, 7837d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn info.activityInfo.applicationInfo.uid) 7847d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn != PackageManager.PERMISSION_GRANTED) { 7857d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Slog.w(TAG, "Permission Denial: Receiver " + component.flattenToShortString() 7867d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn + " requests FLAG_SINGLE_USER, but app does not hold " 7877d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn + android.Manifest.permission.INTERACT_ACROSS_USERS); 7887d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn skip = true; 7897d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 7907d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 79140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.curApp != null && r.curApp.crashing) { 79240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // If the target process is crashing, just skip it. 79340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 79440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Skipping deliver ordered [" 79540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] " + r + " to " + r.curApp 79640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + ": process crashing"); 79740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn skip = true; 79840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 79940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 80040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (skip) { 80140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 80240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Skipping delivery of ordered [" 80340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] " + r + " for whatever reason"); 80440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiver = null; 80540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curFilter = null; 80640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.IDLE; 80740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn scheduleBroadcastsLocked(); 80840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 80940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 81040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 81140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.APP_RECEIVE; 81240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn String targetProcess = info.activityInfo.processName; 8137d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn r.curComponent = component; 8147d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (r.callingUid != Process.SYSTEM_UID && isSingleton) { 8157d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn info.activityInfo = mService.getActivityInfoForUser(info.activityInfo, 0); 81640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 81740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curReceiver = info.activityInfo; 818f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn if (DEBUG_MU && r.callingUid > UserHandle.PER_USER_RANGE) { 81940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.v(TAG_MU, "Updated broadcast record activity info for secondary user, " 82040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + info.activityInfo + ", callingUid = " + r.callingUid + ", uid = " 82140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + info.activityInfo.applicationInfo.uid); 82240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 82340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 82440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Broadcast is being executed, its package can't be stopped. 82540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn try { 82640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn AppGlobals.getPackageManager().setPackageStoppedState( 827f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn r.curComponent.getPackageName(), false, UserHandle.getUserId(r.callingUid)); 82840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } catch (RemoteException e) { 82940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } catch (IllegalArgumentException e) { 83040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Failed trying to unstop package " 83140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.curComponent.getPackageName() + ": " + e); 83240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 83340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 83440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Is this receiver's application already running? 83540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn ProcessRecord app = mService.getProcessRecordLocked(targetProcess, 83640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn info.activityInfo.applicationInfo.uid); 83740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (app != null && app.thread != null) { 83840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn try { 839d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn app.addPackage(info.activityInfo.packageName, mService.mProcessStats); 84040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn processCurBroadcastLocked(r, app); 84140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 84240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } catch (RemoteException e) { 84340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Exception when sending broadcast to " 84440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.curComponent, e); 8456c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn } catch (RuntimeException e) { 8466c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn Log.wtf(TAG, "Failed sending broadcast to " 8476c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn + r.curComponent + " with " + r.intent, e); 8486c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn // If some unexpected exception happened, just skip 8496c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn // this broadcast. At this point we are not in the call 8506c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn // from a client, so throwing an exception out from here 8516c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn // will crash the entire system instead of just whoever 8526c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn // sent the broadcast. 8536c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn logBroadcastReceiverDiscardLocked(r); 8546c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn finishReceiverLocked(r, r.resultCode, r.resultData, 8556285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn r.resultExtras, r.resultAbort, false); 8566c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn scheduleBroadcastsLocked(); 8576c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn // We need to reset the state if we failed to start the receiver. 8586c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn r.state = BroadcastRecord.IDLE; 8596c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn return; 86040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 86140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 86240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // If a dead object exception was thrown -- fall through to 86340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // restart the application. 86440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 86540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 86640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Not running -- get it started, to be executed when the app comes up. 86740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 86840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Need to start app [" 86940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] " + targetProcess + " for broadcast " + r); 87040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if ((r.curApp=mService.startProcessLocked(targetProcess, 87140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn info.activityInfo.applicationInfo, true, 87240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND, 87340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "broadcast", r.curComponent, 87440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn (r.intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0, false)) 87540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn == null) { 87640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Ah, this recipient is unavailable. Finish it if necessary, 87740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // and mark the broadcast record as ready for the next. 87840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Unable to launch app " 87940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + info.activityInfo.applicationInfo.packageName + "/" 88040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + info.activityInfo.applicationInfo.uid + " for broadcast " 88140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.intent + ": process is bad"); 88240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn logBroadcastReceiverDiscardLocked(r); 88340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn finishReceiverLocked(r, r.resultCode, r.resultData, 8846285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn r.resultExtras, r.resultAbort, false); 88540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn scheduleBroadcastsLocked(); 88640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.IDLE; 88740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 88840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 88940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 89040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast = r; 89140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcastRecvIndex = recIdx; 89240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 89340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 89440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 89540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final void setBroadcastTimeoutLocked(long timeoutTime) { 89640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (! mPendingBroadcastTimeoutMessage) { 89740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG, this); 89840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mHandler.sendMessageAtTime(msg, timeoutTime); 89940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcastTimeoutMessage = true; 90040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 90140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 90240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 90340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final void cancelBroadcastTimeoutLocked() { 90440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mPendingBroadcastTimeoutMessage) { 90540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mHandler.removeMessages(BROADCAST_TIMEOUT_MSG, this); 90640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcastTimeoutMessage = false; 90740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 90840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 90940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 91040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final void broadcastTimeoutLocked(boolean fromMsg) { 91140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (fromMsg) { 91240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcastTimeoutMessage = false; 91340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 91440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 91540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mOrderedBroadcasts.size() == 0) { 91640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 91740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 91840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 91940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn long now = SystemClock.uptimeMillis(); 92040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord r = mOrderedBroadcasts.get(0); 92140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (fromMsg) { 92240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mService.mDidDexOpt) { 92340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Delay timeouts until dexopt finishes. 92440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.mDidDexOpt = false; 92540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn long timeoutTime = SystemClock.uptimeMillis() + mTimeoutPeriod; 92640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn setBroadcastTimeoutLocked(timeoutTime); 92740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 92840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 92940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!mService.mProcessesReady) { 93040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Only process broadcast timeouts if the system is ready. That way 93140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // PRE_BOOT_COMPLETED broadcasts can't timeout as they are intended 93240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // to do heavy lifting for system up. 93340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 93440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 93540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 93640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn long timeoutTime = r.receiverTime + mTimeoutPeriod; 93740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (timeoutTime > now) { 93840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // We can observe premature timeouts because we do not cancel and reset the 93940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // broadcast timeout message after each receiver finishes. Instead, we set up 94040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // an initial timeout then kick it down the road a little further as needed 94140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // when it expires. 94240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 94340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Premature timeout [" 94440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] @ " + now + ": resetting BROADCAST_TIMEOUT_MSG for " 94540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + timeoutTime); 94640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn setBroadcastTimeoutLocked(timeoutTime); 94740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 94840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 94940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 95040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 9516285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn BroadcastRecord br = mOrderedBroadcasts.get(0); 9526285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn if (br.state == BroadcastRecord.WAITING_SERVICES) { 9536285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn // In this case the broadcast had already finished, but we had decided to wait 9546285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn // for started services to finish as well before going on. So if we have actually 9556285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn // waited long enough time timeout the broadcast, let's give up on the whole thing 9566285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn // and just move on to the next. 9576285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn Slog.i(ActivityManagerService.TAG, "Waited long enough for: " + (br.curComponent != null 9586285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn ? br.curComponent.flattenToShortString() : "(null)")); 9596285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn br.curComponent = null; 9606285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn br.state = BroadcastRecord.IDLE; 9616285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn processNextBroadcast(false); 9626285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn return; 9636285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn } 9646285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn 9656285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn Slog.w(TAG, "Timeout of broadcast " + r + " - receiver=" + r. receiver 96640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + ", started " + (now - r.receiverTime) + "ms ago"); 96740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiverTime = now; 96840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.anrCount++; 96940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 97040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Current receiver has passed its expiration date. 97140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.nextReceiver <= 0) { 97240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Timeout on receiver with nextReceiver <= 0"); 97340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 97440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 97540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 97640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn ProcessRecord app = null; 97740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn String anrMessage = null; 97840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 97940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Object curReceiver = r.receivers.get(r.nextReceiver-1); 98040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Receiver during timeout: " + curReceiver); 98140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn logBroadcastReceiverDiscardLocked(r); 98240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (curReceiver instanceof BroadcastFilter) { 98340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastFilter bf = (BroadcastFilter)curReceiver; 98440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (bf.receiverList.pid != 0 98540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn && bf.receiverList.pid != ActivityManagerService.MY_PID) { 98640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn synchronized (mService.mPidsSelfLocked) { 98740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn app = mService.mPidsSelfLocked.get( 98840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn bf.receiverList.pid); 98940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 99040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 99140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 99240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn app = r.curApp; 99340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 99440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 99540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (app != null) { 99640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn anrMessage = "Broadcast of " + r.intent.toString(); 99740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 99840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 99940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mPendingBroadcast == r) { 100040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast = null; 100140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 100240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 100340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Move on to the next receiver. 100440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn finishReceiverLocked(r, r.resultCode, r.resultData, 10056285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn r.resultExtras, r.resultAbort, false); 100640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn scheduleBroadcastsLocked(); 100740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 100840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (anrMessage != null) { 100940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Post the ANR to the handler since we do not want to process ANRs while 101040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // potentially holding our lock. 101140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mHandler.post(new AppNotResponding(app, anrMessage)); 101240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 101340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 101440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 101540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn private final void addBroadcastToHistoryLocked(BroadcastRecord r) { 101640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.callingUid < 0) { 101740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // This was from a registerReceiver() call; ignore it. 101840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 101940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 102040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn System.arraycopy(mBroadcastHistory, 0, mBroadcastHistory, 1, 102140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn MAX_BROADCAST_HISTORY-1); 102240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.finishTime = SystemClock.uptimeMillis(); 102340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mBroadcastHistory[0] = r; 1024c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn System.arraycopy(mBroadcastSummaryHistory, 0, mBroadcastSummaryHistory, 1, 1025c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn MAX_BROADCAST_SUMMARY_HISTORY-1); 1026c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn mBroadcastSummaryHistory[0] = r.intent; 102740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 102840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 102940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final void logBroadcastReceiverDiscardLocked(BroadcastRecord r) { 103040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.nextReceiver > 0) { 103140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Object curReceiver = r.receivers.get(r.nextReceiver-1); 103240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (curReceiver instanceof BroadcastFilter) { 103340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastFilter bf = (BroadcastFilter) curReceiver; 103440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_FILTER, 1035b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn bf.owningUserId, System.identityHashCode(r), 103640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.intent.getAction(), 103740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.nextReceiver - 1, 103840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn System.identityHashCode(bf)); 103940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 1040b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn ResolveInfo ri = (ResolveInfo)curReceiver; 104140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP, 1042b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn UserHandle.getUserId(ri.activityInfo.applicationInfo.uid), 1043b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn System.identityHashCode(r), r.intent.getAction(), 1044b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn r.nextReceiver - 1, ri.toString()); 104540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 104640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 104740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Discarding broadcast before first receiver is invoked: " 104840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r); 104940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP, 1050b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn -1, System.identityHashCode(r), 105140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.intent.getAction(), 105240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.nextReceiver, 105340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "NONE"); 105440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 105540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 105640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 105740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final boolean dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args, 105840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int opti, boolean dumpAll, String dumpPackage, boolean needSep) { 105940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mParallelBroadcasts.size() > 0 || mOrderedBroadcasts.size() > 0 106040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn || mPendingBroadcast != null) { 106140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean printed = false; 106240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn for (int i=mParallelBroadcasts.size()-1; i>=0; i--) { 106340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord br = mParallelBroadcasts.get(i); 106440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) { 106540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn continue; 106640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 106740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!printed) { 106840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (needSep) { 106940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(); 107040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 10716cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn needSep = true; 107240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn printed = true; 107340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(" Active broadcasts [" + mQueueName + "]:"); 107440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 10756cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn pw.println(" Active Broadcast " + mQueueName + " #" + i + ":"); 107640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn br.dump(pw, " "); 107740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 107840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn printed = false; 107940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn needSep = true; 108040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn for (int i=mOrderedBroadcasts.size()-1; i>=0; i--) { 108140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord br = mOrderedBroadcasts.get(i); 108240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) { 108340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn continue; 108440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 108540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!printed) { 108640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (needSep) { 108740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(); 108840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 108940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn needSep = true; 10906cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn printed = true; 109140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(" Active ordered broadcasts [" + mQueueName + "]:"); 109240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 10936cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn pw.println(" Active Ordered Broadcast " + mQueueName + " #" + i + ":"); 109440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mOrderedBroadcasts.get(i).dump(pw, " "); 109540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 109640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (dumpPackage == null || (mPendingBroadcast != null 109740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn && dumpPackage.equals(mPendingBroadcast.callerPackage))) { 109840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (needSep) { 109940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(); 110040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 110140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(" Pending broadcast [" + mQueueName + "]:"); 110240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mPendingBroadcast != null) { 110340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast.dump(pw, " "); 110440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 110540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(" (null)"); 110640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 110740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn needSep = true; 110840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 110940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 111040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 1111c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn int i; 111240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean printed = false; 1113c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn for (i=0; i<MAX_BROADCAST_HISTORY; i++) { 111440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord r = mBroadcastHistory[i]; 111540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r == null) { 111640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn break; 111740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 111840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (dumpPackage != null && !dumpPackage.equals(r.callerPackage)) { 111940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn continue; 112040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 112140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!printed) { 112240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (needSep) { 112340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(); 112440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 112540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn needSep = true; 112640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(" Historical broadcasts [" + mQueueName + "]:"); 112740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn printed = true; 112840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 112940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (dumpAll) { 11306cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn pw.print(" Historical Broadcast " + mQueueName + " #"); 11316cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn pw.print(i); pw.println(":"); 113240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.dump(pw, " "); 113340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 1134c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn pw.print(" #"); pw.print(i); pw.print(": "); pw.println(r); 1135c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn pw.print(" "); 1136c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn pw.println(r.intent.toShortString(false, true, true, false)); 1137a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn if (r.targetComp != null && r.targetComp != r.intent.getComponent()) { 1138a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn pw.print(" targetComp: "); pw.println(r.targetComp.toShortString()); 1139a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn } 1140c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn Bundle bundle = r.intent.getExtras(); 1141c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn if (bundle != null) { 1142c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn pw.print(" extras: "); pw.println(bundle.toString()); 1143c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } 1144c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } 1145c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } 1146c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn 1147c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn if (dumpPackage == null) { 1148c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn if (dumpAll) { 1149c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn i = 0; 1150c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn printed = false; 1151c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } 1152c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn for (; i<MAX_BROADCAST_SUMMARY_HISTORY; i++) { 1153c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn Intent intent = mBroadcastSummaryHistory[i]; 1154c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn if (intent == null) { 1155c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn break; 1156c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } 1157c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn if (!printed) { 1158c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn if (needSep) { 1159c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn pw.println(); 1160c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } 1161c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn needSep = true; 1162c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn pw.println(" Historical broadcasts summary [" + mQueueName + "]:"); 1163c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn printed = true; 1164c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } 1165c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn if (!dumpAll && i >= 50) { 116640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(" ..."); 116740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn break; 116840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 1169c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn pw.print(" #"); pw.print(i); pw.print(": "); 1170c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn pw.println(intent.toShortString(false, true, true, false)); 1171c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn Bundle bundle = intent.getExtras(); 1172c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn if (bundle != null) { 1173c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn pw.print(" extras: "); pw.println(bundle.toString()); 1174c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } 117540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 117640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 117740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 117840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return needSep; 117940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 118040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn} 1181