Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 334bf989 authored by Jeff Sharkey's avatar Jeff Sharkey Committed by Android (Google) Code Review
Browse files

Merge changes from topic "aug26"

* changes:
  Internalize setPackageStoppedState() call.
  Useful annotations for BroadcastQueue.
  [1/?] Tests for generic BroadcastQueue.
  Testing strategy for generic BroadcastQueue.
  [6/?] Reduce BroadcastQueue interface complexity.
parents c2cf8c1c 2ef69945
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -1305,4 +1305,7 @@ public abstract class PackageManagerInternal {
     * {@link android.Manifest.permission#INTERACT_ACROSS_USERS}.
     * {@link android.Manifest.permission#INTERACT_ACROSS_USERS}.
     */
     */
    public abstract @SignatureResult int checkUidSignaturesForAllUsers(int uid1, int uid2);
    public abstract @SignatureResult int checkUidSignaturesForAllUsers(int uid1, int uid2);

    public abstract void setPackageStoppedState(@NonNull String packageName, boolean stopped,
            @UserIdInt int userId);
}
}
+1 −2
Original line number Original line Diff line number Diff line
@@ -4236,9 +4236,8 @@ public final class ActiveServices {


        // Service is now being launched, its package can't be stopped.
        // Service is now being launched, its package can't be stopped.
        try {
        try {
            AppGlobals.getPackageManager().setPackageStoppedState(
            mAm.mPackageManagerInt.setPackageStoppedState(
                    r.packageName, false, r.userId);
                    r.packageName, false, r.userId);
        } catch (RemoteException e) {
        } catch (IllegalArgumentException e) {
        } catch (IllegalArgumentException e) {
            Slog.w(TAG, "Failed trying to unstop package "
            Slog.w(TAG, "Failed trying to unstop package "
                    + r.packageName + ": " + e);
                    + r.packageName + ": " + e);
+24 −30
Original line number Original line Diff line number Diff line
@@ -659,7 +659,7 @@ public class ActivityManagerService extends IActivityManager.Stub
    final BroadcastQueue mFgOffloadBroadcastQueue;
    final BroadcastQueue mFgOffloadBroadcastQueue;
    // Convenient for easy iteration over the queues. Foreground is first
    // Convenient for easy iteration over the queues. Foreground is first
    // so that dispatch of foreground broadcasts gets precedence.
    // so that dispatch of foreground broadcasts gets precedence.
    final BroadcastQueue[] mBroadcastQueues = new BroadcastQueue[4];
    final BroadcastQueue[] mBroadcastQueues;
    @GuardedBy("this")
    @GuardedBy("this")
    BroadcastStats mLastBroadcastStats;
    BroadcastStats mLastBroadcastStats;
@@ -670,25 +670,33 @@ public class ActivityManagerService extends IActivityManager.Stub
    TraceErrorLogger mTraceErrorLogger;
    TraceErrorLogger mTraceErrorLogger;
    BroadcastQueue broadcastQueueForIntent(Intent intent) {
    BroadcastQueue broadcastQueueForIntent(Intent intent) {
        if (isOnFgOffloadQueue(intent.getFlags())) {
        return broadcastQueueForFlags(intent.getFlags(), intent);
    }
    BroadcastQueue broadcastQueueForFlags(int flags) {
        return broadcastQueueForFlags(flags, null);
    }
    BroadcastQueue broadcastQueueForFlags(int flags, Object cookie) {
        if (isOnFgOffloadQueue(flags)) {
            if (DEBUG_BROADCAST_BACKGROUND) {
            if (DEBUG_BROADCAST_BACKGROUND) {
                Slog.i(TAG_BROADCAST,
                Slog.i(TAG_BROADCAST,
                        "Broadcast intent " + intent + " on foreground offload queue");
                        "Broadcast intent " + cookie + " on foreground offload queue");
            }
            }
            return mFgOffloadBroadcastQueue;
            return mFgOffloadBroadcastQueue;
        }
        }
        if (isOnBgOffloadQueue(intent.getFlags())) {
        if (isOnBgOffloadQueue(flags)) {
            if (DEBUG_BROADCAST_BACKGROUND) {
            if (DEBUG_BROADCAST_BACKGROUND) {
                Slog.i(TAG_BROADCAST,
                Slog.i(TAG_BROADCAST,
                        "Broadcast intent " + intent + " on background offload queue");
                        "Broadcast intent " + cookie + " on background offload queue");
            }
            }
            return mBgOffloadBroadcastQueue;
            return mBgOffloadBroadcastQueue;
        }
        }
        final boolean isFg = (intent.getFlags() & Intent.FLAG_RECEIVER_FOREGROUND) != 0;
        final boolean isFg = (flags & Intent.FLAG_RECEIVER_FOREGROUND) != 0;
        if (DEBUG_BROADCAST_BACKGROUND) Slog.i(TAG_BROADCAST,
        if (DEBUG_BROADCAST_BACKGROUND) Slog.i(TAG_BROADCAST,
                "Broadcast intent " + intent + " on "
                "Broadcast intent " + cookie + " on "
                + (isFg ? "foreground" : "background") + " queue");
                + (isFg ? "foreground" : "background") + " queue");
        return (isFg) ? mFgBroadcastQueue : mBgBroadcastQueue;
        return (isFg) ? mFgBroadcastQueue : mBgBroadcastQueue;
    }
    }
@@ -2323,7 +2331,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids, handlerThread);
        mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids, handlerThread);
        mIntentFirewall = null;
        mIntentFirewall = null;
        mProcessStats = null;
        mProcessStats = new ProcessStatsService(this, mContext.getCacheDir());
        mCpHelper = new ContentProviderHelper(this, false);
        mCpHelper = new ContentProviderHelper(this, false);
        mServices = null;
        mServices = null;
        mSystemThread = null;
        mSystemThread = null;
@@ -2343,6 +2351,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        mPendingStartActivityUids = new PendingStartActivityUids();
        mPendingStartActivityUids = new PendingStartActivityUids();
        mUseFifoUiScheduling = false;
        mUseFifoUiScheduling = false;
        mEnableOffloadQueue = false;
        mEnableOffloadQueue = false;
        mBroadcastQueues = new BroadcastQueue[0];
        mFgBroadcastQueue = mBgBroadcastQueue = mBgOffloadBroadcastQueue =
        mFgBroadcastQueue = mBgBroadcastQueue = mBgOffloadBroadcastQueue =
                mFgOffloadBroadcastQueue = null;
                mFgOffloadBroadcastQueue = null;
        mComponentAliasResolver = new ComponentAliasResolver(this);
        mComponentAliasResolver = new ComponentAliasResolver(this);
@@ -2401,6 +2410,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        mEnableOffloadQueue = SystemProperties.getBoolean(
        mEnableOffloadQueue = SystemProperties.getBoolean(
                "persist.device_config.activity_manager_native_boot.offload_queue_enabled", true);
                "persist.device_config.activity_manager_native_boot.offload_queue_enabled", true);
        mBroadcastQueues = new BroadcastQueue[4];
        mFgBroadcastQueue = new BroadcastQueueImpl(this, mHandler,
        mFgBroadcastQueue = new BroadcastQueueImpl(this, mHandler,
                "foreground", foreConstants, false);
                "foreground", foreConstants, false);
        mBgBroadcastQueue = new BroadcastQueueImpl(this, mHandler,
        mBgBroadcastQueue = new BroadcastQueueImpl(this, mHandler,
@@ -6727,9 +6737,8 @@ public class ActivityManagerService extends IActivityManager.Stub
        // TODO: how set package stopped state should work for sdk sandboxes?
        // TODO: how set package stopped state should work for sdk sandboxes?
        if (!isSdkSandbox) {
        if (!isSdkSandbox) {
            try {
            try {
                AppGlobals.getPackageManager().setPackageStoppedState(
                mPackageManagerInt.setPackageStoppedState(
                        info.packageName, false, UserHandle.getUserId(app.uid));
                        info.packageName, false, UserHandle.getUserId(app.uid));
            } catch (RemoteException e) {
            } catch (IllegalArgumentException e) {
            } catch (IllegalArgumentException e) {
                Slog.w(TAG, "Failed trying to unstop package "
                Slog.w(TAG, "Failed trying to unstop package "
                        + info.packageName + ": " + e);
                        + info.packageName + ": " + e);
@@ -12845,9 +12854,8 @@ public class ActivityManagerService extends IActivityManager.Stub
            // !!! TODO: currently no check here that we're already bound
            // !!! TODO: currently no check here that we're already bound
            // Backup agent is now in use, its package can't be stopped.
            // Backup agent is now in use, its package can't be stopped.
            try {
            try {
                AppGlobals.getPackageManager().setPackageStoppedState(
                mPackageManagerInt.setPackageStoppedState(
                        app.packageName, false, UserHandle.getUserId(app.uid));
                        app.packageName, false, UserHandle.getUserId(app.uid));
            } catch (RemoteException e) {
            } catch (IllegalArgumentException e) {
            } catch (IllegalArgumentException e) {
                Slog.w(TAG, "Failed trying to unstop package "
                Slog.w(TAG, "Failed trying to unstop package "
                        + app.packageName + ": " + e);
                        + app.packageName + ": " + e);
@@ -13328,20 +13336,18 @@ public class ActivityManagerService extends IActivityManager.Stub
        final long origId = Binder.clearCallingIdentity();
        final long origId = Binder.clearCallingIdentity();
        try {
        try {
            boolean doTrim = false;
            boolean doTrim = false;
            synchronized(this) {
            synchronized(this) {
                ReceiverList rl = mRegisteredReceivers.get(receiver.asBinder());
                ReceiverList rl = mRegisteredReceivers.get(receiver.asBinder());
                if (rl != null) {
                if (rl != null) {
                    final BroadcastRecord r = rl.curBroadcast;
                    final BroadcastRecord r = rl.curBroadcast;
                    if (r != null && r == r.queue.getMatchingOrderedReceiver(r)) {
                    if (r != null) {
                        final boolean doNext = r.queue.finishReceiverLocked(
                        final boolean doNext = r.queue.finishReceiverLocked(
                                r, r.resultCode, r.resultData, r.resultExtras,
                                receiver.asBinder(), r.resultCode, r.resultData, r.resultExtras,
                                r.resultAbort, false);
                                r.resultAbort, false);
                        if (doNext) {
                        if (doNext) {
                            doTrim = true;
                            doTrim = true;
                        }
                        }
                    }
                    }
                    if (rl.app != null) {
                    if (rl.app != null) {
                        rl.app.mReceivers.removeReceiver(rl);
                        rl.app.mReceivers.removeReceiver(rl);
                    }
                    }
@@ -14518,22 +14524,10 @@ public class ActivityManagerService extends IActivityManager.Stub
            boolean doNext = false;
            boolean doNext = false;
            BroadcastRecord r;
            BroadcastRecord r;
            BroadcastQueue queue;
            BroadcastQueue queue;
            synchronized(this) {
            synchronized(this) {
                if (isOnFgOffloadQueue(flags)) {
                queue = broadcastQueueForFlags(flags);
                    queue = mFgOffloadBroadcastQueue;
                doNext = queue.finishReceiverLocked(who, resultCode,
                } else if (isOnBgOffloadQueue(flags)) {
                    queue = mBgOffloadBroadcastQueue;
                } else {
                    queue = (flags & Intent.FLAG_RECEIVER_FOREGROUND) != 0
                            ? mFgBroadcastQueue : mBgBroadcastQueue;
                }
                r = queue.getMatchingOrderedReceiver(who);
                if (r != null) {
                    doNext = r.queue.finishReceiverLocked(r, resultCode,
                        resultData, resultExtras, resultAbort, true);
                        resultData, resultExtras, resultAbort, true);
                }
                // updateOomAdjLocked() will be done here
                // updateOomAdjLocked() will be done here
                trimApplicationsLocked(false, OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER);
                trimApplicationsLocked(false, OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER);
            }
            }
+51 −31
Original line number Original line Diff line number Diff line
@@ -16,6 +16,8 @@


package com.android.server.am;
package com.android.server.am;


import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.BroadcastReceiver;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.Intent;
@@ -24,8 +26,11 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoOutputStream;


import com.android.internal.annotations.GuardedBy;

import java.io.FileDescriptor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.Objects;
import java.util.Set;
import java.util.Set;


/**
/**
@@ -34,22 +39,23 @@ import java.util.Set;
public abstract class BroadcastQueue {
public abstract class BroadcastQueue {
    public static final String TAG = "BroadcastQueue";
    public static final String TAG = "BroadcastQueue";


    final ActivityManagerService mService;
    final @NonNull ActivityManagerService mService;
    final Handler mHandler;
    final @NonNull Handler mHandler;
    final BroadcastConstants mConstants;
    final @NonNull BroadcastConstants mConstants;
    final BroadcastSkipPolicy mSkipPolicy;
    final @NonNull BroadcastSkipPolicy mSkipPolicy;
    final String mQueueName;
    final @NonNull String mQueueName;


    BroadcastQueue(ActivityManagerService service, Handler handler,
    BroadcastQueue(@NonNull ActivityManagerService service, @NonNull Handler handler,
            String name, BroadcastConstants constants) {
            @NonNull String name, @NonNull BroadcastConstants constants,
        mService = service;
            @NonNull BroadcastSkipPolicy skipPolicy) {
        mHandler = handler;
        mService = Objects.requireNonNull(service);
        mQueueName = name;
        mHandler = Objects.requireNonNull(handler);
        mConstants = constants;
        mQueueName = Objects.requireNonNull(name);
        mSkipPolicy = new BroadcastSkipPolicy(service);
        mConstants = Objects.requireNonNull(constants);
        mSkipPolicy = Objects.requireNonNull(skipPolicy);
    }
    }


    void start(ContentResolver resolver) {
    void start(@NonNull ContentResolver resolver) {
        mConstants.startObserving(mHandler, resolver);
        mConstants.startObserving(mHandler, resolver);
    }
    }


@@ -60,9 +66,11 @@ public abstract class BroadcastQueue {


    public abstract boolean isDelayBehindServices();
    public abstract boolean isDelayBehindServices();


    public abstract BroadcastRecord getPendingBroadcastLocked();
    @GuardedBy("mService")
    public abstract @Nullable BroadcastRecord getPendingBroadcastLocked();


    public abstract BroadcastRecord getActiveBroadcastLocked();
    @GuardedBy("mService")
    public abstract @Nullable BroadcastRecord getActiveBroadcastLocked();


    /**
    /**
     * Enqueue the given broadcast to be eventually dispatched.
     * Enqueue the given broadcast to be eventually dispatched.
@@ -73,9 +81,8 @@ public abstract class BroadcastQueue {
     * When {@link Intent#FLAG_RECEIVER_REPLACE_PENDING} is set, this method
     * When {@link Intent#FLAG_RECEIVER_REPLACE_PENDING} is set, this method
     * internally handles replacement of any matching broadcasts.
     * internally handles replacement of any matching broadcasts.
     */
     */
    public abstract void enqueueBroadcastLocked(BroadcastRecord r);
    @GuardedBy("mService")

    public abstract void enqueueBroadcastLocked(@NonNull BroadcastRecord r);
    public abstract BroadcastRecord getMatchingOrderedReceiver(IBinder receiver);


    /**
    /**
     * Signal delivered back from a {@link BroadcastReceiver} to indicate that
     * Signal delivered back from a {@link BroadcastReceiver} to indicate that
@@ -83,44 +90,55 @@ public abstract class BroadcastQueue {
     * <p>
     * <p>
     * If this signal isn't delivered back in a timely fashion, we assume the
     * If this signal isn't delivered back in a timely fashion, we assume the
     * receiver has somehow wedged and we trigger an ANR.
     * receiver has somehow wedged and we trigger an ANR.
     *
     * @param receiver the value to match against
     *            {@link BroadcastRecord#receiver} to identify the caller.
     */
     */
    public abstract boolean finishReceiverLocked(BroadcastRecord r, int resultCode,
    @GuardedBy("mService")
            String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices);
    public abstract boolean finishReceiverLocked(@NonNull IBinder receiver, int resultCode,
            @Nullable String resultData, @Nullable Bundle resultExtras, boolean resultAbort,
            boolean waitForServices);


    @GuardedBy("mService")
    public abstract void backgroundServicesFinishedLocked(int userId);
    public abstract void backgroundServicesFinishedLocked(int userId);


    /**
    /**
     * Signal from OS internals that the given process has just been actively
     * Signal from OS internals that the given process has just been actively
     * attached, and is ready to begin receiving broadcasts.
     * attached, and is ready to begin receiving broadcasts.
     */
     */
    public abstract boolean onApplicationAttachedLocked(ProcessRecord app);
    @GuardedBy("mService")
    public abstract boolean onApplicationAttachedLocked(@NonNull ProcessRecord app);


    /**
    /**
     * Signal from OS internals that the given process has timed out during
     * Signal from OS internals that the given process has timed out during
     * an attempted start and attachment.
     * an attempted start and attachment.
     */
     */
    public abstract boolean onApplicationTimeoutLocked(ProcessRecord app);
    @GuardedBy("mService")
    public abstract boolean onApplicationTimeoutLocked(@NonNull ProcessRecord app);


    /**
    /**
     * Signal from OS internals that the given process, which had already been
     * Signal from OS internals that the given process, which had already been
     * previously attached, has now encountered a problem such as crashing or
     * previously attached, has now encountered a problem such as crashing or
     * not responding.
     * not responding.
     */
     */
    public abstract boolean onApplicationProblemLocked(ProcessRecord app);
    @GuardedBy("mService")
    public abstract boolean onApplicationProblemLocked(@NonNull ProcessRecord app);


    /**
    /**
     * Signal from OS internals that the given process has been killed, and is
     * Signal from OS internals that the given process has been killed, and is
     * no longer actively running.
     * no longer actively running.
     */
     */
    public abstract boolean onApplicationCleanupLocked(ProcessRecord app);
    @GuardedBy("mService")
    public abstract boolean onApplicationCleanupLocked(@NonNull ProcessRecord app);


    /**
    /**
     * Signal from OS internals that the given package (or some subset of that
     * Signal from OS internals that the given package (or some subset of that
     * package) has been disabled or uninstalled, and that any pending
     * package) has been disabled or uninstalled, and that any pending
     * broadcasts should be cleaned up.
     * broadcasts should be cleaned up.
     */
     */
    public abstract boolean cleanupDisabledPackageReceiversLocked(
    @GuardedBy("mService")
            String packageName, Set<String> filterByClasses, int userId, boolean doit);
    public abstract boolean cleanupDisabledPackageReceiversLocked(@Nullable String packageName,
            @Nullable Set<String> filterByClasses, int userId, boolean doit);


    /**
    /**
     * Quickly determine if this queue has broadcasts that are still waiting to
     * Quickly determine if this queue has broadcasts that are still waiting to
@@ -133,7 +151,7 @@ public abstract class BroadcastQueue {
    /**
    /**
     * Brief summary of internal state, useful for debugging purposes.
     * Brief summary of internal state, useful for debugging purposes.
     */
     */
    public abstract String describeState();
    public abstract @NonNull String describeState();


    /**
    /**
     * Flush any broadcasts still waiting to be delivered, causing them to be
     * Flush any broadcasts still waiting to be delivered, causing them to be
@@ -143,8 +161,10 @@ public abstract class BroadcastQueue {
     */
     */
    public abstract void flush();
    public abstract void flush();


    public abstract void dumpDebug(ProtoOutputStream proto, long fieldId);
    public abstract void dumpDebug(@NonNull ProtoOutputStream proto, long fieldId);


    public abstract boolean dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args,
    @GuardedBy("mService")
            int opti, boolean dumpAll, String dumpPackage, boolean needSep);
    public abstract boolean dumpLocked(@NonNull FileDescriptor fd, @NonNull PrintWriter pw,
            @NonNull String[] args, int opti, boolean dumpAll, @Nullable String dumpPackage,
            boolean needSep);
}
}
+30 −7
Original line number Original line Diff line number Diff line
@@ -42,7 +42,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.app.Activity;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager;
import android.app.AppGlobals;
import android.app.BroadcastOptions;
import android.app.BroadcastOptions;
import android.app.IApplicationThread;
import android.app.IApplicationThread;
import android.app.RemoteServiceException.CannotDeliverBroadcastException;
import android.app.RemoteServiceException.CannotDeliverBroadcastException;
@@ -213,7 +212,14 @@ public class BroadcastQueueImpl extends BroadcastQueue {


    BroadcastQueueImpl(ActivityManagerService service, Handler handler,
    BroadcastQueueImpl(ActivityManagerService service, Handler handler,
            String name, BroadcastConstants constants, boolean allowDelayBehindServices) {
            String name, BroadcastConstants constants, boolean allowDelayBehindServices) {
        super(service, handler, name, constants);
        this(service, handler, name, constants, new BroadcastSkipPolicy(service),
                allowDelayBehindServices);
    }

    BroadcastQueueImpl(ActivityManagerService service, Handler handler,
            String name, BroadcastConstants constants, BroadcastSkipPolicy skipPolicy,
            boolean allowDelayBehindServices) {
        super(service, handler, name, constants, skipPolicy);
        mHandler = new BroadcastHandler(handler.getLooper());
        mHandler = new BroadcastHandler(handler.getLooper());
        mDelayBehindServices = allowDelayBehindServices;
        mDelayBehindServices = allowDelayBehindServices;
        mDispatcher = new BroadcastDispatcher(this, mConstants, mHandler, mService);
        mDispatcher = new BroadcastDispatcher(this, mConstants, mHandler, mService);
@@ -520,11 +526,18 @@ public class BroadcastQueueImpl extends BroadcastQueue {


    public BroadcastRecord getMatchingOrderedReceiver(IBinder receiver) {
    public BroadcastRecord getMatchingOrderedReceiver(IBinder receiver) {
        BroadcastRecord br = mDispatcher.getActiveBroadcastLocked();
        BroadcastRecord br = mDispatcher.getActiveBroadcastLocked();
        if (br != null && br.receiver == receiver) {
        if (br == null) {
            return br;
            Slog.w(TAG_BROADCAST, "getMatchingOrderedReceiver [" + mQueueName
                    + "] no active broadcast");
            return null;
        }
        }
        if (br.receiver != receiver) {
            Slog.w(TAG_BROADCAST, "getMatchingOrderedReceiver [" + mQueueName
                    + "] active broadcast " + br.receiver + " doesn't match " + receiver);
            return null;
            return null;
        }
        }
        return br;
    }


    // > 0 only, no worry about "eventual" recycling
    // > 0 only, no worry about "eventual" recycling
    private int nextSplitTokenLocked() {
    private int nextSplitTokenLocked() {
@@ -551,6 +564,17 @@ public class BroadcastQueueImpl extends BroadcastQueue {
        }, msgToken, (r.receiverTime + mConstants.ALLOW_BG_ACTIVITY_START_TIMEOUT));
        }, msgToken, (r.receiverTime + mConstants.ALLOW_BG_ACTIVITY_START_TIMEOUT));
    }
    }


    public boolean finishReceiverLocked(IBinder receiver, int resultCode,
            String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices) {
        final BroadcastRecord r = getMatchingOrderedReceiver(receiver);
        if (r != null) {
            return finishReceiverLocked(r, resultCode,
                    resultData, resultExtras, resultAbort, waitForServices);
        } else {
            return false;
        }
    }

    public boolean finishReceiverLocked(BroadcastRecord r, int resultCode,
    public boolean finishReceiverLocked(BroadcastRecord r, int resultCode,
            String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices) {
            String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices) {
        final int state = r.state;
        final int state = r.state;
@@ -1354,9 +1378,8 @@ public class BroadcastQueueImpl extends BroadcastQueue {


        // Broadcast is being executed, its package can't be stopped.
        // Broadcast is being executed, its package can't be stopped.
        try {
        try {
            AppGlobals.getPackageManager().setPackageStoppedState(
            mService.mPackageManagerInt.setPackageStoppedState(
                    r.curComponent.getPackageName(), false, r.userId);
                    r.curComponent.getPackageName(), false, r.userId);
        } catch (RemoteException e) {
        } catch (IllegalArgumentException e) {
        } catch (IllegalArgumentException e) {
            Slog.w(TAG, "Failed trying to unstop package "
            Slog.w(TAG, "Failed trying to unstop package "
                    + r.curComponent.getPackageName() + ": " + e);
                    + r.curComponent.getPackageName() + ": " + e);
Loading