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

Commit bc617597 authored by Makoto Onuki's avatar Makoto Onuki
Browse files

Start using the real ActivityThread constructor

Bug: 418786021
Flag: TEST_ONLY
Test: $ANDROID_BUILD_TOP/frameworks/base/ravenwood/scripts/run-ravenwood-tests.sh
Change-Id: I59baa03cd3eb5224319ab20af32a6a8212e51d88
parent c02edcb7
Loading
Loading
Loading
Loading
+63 −26
Original line number Diff line number Diff line
@@ -18,8 +18,8 @@ package android.app;

import static android.app.ActivityManager.PROCESS_STATE_UNKNOWN;
import static android.app.ConfigurationController.createNewConfigAndUpdateIfNotNull;
import static android.app.Flags.skipBgMemTrimOnFgApp;
import static android.app.Flags.earlyRenderThreadPriorityBoost;
import static android.app.Flags.skipBgMemTrimOnFgApp;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.app.servertransaction.ActivityLifecycleItem.ON_CREATE;
@@ -45,8 +45,6 @@ import static com.android.internal.os.SafeZipPathValidatorCallback.VALIDATE_ZIP_
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityOptions.SceneTransitionInfo;
import android.app.HandoffActivityData;
import android.app.HandoffActivityDataRequestInfo;
import android.app.RemoteServiceException.BadForegroundServiceNotificationException;
import android.app.RemoteServiceException.BadUserInitiatedJobNotificationException;
import android.app.RemoteServiceException.CannotPostForegroundServiceNotificationException;
@@ -183,7 +181,11 @@ import android.provider.Downloads;
import android.provider.FontsContract;
import android.provider.Settings;
import android.ravenwood.annotation.RavenwoodIgnore;
import android.ravenwood.annotation.RavenwoodRedirect;
import android.ravenwood.annotation.RavenwoodKeep;
import android.ravenwood.annotation.RavenwoodKeepPartialClass;
import android.ravenwood.annotation.RavenwoodKeepWholeClass;
import android.ravenwood.annotation.RavenwoodReplace;
import android.ravenwood.annotation.RavenwoodThrow;
import android.renderscript.RenderScriptCacheDir;
import android.se.omapi.SeFrameworkInitializer;
import android.se.omapi.SeServiceManager;
@@ -303,9 +305,10 @@ import java.util.function.Consumer;
 *
 * {@hide}
 */
@android.ravenwood.annotation.RavenwoodPartiallyAllowlisted
@android.ravenwood.annotation.RavenwoodKeepPartialClass(
        comment = "We use Objenesis to instantiate it. No member fields are initialized."
@android.ravenwood.annotation.RavenwoodKeepPartialClass(comment =
        "Initialization logic is in ActivityThread_ravenwood and RavenwoodAppDriver."
        + " Only very basic initialization is done."
        + " Most of its logic is not ported to Ravenwood yet."
)
@android.ravenwood.annotation.RavenwoodRedirectionClass("ActivityThread_ravenwood")
public final class ActivityThread extends ClientTransactionHandler
@@ -313,6 +316,11 @@ public final class ActivityThread extends ClientTransactionHandler

    private final DdmSyncStageUpdater mDdmSyncStageUpdater = newDdmSyncStageUpdater();

    @RavenwoodIgnore
    private static DdmSyncStageUpdater newDdmSyncStageUpdater() {
        return new DdmSyncStageUpdater();
    }

    /** @hide */
    public static final String TAG = "ActivityThread";
    static final boolean localLOGV = false;
@@ -522,6 +530,11 @@ public final class ActivityThread extends ClientTransactionHandler
    // An executor that performs multi-step transactions.
    private final TransactionExecutor mTransactionExecutor = newTransactionExecutor(this);

    @RavenwoodIgnore
    private static TransactionExecutor newTransactionExecutor(ActivityThread at) {
        return new TransactionExecutor(at);
    }

    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
    private final ResourcesManager mResourcesManager;

@@ -1146,7 +1159,12 @@ public final class ActivityThread extends ClientTransactionHandler
        int index;
    }

    @RavenwoodKeepPartialClass
    private class ApplicationThread extends IApplicationThread.Stub {
        @RavenwoodKeep
        ApplicationThread() {
        }

        private static final String DB_CONNECTION_INFO_HEADER = "  %8s %8s %14s %5s %5s %5s  %s";
        private static final String DB_CONNECTION_INFO_FORMAT = "  %8s %8s %14s %5d %5d %5d  %s";
        private static final String DB_POOL_INFO_HEADER = "  %13s %13s %13s  %s";
@@ -1324,6 +1342,7 @@ public final class ActivityThread extends ClientTransactionHandler
        }

        @Override
        @RavenwoodThrow(comment = "See ActivityThread_ravenwood for initialization on Ravenwood")
        public final void bindApplication(
                String processName,
                ApplicationInfo appInfo,
@@ -2471,7 +2490,12 @@ public final class ActivityThread extends ClientTransactionHandler
        throw new ForegroundServiceDidNotStopInTimeException(message, inner);
    }

    @RavenwoodKeepPartialClass
    class H extends Handler {
        @RavenwoodKeep
        H() {
        }

        public static final int BIND_APPLICATION        = 110;
        @UnsupportedAppUsage
        public static final int EXIT_APPLICATION        = 111;
@@ -2965,8 +2989,10 @@ public final class ActivityThread extends ClientTransactionHandler
        }
    }

    @RavenwoodKeepWholeClass(comment = "needed by ActivityThread constructor")
    final class GcIdler implements MessageQueue.IdleHandler {
        @Override
        @RavenwoodIgnore
        public final boolean queueIdle() {
            doGcIfNeeded();
            purgePendingResources();
@@ -2974,15 +3000,32 @@ public final class ActivityThread extends ClientTransactionHandler
        }
    }

    @RavenwoodKeepWholeClass(comment = "needed by ActivityThread constructor")
    final class PurgeIdler implements MessageQueue.IdleHandler {
        @Override
        @RavenwoodIgnore
        public boolean queueIdle() {
            purgePendingResources();
            return false;
        }
    }

    /** Backdoor to set private static fields */
    @RavenwoodReplace
    static void staticInitForRavenwood(
            ActivityThread instance
    ) {
        throw new IllegalStateException(); // shouldn't be called on a real device.
    }

    static void staticInitForRavenwood$ravenwood(
            ActivityThread instance
    ) {
        sCurrentActivityThread = instance;
    }

    @UnsupportedAppUsage
    @RavenwoodKeep
    public static ActivityThread currentActivityThread() {
        return sCurrentActivityThread;
    }
@@ -3018,7 +3061,7 @@ public final class ActivityThread extends ClientTransactionHandler
    }

    @UnsupportedAppUsage
    @android.ravenwood.annotation.RavenwoodRedirect
    @RavenwoodKeep
    public static Application currentApplication() {
        ActivityThread am = currentActivityThread();
        return am != null ? am.mInitialApplication : null;
@@ -3028,7 +3071,7 @@ public final class ActivityThread extends ClientTransactionHandler
     * Same as {@code ActivityThread.currentActivityThread().getSystemContext()}, but
     * it'll return a {@link Context} (not a {@link ContextImpl}) and is supported on Ravenwood.
     */
    @android.ravenwood.annotation.RavenwoodRedirect
    @RavenwoodKeep
    public static Context currentSystemContext() {
        ActivityThread am = currentActivityThread();
        return am != null ? am.getSystemContext() : null;
@@ -3067,7 +3110,7 @@ public final class ActivityThread extends ClientTransactionHandler
    }

    @UnsupportedAppUsage
    @RavenwoodRedirect
    @RavenwoodKeep
    public Handler getHandler() {
        return mH;
    }
@@ -3266,6 +3309,7 @@ public final class ActivityThread extends ClientTransactionHandler
    }

    @UnsupportedAppUsage
    @RavenwoodKeep
    ActivityThread() {
        mResourcesManager = ResourcesManager.getInstance();
    }
@@ -3290,6 +3334,7 @@ public final class ActivityThread extends ClientTransactionHandler
    }

    @UnsupportedAppUsage
    @RavenwoodKeep
    public Instrumentation getInstrumentation()
    {
        return mInstrumentation;
@@ -3305,12 +3350,12 @@ public final class ActivityThread extends ClientTransactionHandler
    }

    @UnsupportedAppUsage
    @RavenwoodRedirect
    @RavenwoodKeep
    public Looper getLooper() {
        return mLooper;
    }

    @RavenwoodRedirect
    @RavenwoodKeep
    public Executor getExecutor() {
        return mExecutor;
    }
@@ -3328,17 +3373,7 @@ public final class ActivityThread extends ClientTransactionHandler

    @Override
    @UnsupportedAppUsage
    // It returns a ContextImpl, which is not supported on Ravenwood yet, and it might never be
    // supported. We want to change the return type to Context so support it on Ravenwood,
    // but the @UnsupportedAppUsage prevents us from doing it, so for now we just update
    // clients to use currentSystemContext() instead.
    // If any clients need to use getSystemContext() on a non-"current" ActivityThread, we'd need
    // add another getter with the return type of Context.
    //
    // (Class is only partially allow-listed, and this method can't have a ravenwood annotation.)
    // @android.ravenwood.annotation.RavenwoodThrow(
    //        reason = "ContextImpl is not supported on Ravenwood. You may wan to use "
    //        + " ActivityThread.currentSystemContext() instead")
    @RavenwoodKeep
    public ContextImpl getSystemContext() {
        synchronized (this) {
            if (mSystemContext == null) {
@@ -7672,6 +7707,7 @@ public final class ActivityThread extends ClientTransactionHandler
    }

    @UnsupportedAppUsage
    @RavenwoodThrow(comment = "See ActivityThread_ravenwood for initialization on Ravenwood")
    private void handleBindApplication(AppBindData data) {
        mDdmSyncStageUpdater.next(Stage.Bind);

@@ -9095,6 +9131,7 @@ public final class ActivityThread extends ClientTransactionHandler
        return mCoreSettings;
    }

    @RavenwoodThrow(comment = "See ActivityThread_ravenwood for initialization on Ravenwood")
    public static void main(String[] args) {
        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");

@@ -9236,7 +9273,7 @@ public final class ActivityThread extends ClientTransactionHandler
        return false;
    }

    @RavenwoodIgnore
    @RavenwoodIgnore(reason = "LoadedApk calls it, but we don't need to keep track of it yet")
    void addApplication(@NonNull Application app) {
        mAllApplications.add(app);
        VMDebug.addApplication(app.mLoadedApk.mPackageName);
+14 −35
Original line number Diff line number Diff line
@@ -15,52 +15,31 @@
 */
package android.app;

import android.content.Context;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.Looper;
import android.platform.test.ravenwood.RavenwoodAppDriver;
import static org.junit.Assert.assertEquals;

import java.util.concurrent.Executor;
import android.os.Looper;

/**
 * Inject Ravenwood methods to {@link ActivityThread}.
 *
 * TODO: Stop using Objensis to instantiate ActivityThread and start using more of the
 * real code, rather than handling all methods here with @RavenwoodRedirect.
 * At that point, the initialization logic should be moved from RavenwoodAppDriver to this class.
 * TODO: Move the initialization logic from {@link RavenwoodAppDriver} to this class.
 * TODO: Port more initialization logic from {@link ActivityThread}.
 */
public final class ActivityThread_ravenwood {
    private ActivityThread_ravenwood() {
    }

    /** Backdoor to set ActivityThread's package-private member field. */
    public static void setInstrumentation(ActivityThread at, Instrumentation inst) {
        at.mInstrumentation = inst;
    }

    private static final Handler sHandler = new Handler(Looper.getMainLooper());
    private static final HandlerExecutor sHandlerExecutor = new HandlerExecutor(sHandler);

    /** Override the corresponding ActivityThread method. */
    public static Context currentSystemContext() {
        return RavenwoodAppDriver.getInstance().getAndroidAppBridge().getSystemContext();
    }

    /** Override the corresponding ActivityThread method. */
    public static Application currentApplication() {
        return RavenwoodAppDriver.getInstance().getApplication();
    }

    static Looper getLooper(ActivityThread at) {
        return Looper.getMainLooper();
    }
    /**
     * Create a new instance, and also set it to sCurrentActivityThread.
     * @return
     */
    public static ActivityThread createInstance() {
        // This must be called on the main thread.
        assertEquals(Looper.getMainLooper().getThread(), Thread.currentThread());
        final var at = new ActivityThread();

    static Handler getHandler(ActivityThread at) {
        return sHandler;
    }
        ActivityThread.staticInitForRavenwood(at);

    static Executor getExecutor(ActivityThread at) {
        return sHandlerExecutor;
        return at;
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.res.Configuration;
import android.os.IBinder;
import android.ravenwood.annotation.RavenwoodKeepWholeClass;
import android.util.MergedConfiguration;
import android.view.SurfaceControl;
import android.window.ActivityWindowInfo;
@@ -45,6 +46,7 @@ import java.util.Map;
 *
 * @hide
 */
@RavenwoodKeepWholeClass
public abstract class ClientTransactionHandler {

    private boolean mIsExecutingLocalTransaction;
+2 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.app;

import android.annotation.NonNull;
import android.os.IBinder;
import android.ravenwood.annotation.RavenwoodKeepWholeClass;

import com.android.internal.annotations.GuardedBy;

@@ -30,6 +31,7 @@ import java.util.function.Consumer;
 * Manages listeners for unfiltered configuration changes.
 * @hide
 */
@RavenwoodKeepWholeClass
class ConfigurationChangedListenerController {

    private final Object mLock = new Object();
+0 −24
Original line number Diff line number Diff line
@@ -15,39 +15,15 @@
 */
package android.app;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;

import android.content.Context;
import android.content.pm.PackageManager;
import android.os.FileUtils;
import android.platform.test.ravenwood.RavenwoodPackageManager;

import java.io.File;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public class ContextImpl_ravenwood {
    private static final String TAG = "ContextImpl_ravenwood";

    /** Indicates a {@link Context} is really a {@link ContextImpl}. */
    @Target({FIELD, METHOD, PARAMETER})
    @Retention(RetentionPolicy.SOURCE)
    public @interface ReallyContextImpl {
    }

    /** Backdoor to a package-private method. */
    public static ContextImpl createSystemContext(ActivityThread at) {
        return ContextImpl.createSystemContext(at);
    }

    /** Backdoor to a package-private method. */
    public static ContextImpl createAppContext(ActivityThread at, LoadedApk la) {
        return ContextImpl.createAppContext(at, la);
    }

    static PackageManager getPackageManagerInner(ContextImpl contextImpl) {
        return new RavenwoodPackageManager(contextImpl);
    }
Loading