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