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

Commit 671c3e1e authored by Shai Barack's avatar Shai Barack
Browse files

Disable concurrent mode when instrumentation is loaded

This fixes some platform tests that rely on reflection to access MessageQueue internals.

Flag: build.RELEASE_PACKAGE_MESSAGEQUEUE_IMPLEMENTATION

Change-Id: I8ba0a6e38e02341c234fb5a2a2e6fd26cc64f58f
parent fc463999
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.os;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.TestApi;
import android.app.ActivityThread;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Process;
import android.os.UserHandle;
@@ -111,7 +112,20 @@ public final class MessageQueue {
    private native static void nativeSetFileDescriptorEvents(long ptr, int fd, int events);

    MessageQueue(boolean quitAllowed) {
        mUseConcurrent = UserHandle.isCore(Process.myUid()) && !VMDebug.isDebuggingEnabled();
        // Concurrent mode modifies behavior that is observable via reflection and is commonly used
        // by tests.
        // For now, we limit it to system processes to avoid breaking apps and their tests.
        mUseConcurrent = UserHandle.isCore(Process.myUid());
        // Even then, we don't use it if instrumentation is loaded as it breaks some
        // platform tests.
        final ActivityThread activityThread = ActivityThread.currentActivityThread();
        if (activityThread != null) {
            final Instrumentation instrumentation = activityThread.getInstrumentation();
            mUseConcurrent &= instrumentation == null || !instrumentation.isInstrumenting();
        }
        // We can lift this restriction in the future after we've made it possible for test authors
        // to test Looper and MessageQueue without resorting to reflection.

        mQuitAllowed = quitAllowed;
        mPtr = nativeInit();
    }