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

Commit 296cdc88 authored by Makoto Onuki's avatar Makoto Onuki Committed by Android (Google) Code Review
Browse files

Merge "Start using the real ActivityThread constructor" into main

parents 914ea599 bc617597
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