BroadcastQueue.java revision b4163a6e12ee7100c758c6d3d062ade1f2843fce
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 2340c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.app.AppGlobals; 2440c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.ComponentName; 2540c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.IIntentReceiver; 2640c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.Intent; 2740c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.pm.PackageManager; 2840c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.pm.ResolveInfo; 2940c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Bundle; 3040c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Handler; 3140c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.IBinder; 3240c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Message; 3340c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Process; 3440c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.RemoteException; 3540c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.SystemClock; 3640c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.UserId; 3740c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.util.EventLog; 3840c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.util.Slog; 3940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 4040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn/** 4140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * BROADCASTS 4240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * 4340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * We keep two broadcast queues and associated bookkeeping, one for those at 4440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * foreground priority, and one for normal (background-priority) broadcasts. 4540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 4640c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornpublic class BroadcastQueue { 4740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final String TAG = "BroadcastQueue"; 4840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final String TAG_MU = ActivityManagerService.TAG_MU; 4940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final boolean DEBUG_BROADCAST = ActivityManagerService.DEBUG_BROADCAST; 5040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final boolean DEBUG_BROADCAST_LIGHT = ActivityManagerService.DEBUG_BROADCAST_LIGHT; 5140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final boolean DEBUG_MU = ActivityManagerService.DEBUG_MU; 5240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 5340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final int MAX_BROADCAST_HISTORY = 25; 5440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 5540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final ActivityManagerService mService; 5640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 5740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 5840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Recognizable moniker for this queue 5940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 6040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final String mQueueName; 6140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 6240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 6340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Timeout period for this queue's broadcasts 6440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 6540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final long mTimeoutPeriod; 6640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 6740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 6840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Lists of all active broadcasts that are to be executed immediately 6940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * (without waiting for another broadcast to finish). Currently this only 7040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * contains broadcasts to registered receivers, to avoid spinning up 7140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * a bunch of processes to execute IntentReceiver components. Background- 7240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * and foreground-priority broadcasts are queued separately. 7340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 7440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final ArrayList<BroadcastRecord> mParallelBroadcasts 7540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn = new ArrayList<BroadcastRecord>(); 7640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 7740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * List of all active broadcasts that are to be executed one at a time. 7840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * The object at the top of the list is the currently activity broadcasts; 7940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * those after it are waiting for the top to finish. As with parallel 8040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * broadcasts, separate background- and foreground-priority queues are 8140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * maintained. 8240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 8340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final ArrayList<BroadcastRecord> mOrderedBroadcasts 8440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn = new ArrayList<BroadcastRecord>(); 8540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 8640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 8740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Historical data of past broadcasts, for debugging. 8840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 8940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final BroadcastRecord[] mBroadcastHistory 9040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn = new BroadcastRecord[MAX_BROADCAST_HISTORY]; 9140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 9240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 9340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Set when we current have a BROADCAST_INTENT_MSG in flight. 9440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 9540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean mBroadcastsScheduled = false; 9640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 9740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 9840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * True if we have a pending unexpired BROADCAST_TIMEOUT_MSG posted to our handler. 9940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 10040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean mPendingBroadcastTimeoutMessage; 10140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 10240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 10340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Intent broadcasts that we have tried to start, but are 10440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * waiting for the application's process to be created. We only 10540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * need one per scheduling class (instead of a list) because we always 10640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * process broadcasts one at a time, so no others can be started while 10740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * waiting for this one. 10840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 10940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord mPendingBroadcast = null; 11040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 11140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn /** 11240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * The receiver index that is pending, to restart the broadcast if needed. 11340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */ 11440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int mPendingBroadcastRecvIndex; 11540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 11640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final int BROADCAST_INTENT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG; 11740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final int BROADCAST_TIMEOUT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG + 1; 11840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 11940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final Handler mHandler = new Handler() { 12040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn //public Handler() { 12140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // if (localLOGV) Slog.v(TAG, "Handler started!"); 12240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn //} 12340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 12440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public void handleMessage(Message msg) { 12540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn switch (msg.what) { 12640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn case BROADCAST_INTENT_MSG: { 12740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v( 12840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn TAG, "Received BROADCAST_INTENT_MSG"); 12940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn processNextBroadcast(true); 13040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } break; 13140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn case BROADCAST_TIMEOUT_MSG: { 13240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn synchronized (mService) { 13340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn broadcastTimeoutLocked(true); 13440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 13540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } break; 13640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 13740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 13840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn }; 13940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 14040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn private final class AppNotResponding implements Runnable { 14140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn private final ProcessRecord mApp; 14240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn private final String mAnnotation; 14340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 14440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public AppNotResponding(ProcessRecord app, String annotation) { 14540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mApp = app; 14640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mAnnotation = annotation; 14740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 14840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 14940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn @Override 15040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public void run() { 15140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.appNotResponding(mApp, null, null, mAnnotation); 15240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 15340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 15440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 15540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastQueue(ActivityManagerService service, String name, long timeoutPeriod) { 15640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService = service; 15740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mQueueName = name; 15840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mTimeoutPeriod = timeoutPeriod; 15940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 16040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 16140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public boolean isPendingBroadcastProcessLocked(int pid) { 16240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return mPendingBroadcast != null && mPendingBroadcast.curApp.pid == pid; 16340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 16440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 16540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public void enqueueParallelBroadcastLocked(BroadcastRecord r) { 16640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mParallelBroadcasts.add(r); 16740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 16840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 16940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public void enqueueOrderedBroadcastLocked(BroadcastRecord r) { 17040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mOrderedBroadcasts.add(r); 17140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 17240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 17340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public final boolean replaceParallelBroadcastLocked(BroadcastRecord r) { 17440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn for (int i=mParallelBroadcasts.size()-1; i>=0; i--) { 17540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.intent.filterEquals(mParallelBroadcasts.get(i).intent)) { 17640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 17740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "***** DROPPING PARALLEL [" 17840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "]: " + r.intent); 17940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mParallelBroadcasts.set(i, r); 18040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return true; 18140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 18240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 18340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return false; 18440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 18540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 18640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public final boolean replaceOrderedBroadcastLocked(BroadcastRecord r) { 18740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn for (int i=mOrderedBroadcasts.size()-1; i>0; i--) { 18840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.intent.filterEquals(mOrderedBroadcasts.get(i).intent)) { 18940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 19040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "***** DROPPING ORDERED [" 19140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "]: " + r.intent); 19240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mOrderedBroadcasts.set(i, r); 19340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return true; 19440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 19540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 19640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return false; 19740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 19840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 19940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn private final void processCurBroadcastLocked(BroadcastRecord r, 20040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn ProcessRecord app) throws RemoteException { 20140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 20240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Process cur broadcast " + r + " for app " + app); 20340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (app.thread == null) { 20440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn throw new RemoteException(); 20540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 20640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiver = app.thread.asBinder(); 20740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curApp = app; 20840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn app.curReceiver = r; 20940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.updateLruProcessLocked(app, true, true); 21040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 21140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Tell the application to launch this receiver. 21240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.intent.setComponent(r.curComponent); 21340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 21440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean started = false; 21540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn try { 21640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, 21740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Delivering to component " + r.curComponent 21840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + ": " + r); 21940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 22040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn app.thread.scheduleReceiver(new Intent(r.intent), r.curReceiver, 22140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.compatibilityInfoForPackageLocked(r.curReceiver.applicationInfo), 22240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultCode, r.resultData, r.resultExtras, r.ordered); 22340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 22440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Process cur broadcast " + r + " DELIVERED for app " + app); 22540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn started = true; 22640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } finally { 22740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!started) { 22840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 22940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Process cur broadcast " + r + ": NOT STARTED!"); 23040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiver = null; 23140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curApp = null; 23240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn app.curReceiver = null; 23340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 23440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 23540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 23640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 23740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public boolean sendPendingBroadcastsLocked(ProcessRecord app) { 23840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean didSomething = false; 23940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final BroadcastRecord br = mPendingBroadcast; 24040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (br != null && br.curApp.pid == app.pid) { 24140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn try { 24240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast = null; 24340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn processCurBroadcastLocked(br, app); 24440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn didSomething = true; 24540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } catch (Exception e) { 24640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Exception in new application when starting receiver " 24740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + br.curComponent.flattenToShortString(), e); 24840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn logBroadcastReceiverDiscardLocked(br); 24940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn finishReceiverLocked(br, br.resultCode, br.resultData, 25040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn br.resultExtras, br.resultAbort, true); 25140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn scheduleBroadcastsLocked(); 25240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // We need to reset the state if we fails to start the receiver. 25340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn br.state = BroadcastRecord.IDLE; 25440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn throw new RuntimeException(e.getMessage()); 25540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 25640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 25740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return didSomething; 25840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 25940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 26040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public void skipPendingBroadcastLocked(int pid) { 26140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final BroadcastRecord br = mPendingBroadcast; 26240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (br != null && br.curApp.pid == pid) { 26340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn br.state = BroadcastRecord.IDLE; 26440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn br.nextReceiver = mPendingBroadcastRecvIndex; 26540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast = null; 26640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn scheduleBroadcastsLocked(); 26740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 26840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 26940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 27040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public void skipCurrentReceiverLocked(ProcessRecord app) { 27140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean reschedule = false; 27240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord r = app.curReceiver; 27340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r != null) { 27440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // The current broadcast is waiting for this app's receiver 27540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // to be finished. Looks like that's not going to happen, so 27640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // let the broadcast continue. 27740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn logBroadcastReceiverDiscardLocked(r); 27840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn finishReceiverLocked(r, r.resultCode, r.resultData, 27940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultExtras, r.resultAbort, true); 28040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn reschedule = true; 28140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 28240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 28340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r = mPendingBroadcast; 28440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r != null && r.curApp == app) { 28540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 28640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "[" + mQueueName + "] skip & discard pending app " + r); 28740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn logBroadcastReceiverDiscardLocked(r); 28840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn finishReceiverLocked(r, r.resultCode, r.resultData, 28940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultExtras, r.resultAbort, true); 29040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn reschedule = true; 29140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 29240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (reschedule) { 29340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn scheduleBroadcastsLocked(); 29440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 29540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 29640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 29740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public void scheduleBroadcastsLocked() { 29840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, "Schedule broadcasts [" 29940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "]: current=" 30040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mBroadcastsScheduled); 30140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 30240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mBroadcastsScheduled) { 30340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 30440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 30540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mHandler.sendMessage(mHandler.obtainMessage(BROADCAST_INTENT_MSG, this)); 30640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mBroadcastsScheduled = true; 30740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 30840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 30940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public BroadcastRecord getMatchingOrderedReceiver(IBinder receiver) { 31040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mOrderedBroadcasts.size() > 0) { 31140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final BroadcastRecord r = mOrderedBroadcasts.get(0); 31240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r != null && r.receiver == receiver) { 31340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return r; 31440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 31540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 31640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return null; 31740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 31840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 31940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn public boolean finishReceiverLocked(BroadcastRecord r, int resultCode, 32040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn String resultData, Bundle resultExtras, boolean resultAbort, 32140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean explicit) { 32240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int state = r.state; 32340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.IDLE; 32440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (state == BroadcastRecord.IDLE) { 32540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (explicit) { 32640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "finishReceiver [" + mQueueName + "] called but state is IDLE"); 32740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 32840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 32940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiver = null; 33040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.intent.setComponent(null); 33140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.curApp != null) { 33240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curApp.curReceiver = null; 33340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 33440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.curFilter != null) { 33540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curFilter.receiverList.curBroadcast = null; 33640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 33740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curFilter = null; 33840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curApp = null; 33940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curComponent = null; 34040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curReceiver = null; 34140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast = null; 34240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 34340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultCode = resultCode; 34440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultData = resultData; 34540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultExtras = resultExtras; 34640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultAbort = resultAbort; 34740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 34840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // We will process the next receiver right now if this is finishing 34940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // an app receiver (which is always asynchronous) or after we have 35040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // come back from calling a receiver. 35140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return state == BroadcastRecord.APP_RECEIVE 35240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn || state == BroadcastRecord.CALL_DONE_RECEIVE; 35340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 35440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 35540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn private static void performReceiveLocked(ProcessRecord app, IIntentReceiver receiver, 35640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Intent intent, int resultCode, String data, Bundle extras, 35740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean ordered, boolean sticky) throws RemoteException { 35840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Send the intent to the receiver asynchronously using one-way binder calls. 35940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (app != null && app.thread != null) { 36040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // If we have an app thread, do the call through that so it is 36140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // correctly ordered with other one-way calls. 36240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode, 36340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn data, extras, ordered, sticky); 36440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 36540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn receiver.performReceive(intent, resultCode, data, extras, ordered, sticky); 36640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 36740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 36840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 36940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn private final void deliverToRegisteredReceiverLocked(BroadcastRecord r, 37040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastFilter filter, boolean ordered) { 37140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean skip = false; 372b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn if (r.onlySendToCaller) { 373b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn if (!UserId.isSameApp(r.callingUid, filter.owningUid)) { 374b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn Slog.w(TAG, "Permission Denial: broadcasting " 375b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn + r.intent.toString() 376b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn + " from " + r.callerPackage + " (pid=" 377b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn + r.callingPid + ", uid=" + r.callingUid + ")" 378b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn + " not allowed to go to different app " + filter.owningUid); 379b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn skip = true; 380b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn } 381b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn } 382b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn if (!skip && filter.requiredPermission != null) { 38340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int perm = mService.checkComponentPermission(filter.requiredPermission, 38440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.callingPid, r.callingUid, -1, true); 38540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (perm != PackageManager.PERMISSION_GRANTED) { 38640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Permission Denial: broadcasting " 38740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.intent.toString() 38840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " from " + r.callerPackage + " (pid=" 38940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.callingPid + ", uid=" + r.callingUid + ")" 39040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " requires " + filter.requiredPermission 39140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " due to registered receiver " + filter); 39240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn skip = true; 39340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 39440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 395b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn if (!skip && r.requiredPermission != null) { 39640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int perm = mService.checkComponentPermission(r.requiredPermission, 39740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn filter.receiverList.pid, filter.receiverList.uid, -1, true); 39840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (perm != PackageManager.PERMISSION_GRANTED) { 39940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Permission Denial: receiving " 40040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.intent.toString() 40140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " to " + filter.receiverList.app 40240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " (pid=" + filter.receiverList.pid 40340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + ", uid=" + filter.receiverList.uid + ")" 40440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " requires " + r.requiredPermission 40540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " due to sender " + r.callerPackage 40640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " (uid " + r.callingUid + ")"); 40740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn skip = true; 40840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 40940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 41040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 41140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!skip) { 41240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // If this is not being sent as an ordered broadcast, then we 41340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // don't want to touch the fields that keep track of the current 41440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // state of ordered broadcasts. 41540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (ordered) { 41640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiver = filter.receiverList.receiver.asBinder(); 41740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curFilter = filter; 41840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn filter.receiverList.curBroadcast = r; 41940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.CALL_IN_RECEIVE; 42040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (filter.receiverList.app != null) { 42140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Bump hosting application to no longer be in background 42240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // scheduling class. Note that we can't do that if there 42340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // isn't an app... but we can only be in that case for 42440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // things that directly call the IActivityManager API, which 42540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // are already core system stuff so don't matter for this. 42640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curApp = filter.receiverList.app; 42740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn filter.receiverList.app.curReceiver = r; 42840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.updateOomAdjLocked(); 42940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 43040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 43140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn try { 43240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST_LIGHT) { 43340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int seq = r.intent.getIntExtra("seq", -1); 43440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.i(TAG, "Delivering to " + filter 43540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " (seq=" + seq + "): " + r); 43640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 43740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn performReceiveLocked(filter.receiverList.app, filter.receiverList.receiver, 43840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn new Intent(r.intent), r.resultCode, 43940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultData, r.resultExtras, r.ordered, r.initialSticky); 44040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (ordered) { 44140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.CALL_DONE_RECEIVE; 44240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 44340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } catch (RemoteException e) { 44440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Failure sending broadcast " + r.intent, e); 44540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (ordered) { 44640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiver = null; 44740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curFilter = null; 44840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn filter.receiverList.curBroadcast = null; 44940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (filter.receiverList.app != null) { 45040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn filter.receiverList.app.curReceiver = null; 45140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 45240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 45340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 45440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 45540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 45640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 45740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final void processNextBroadcast(boolean fromMsg) { 45840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn synchronized(mService) { 45940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord r; 46040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 46140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, "processNextBroadcast [" 46240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "]: " 46340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mParallelBroadcasts.size() + " broadcasts, " 46440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mOrderedBroadcasts.size() + " ordered broadcasts"); 46540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 46640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.updateCpuStats(); 46740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 46840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (fromMsg) { 46940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mBroadcastsScheduled = false; 47040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 47140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 47240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // First, deliver any non-serialized broadcasts right away. 47340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn while (mParallelBroadcasts.size() > 0) { 47440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r = mParallelBroadcasts.remove(0); 47540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.dispatchTime = SystemClock.uptimeMillis(); 47640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.dispatchClockTime = System.currentTimeMillis(); 47740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final int N = r.receivers.size(); 47840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing parallel broadcast [" 47940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] " + r); 48040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn for (int i=0; i<N; i++) { 48140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Object target = r.receivers.get(i); 48240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 48340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Delivering non-ordered on [" + mQueueName + "] to registered " 48440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + target + ": " + r); 48540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn deliverToRegisteredReceiverLocked(r, (BroadcastFilter)target, false); 48640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 48740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn addBroadcastToHistoryLocked(r); 48840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Done with parallel broadcast [" 48940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] " + r); 49040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 49140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 49240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Now take care of the next serialized one... 49340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 49440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // If we are waiting for a process to come up to handle the next 49540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // broadcast, then do nothing at this point. Just in case, we 49640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // check that the process we're waiting for still exists. 49740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mPendingBroadcast != null) { 49840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST_LIGHT) { 49940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.v(TAG, "processNextBroadcast [" 50040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "]: waiting for " 50140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mPendingBroadcast.curApp); 50240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 50340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 50440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean isDead; 50540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn synchronized (mService.mPidsSelfLocked) { 50640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn isDead = (mService.mPidsSelfLocked.get( 50740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast.curApp.pid) == null); 50840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 50940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!isDead) { 51040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // It's still alive, so keep waiting 51140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 51240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 51340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "pending app [" 51440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "]" + mPendingBroadcast.curApp 51540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " died before responding to broadcast"); 51640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast.state = BroadcastRecord.IDLE; 51740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast.nextReceiver = mPendingBroadcastRecvIndex; 51840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast = null; 51940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 52040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 52140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 52240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean looped = false; 52340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 52440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn do { 52540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mOrderedBroadcasts.size() == 0) { 52640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // No more broadcasts pending, so all done! 52740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.scheduleAppGcsLocked(); 52840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (looped) { 52940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // If we had finished the last ordered broadcast, then 53040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // make sure all processes have correct oom and sched 53140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // adjustments. 53240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.updateOomAdjLocked(); 53340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 53440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 53540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 53640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r = mOrderedBroadcasts.get(0); 53740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean forceReceive = false; 53840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 53940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Ensure that even if something goes awry with the timeout 54040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // detection, we catch "hung" broadcasts here, discard them, 54140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // and continue to make progress. 54240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // 54340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // This is only done if the system is ready so that PRE_BOOT_COMPLETED 54440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // receivers don't get executed with timeouts. They're intended for 54540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // one time heavy lifting after system upgrades and can take 54640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // significant amounts of time. 54740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int numReceivers = (r.receivers != null) ? r.receivers.size() : 0; 54840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mService.mProcessesReady && r.dispatchTime > 0) { 54940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn long now = SystemClock.uptimeMillis(); 55040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if ((numReceivers > 0) && 55140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn (now > r.dispatchTime + (2*mTimeoutPeriod*numReceivers))) { 55240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Hung broadcast [" 55340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] discarded after timeout failure:" 55440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " now=" + now 55540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " dispatchTime=" + r.dispatchTime 55640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " startTime=" + r.receiverTime 55740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " intent=" + r.intent 55840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " numReceivers=" + numReceivers 55940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " nextReceiver=" + r.nextReceiver 56040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " state=" + r.state); 56140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn broadcastTimeoutLocked(false); // forcibly finish this broadcast 56240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn forceReceive = true; 56340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.IDLE; 56440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 56540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 56640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 56740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.state != BroadcastRecord.IDLE) { 56840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.d(TAG, 56940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "processNextBroadcast(" 57040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + ") called when not idle (state=" 57140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.state + ")"); 57240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 57340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 57440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 57540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.receivers == null || r.nextReceiver >= numReceivers 57640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn || r.resultAbort || forceReceive) { 57740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // No more receivers for this broadcast! Send the final 57840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // result if requested... 57940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.resultTo != null) { 58040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn try { 58140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) { 58240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int seq = r.intent.getIntExtra("seq", -1); 58340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.i(TAG, "Finishing broadcast [" 58440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] " + r.intent.getAction() 58540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " seq=" + seq + " app=" + r.callerApp); 58640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 58740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn performReceiveLocked(r.callerApp, r.resultTo, 58840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn new Intent(r.intent), r.resultCode, 58940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultData, r.resultExtras, false, false); 59040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Set this to null so that the reference 59140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // (local and remote) isnt kept in the mBroadcastHistory. 59240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultTo = null; 59340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } catch (RemoteException e) { 59440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Failure [" 59540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] sending broadcast result of " 59640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.intent, e); 59740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 59840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 59940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 60040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, "Cancelling BROADCAST_TIMEOUT_MSG"); 60140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn cancelBroadcastTimeoutLocked(); 60240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 60340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Finished with ordered broadcast " 60440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r); 60540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 60640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // ... and on to the next... 60740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn addBroadcastToHistoryLocked(r); 60840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mOrderedBroadcasts.remove(0); 60940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r = null; 61040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn looped = true; 61140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn continue; 61240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 61340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } while (r == null); 61440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 61540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Get the next receiver... 61640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int recIdx = r.nextReceiver++; 61740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 61840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Keep track of when this receiver started, and make sure there 61940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // is a timeout message pending to kill it if need be. 62040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiverTime = SystemClock.uptimeMillis(); 62140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (recIdx == 0) { 62240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.dispatchTime = r.receiverTime; 62340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.dispatchClockTime = System.currentTimeMillis(); 62440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing ordered broadcast [" 62540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] " + r); 62640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 62740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (! mPendingBroadcastTimeoutMessage) { 62840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn long timeoutTime = r.receiverTime + mTimeoutPeriod; 62940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 63040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Submitting BROADCAST_TIMEOUT_MSG [" 63140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] for " + r + " at " + timeoutTime); 63240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn setBroadcastTimeoutLocked(timeoutTime); 63340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 63440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 63540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Object nextReceiver = r.receivers.get(recIdx); 63640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (nextReceiver instanceof BroadcastFilter) { 63740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Simple case: this is a registered receiver who gets 63840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // a direct call. 63940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastFilter filter = (BroadcastFilter)nextReceiver; 64040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 64140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Delivering ordered [" 64240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] to registered " 64340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + filter + ": " + r); 64440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn deliverToRegisteredReceiverLocked(r, filter, r.ordered); 64540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.receiver == null || !r.ordered) { 64640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // The receiver has already finished, so schedule to 64740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // process the next one. 64840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, "Quick finishing [" 64940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "]: ordered=" 65040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.ordered + " receiver=" + r.receiver); 65140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.IDLE; 65240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn scheduleBroadcastsLocked(); 65340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 65440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 65540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 65640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 65740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Hard case: need to instantiate the receiver, possibly 65840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // starting its application process to host it. 65940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 66040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn ResolveInfo info = 66140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn (ResolveInfo)nextReceiver; 66240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 66340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean skip = false; 664b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn if (r.onlySendToCaller) { 665b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn if (!UserId.isSameApp(r.callingUid, info.activityInfo.applicationInfo.uid)) { 666b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn Slog.w(TAG, "Permission Denial: broadcasting " 667b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn + r.intent.toString() 668b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn + " from " + r.callerPackage + " (pid=" 669b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn + r.callingPid + ", uid=" + r.callingUid + ")" 670b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn + " not allowed to go to different app " 671b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn + info.activityInfo.applicationInfo.uid); 672b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn skip = true; 673b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn } 674b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn } 67540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int perm = mService.checkComponentPermission(info.activityInfo.permission, 67640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.callingPid, r.callingUid, info.activityInfo.applicationInfo.uid, 67740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn info.activityInfo.exported); 67840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (perm != PackageManager.PERMISSION_GRANTED) { 67940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!info.activityInfo.exported) { 68040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Permission Denial: broadcasting " 68140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.intent.toString() 68240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " from " + r.callerPackage + " (pid=" + r.callingPid 68340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + ", uid=" + r.callingUid + ")" 68440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " is not exported from uid " + info.activityInfo.applicationInfo.uid 68540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " due to receiver " + info.activityInfo.packageName 68640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + "/" + info.activityInfo.name); 68740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 68840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Permission Denial: broadcasting " 68940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.intent.toString() 69040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " from " + r.callerPackage + " (pid=" + r.callingPid 69140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + ", uid=" + r.callingUid + ")" 69240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " requires " + info.activityInfo.permission 69340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " due to receiver " + info.activityInfo.packageName 69440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + "/" + info.activityInfo.name); 69540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 69640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn skip = true; 69740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 69840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (info.activityInfo.applicationInfo.uid != Process.SYSTEM_UID && 69940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.requiredPermission != null) { 70040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn try { 70140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn perm = AppGlobals.getPackageManager(). 70240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn checkPermission(r.requiredPermission, 70340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn info.activityInfo.applicationInfo.packageName); 70440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } catch (RemoteException e) { 70540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn perm = PackageManager.PERMISSION_DENIED; 70640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 70740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (perm != PackageManager.PERMISSION_GRANTED) { 70840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Permission Denial: receiving " 70940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.intent + " to " 71040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + info.activityInfo.applicationInfo.packageName 71140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " requires " + r.requiredPermission 71240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " due to sender " + r.callerPackage 71340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + " (uid " + r.callingUid + ")"); 71440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn skip = true; 71540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 71640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 71740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.curApp != null && r.curApp.crashing) { 71840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // If the target process is crashing, just skip it. 71940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 72040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Skipping deliver ordered [" 72140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] " + r + " to " + r.curApp 72240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + ": process crashing"); 72340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn skip = true; 72440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 72540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 72640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (skip) { 72740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 72840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Skipping delivery of ordered [" 72940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] " + r + " for whatever reason"); 73040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiver = null; 73140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curFilter = null; 73240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.IDLE; 73340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn scheduleBroadcastsLocked(); 73440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 73540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 73640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 73740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.APP_RECEIVE; 73840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn String targetProcess = info.activityInfo.processName; 73940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curComponent = new ComponentName( 74040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn info.activityInfo.applicationInfo.packageName, 74140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn info.activityInfo.name); 74240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.callingUid != Process.SYSTEM_UID) { 743a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani boolean isSingleton = mService.isSingleton(info.activityInfo.processName, 744a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani info.activityInfo.applicationInfo); 745a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani int targetUserId = isSingleton ? 0 : UserId.getUserId(r.callingUid); 746a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani info.activityInfo = mService.getActivityInfoForUser(info.activityInfo,targetUserId); 74740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 74840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.curReceiver = info.activityInfo; 74940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_MU && r.callingUid > UserId.PER_USER_RANGE) { 75040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.v(TAG_MU, "Updated broadcast record activity info for secondary user, " 75140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + info.activityInfo + ", callingUid = " + r.callingUid + ", uid = " 75240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + info.activityInfo.applicationInfo.uid); 75340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 75440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 75540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Broadcast is being executed, its package can't be stopped. 75640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn try { 75740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn AppGlobals.getPackageManager().setPackageStoppedState( 758483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani r.curComponent.getPackageName(), false, UserId.getUserId(r.callingUid)); 75940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } catch (RemoteException e) { 76040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } catch (IllegalArgumentException e) { 76140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Failed trying to unstop package " 76240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.curComponent.getPackageName() + ": " + e); 76340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 76440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 76540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Is this receiver's application already running? 76640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn ProcessRecord app = mService.getProcessRecordLocked(targetProcess, 76740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn info.activityInfo.applicationInfo.uid); 76840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (app != null && app.thread != null) { 76940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn try { 77040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn app.addPackage(info.activityInfo.packageName); 77140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn processCurBroadcastLocked(r, app); 77240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 77340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } catch (RemoteException e) { 77440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Exception when sending broadcast to " 77540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.curComponent, e); 77640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 77740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 77840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // If a dead object exception was thrown -- fall through to 77940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // restart the application. 78040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 78140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 78240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Not running -- get it started, to be executed when the app comes up. 78340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 78440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Need to start app [" 78540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] " + targetProcess + " for broadcast " + r); 78640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if ((r.curApp=mService.startProcessLocked(targetProcess, 78740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn info.activityInfo.applicationInfo, true, 78840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND, 78940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "broadcast", r.curComponent, 79040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn (r.intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0, false)) 79140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn == null) { 79240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Ah, this recipient is unavailable. Finish it if necessary, 79340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // and mark the broadcast record as ready for the next. 79440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Unable to launch app " 79540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + info.activityInfo.applicationInfo.packageName + "/" 79640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + info.activityInfo.applicationInfo.uid + " for broadcast " 79740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r.intent + ": process is bad"); 79840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn logBroadcastReceiverDiscardLocked(r); 79940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn finishReceiverLocked(r, r.resultCode, r.resultData, 80040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultExtras, r.resultAbort, true); 80140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn scheduleBroadcastsLocked(); 80240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.state = BroadcastRecord.IDLE; 80340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 80440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 80540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 80640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast = r; 80740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcastRecvIndex = recIdx; 80840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 80940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 81040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 81140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final void setBroadcastTimeoutLocked(long timeoutTime) { 81240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (! mPendingBroadcastTimeoutMessage) { 81340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG, this); 81440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mHandler.sendMessageAtTime(msg, timeoutTime); 81540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcastTimeoutMessage = true; 81640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 81740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 81840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 81940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final void cancelBroadcastTimeoutLocked() { 82040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mPendingBroadcastTimeoutMessage) { 82140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mHandler.removeMessages(BROADCAST_TIMEOUT_MSG, this); 82240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcastTimeoutMessage = false; 82340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 82440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 82540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 82640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final void broadcastTimeoutLocked(boolean fromMsg) { 82740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (fromMsg) { 82840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcastTimeoutMessage = false; 82940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 83040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 83140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mOrderedBroadcasts.size() == 0) { 83240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 83340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 83440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 83540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn long now = SystemClock.uptimeMillis(); 83640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord r = mOrderedBroadcasts.get(0); 83740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (fromMsg) { 83840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mService.mDidDexOpt) { 83940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Delay timeouts until dexopt finishes. 84040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mService.mDidDexOpt = false; 84140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn long timeoutTime = SystemClock.uptimeMillis() + mTimeoutPeriod; 84240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn setBroadcastTimeoutLocked(timeoutTime); 84340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 84440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 84540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!mService.mProcessesReady) { 84640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Only process broadcast timeouts if the system is ready. That way 84740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // PRE_BOOT_COMPLETED broadcasts can't timeout as they are intended 84840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // to do heavy lifting for system up. 84940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 85040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 85140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 85240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn long timeoutTime = r.receiverTime + mTimeoutPeriod; 85340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (timeoutTime > now) { 85440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // We can observe premature timeouts because we do not cancel and reset the 85540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // broadcast timeout message after each receiver finishes. Instead, we set up 85640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // an initial timeout then kick it down the road a little further as needed 85740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // when it expires. 85840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (DEBUG_BROADCAST) Slog.v(TAG, 85940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "Premature timeout [" 86040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + mQueueName + "] @ " + now + ": resetting BROADCAST_TIMEOUT_MSG for " 86140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + timeoutTime); 86240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn setBroadcastTimeoutLocked(timeoutTime); 86340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 86440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 86540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 86640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 86740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Timeout of broadcast " + r + " - receiver=" + r.receiver 86840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + ", started " + (now - r.receiverTime) + "ms ago"); 86940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.receiverTime = now; 87040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.anrCount++; 87140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 87240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Current receiver has passed its expiration date. 87340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.nextReceiver <= 0) { 87440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Timeout on receiver with nextReceiver <= 0"); 87540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 87640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 87740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 87840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn ProcessRecord app = null; 87940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn String anrMessage = null; 88040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 88140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Object curReceiver = r.receivers.get(r.nextReceiver-1); 88240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Receiver during timeout: " + curReceiver); 88340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn logBroadcastReceiverDiscardLocked(r); 88440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (curReceiver instanceof BroadcastFilter) { 88540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastFilter bf = (BroadcastFilter)curReceiver; 88640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (bf.receiverList.pid != 0 88740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn && bf.receiverList.pid != ActivityManagerService.MY_PID) { 88840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn synchronized (mService.mPidsSelfLocked) { 88940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn app = mService.mPidsSelfLocked.get( 89040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn bf.receiverList.pid); 89140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 89240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 89340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 89440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn app = r.curApp; 89540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 89640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 89740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (app != null) { 89840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn anrMessage = "Broadcast of " + r.intent.toString(); 89940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 90040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 90140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mPendingBroadcast == r) { 90240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast = null; 90340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 90440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 90540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Move on to the next receiver. 90640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn finishReceiverLocked(r, r.resultCode, r.resultData, 90740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.resultExtras, r.resultAbort, true); 90840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn scheduleBroadcastsLocked(); 90940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 91040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (anrMessage != null) { 91140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // Post the ANR to the handler since we do not want to process ANRs while 91240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // potentially holding our lock. 91340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mHandler.post(new AppNotResponding(app, anrMessage)); 91440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 91540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 91640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 91740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn private final void addBroadcastToHistoryLocked(BroadcastRecord r) { 91840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.callingUid < 0) { 91940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn // This was from a registerReceiver() call; ignore it. 92040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return; 92140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 92240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn System.arraycopy(mBroadcastHistory, 0, mBroadcastHistory, 1, 92340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn MAX_BROADCAST_HISTORY-1); 92440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.finishTime = SystemClock.uptimeMillis(); 92540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mBroadcastHistory[0] = r; 92640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 92740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 92840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final void logBroadcastReceiverDiscardLocked(BroadcastRecord r) { 92940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r.nextReceiver > 0) { 93040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Object curReceiver = r.receivers.get(r.nextReceiver-1); 93140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (curReceiver instanceof BroadcastFilter) { 93240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastFilter bf = (BroadcastFilter) curReceiver; 93340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_FILTER, 93440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn System.identityHashCode(r), 93540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.intent.getAction(), 93640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.nextReceiver - 1, 93740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn System.identityHashCode(bf)); 93840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 93940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP, 94040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn System.identityHashCode(r), 94140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.intent.getAction(), 94240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.nextReceiver - 1, 94340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn ((ResolveInfo)curReceiver).toString()); 94440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 94540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 94640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn Slog.w(TAG, "Discarding broadcast before first receiver is invoked: " 94740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn + r); 94840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP, 94940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn System.identityHashCode(r), 95040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.intent.getAction(), 95140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.nextReceiver, 95240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn "NONE"); 95340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 95440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 95540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 95640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn final boolean dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args, 95740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn int opti, boolean dumpAll, String dumpPackage, boolean needSep) { 95840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mParallelBroadcasts.size() > 0 || mOrderedBroadcasts.size() > 0 95940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn || mPendingBroadcast != null) { 96040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean printed = false; 96140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn for (int i=mParallelBroadcasts.size()-1; i>=0; i--) { 96240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord br = mParallelBroadcasts.get(i); 96340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) { 96440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn continue; 96540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 96640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!printed) { 96740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (needSep) { 96840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(); 96940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn needSep = false; 97040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 97140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn printed = true; 97240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(" Active broadcasts [" + mQueueName + "]:"); 97340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 97440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(" Broadcast #" + i + ":"); 97540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn br.dump(pw, " "); 97640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 97740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn printed = false; 97840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn needSep = true; 97940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn for (int i=mOrderedBroadcasts.size()-1; i>=0; i--) { 98040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord br = mOrderedBroadcasts.get(i); 98140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) { 98240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn continue; 98340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 98440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!printed) { 98540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (needSep) { 98640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(); 98740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 98840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn needSep = true; 98940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(" Active ordered broadcasts [" + mQueueName + "]:"); 99040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 99140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(" Ordered Broadcast #" + i + ":"); 99240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mOrderedBroadcasts.get(i).dump(pw, " "); 99340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 99440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (dumpPackage == null || (mPendingBroadcast != null 99540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn && dumpPackage.equals(mPendingBroadcast.callerPackage))) { 99640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (needSep) { 99740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(); 99840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 99940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(" Pending broadcast [" + mQueueName + "]:"); 100040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (mPendingBroadcast != null) { 100140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn mPendingBroadcast.dump(pw, " "); 100240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 100340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(" (null)"); 100440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 100540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn needSep = true; 100640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 100740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 100840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 100940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn boolean printed = false; 101040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn for (int i=0; i<MAX_BROADCAST_HISTORY; i++) { 101140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord r = mBroadcastHistory[i]; 101240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (r == null) { 101340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn break; 101440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 101540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (dumpPackage != null && !dumpPackage.equals(r.callerPackage)) { 101640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn continue; 101740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 101840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (!printed) { 101940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (needSep) { 102040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(); 102140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 102240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn needSep = true; 102340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(" Historical broadcasts [" + mQueueName + "]:"); 102440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn printed = true; 102540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 102640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (dumpAll) { 102740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.print(" Historical Broadcast #"); pw.print(i); pw.println(":"); 102840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn r.dump(pw, " "); 102940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } else { 103040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn if (i >= 50) { 103140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.println(" ..."); 103240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn break; 103340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 103440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn pw.print(" #"); pw.print(i); pw.print(": "); pw.println(r); 103540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 103640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 103740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn 103840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn return needSep; 103940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn } 104040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn} 1041