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

Commit e68b5c19 authored by Eric Lin's avatar Eric Lin
Browse files

Remove ClientTransaction object pool usages (2/n).

Eliminate the use of ObjectPool in the creation and management of
ClientTransaction objects. Instead of obtaining transactions from
the pool, they are now directly instantiated. This simplifies
transaction handling and aligns with the deprecation of the
ObjectPool mechanism.

This change also removes the unnecessary recycling of ClientTransaction
objects in the ClientLifecycleManager.  As part of the cleanup,
unnecessary code related to local transaction recycling in
ActivityThread was also removed.

Bug: 311089192
Test: atest FrameworksCoreTests:ActivityThreadTest
Test: atest FrameworksCoreTests:ClientTransactionTests
Test: atest FrameworksCoreTests:ObjectPoolTests
Test: atest FrameworksCoreTests:TransactionExecutorTests
Test: atest FrameworksCoreTests:TransactionParcelTests
Test: atest WmTests:ClientLifecycleManagerTests
Flag: EXEMPT removing com.android.window.flags.disable_object_pool
Change-Id: Ib025874410ef09bc2487007642a321c934d52cef
parent 0bfc28ae
Loading
Loading
Loading
Loading
+4 −11
Original line number Diff line number Diff line
@@ -2636,13 +2636,6 @@ public final class ActivityThread extends ClientTransactionHandler
                    } finally {
                        controller.onClientTransactionFinished();
                    }
                    if (isSystem()) {
                        // Client transactions inside system process are recycled on the client side
                        // instead of ClientLifecycleManager to avoid being cleared before this
                        // message is handled.
                        transaction.recycle();
                    }
                    // TODO(lifecycler): Recycle locally scheduled transactions.
                    break;
                case RELAUNCH_ACTIVITY:
                    handleRelaunchActivityLocally((IBinder) msg.obj);
@@ -3824,7 +3817,7 @@ public final class ActivityThread extends ClientTransactionHandler
                + " req=" + requestCode + " res=" + resultCode + " data=" + data);
        final ArrayList<ResultInfo> list = new ArrayList<>();
        list.add(new ResultInfo(id, requestCode, resultCode, data, activityToken));
        final ClientTransaction clientTransaction = ClientTransaction.obtain(mAppThread);
        final ClientTransaction clientTransaction = new ClientTransaction(mAppThread);
        final ActivityResultItem activityResultItem = ActivityResultItem.obtain(
                activityToken, list);
        clientTransaction.addTransactionItem(activityResultItem);
@@ -4620,7 +4613,7 @@ public final class ActivityThread extends ClientTransactionHandler
    }

    private void schedulePauseWithUserLeavingHint(ActivityClientRecord r) {
        final ClientTransaction transaction = ClientTransaction.obtain(mAppThread);
        final ClientTransaction transaction = new ClientTransaction(mAppThread);
        final PauseActivityItem pauseActivityItem = PauseActivityItem.obtain(r.token,
                r.activity.isFinishing(), /* userLeaving */ true,
                /* dontReport */ false, /* autoEnteringPip */ false);
@@ -4629,7 +4622,7 @@ public final class ActivityThread extends ClientTransactionHandler
    }

    private void scheduleResume(ActivityClientRecord r) {
        final ClientTransaction transaction = ClientTransaction.obtain(mAppThread);
        final ClientTransaction transaction = new ClientTransaction(mAppThread);
        final ResumeActivityItem resumeActivityItem = ResumeActivityItem.obtain(r.token,
                /* isForward */ false, /* shouldSendCompatFakeFocus */ false);
        transaction.addTransactionItem(resumeActivityItem);
@@ -6254,7 +6247,7 @@ public final class ActivityThread extends ClientTransactionHandler
        final ActivityLifecycleItem lifecycleRequest =
                TransactionExecutorHelper.getLifecycleRequestForCurrentState(r);
        // Schedule the transaction.
        final ClientTransaction transaction = ClientTransaction.obtain(mAppThread);
        final ClientTransaction transaction = new ClientTransaction(mAppThread);
        transaction.addTransactionItem(activityRelaunchItem);
        transaction.addTransactionItem(lifecycleRequest);
        executeTransaction(transaction);
+1 −1
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import java.util.Map;
/**
 * Defines operations that a {@link android.app.servertransaction.ClientTransaction} or its items
 * can perform on client.
 *
 * @hide
 */
public abstract class ClientTransactionHandler {
@@ -68,7 +69,6 @@ public abstract class ClientTransactionHandler {
            getTransactionExecutor().execute(transaction);
        } finally {
            mIsExecutingLocalTransaction = false;
            transaction.recycle();
        }
    }

+38 −41
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package android.app.servertransaction;

import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;

import static java.util.Objects.requireNonNull;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ClientTransactionHandler;
@@ -30,7 +32,6 @@ import android.os.Parcelable;
import android.os.RemoteException;

import com.android.internal.annotations.VisibleForTesting;
import com.android.window.flags.Flags;

import java.io.PrintWriter;
import java.util.ArrayList;
@@ -46,7 +47,7 @@ import java.util.Objects;
 * @see ActivityLifecycleItem
 * @hide
 */
public class ClientTransaction implements Parcelable, ObjectPoolItem {
public class ClientTransaction implements Parcelable {

    /**
     * List of transaction items that should be executed in order. Including both
@@ -76,10 +77,39 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
    @Nullable
    private IBinder mActivityToken;

    /** Target client. */
    private IApplicationThread mClient;
    /**
     * The target client.
     * <p>
     * This field is null only if the object is:
     * - Read from a Parcel on the client side.
     * - Constructed for testing purposes.
     * <p>
     * When created directly on the server, this field represents the server's connection to the
     * target client's application thread. It is omitted during parceling and not sent to the
     * client. On the client side, this field becomes unnecessary.
     */
    @Nullable
    private final IApplicationThread mClient;

    @VisibleForTesting
    public ClientTransaction() {
        mClient = null;
    }

    /** Get the target client of the transaction. */
    public ClientTransaction(@NonNull IApplicationThread client) {
        mClient = requireNonNull(client);
    }

    /**
     * Gets the target client associated with this transaction.
     * <p>
     * This method is intended for server-side use only. Calling it from the client side
     * will always return {@code null}.
     *
     * @return the {@link IApplicationThread} representing the target client, or {@code null} if
     * called from the client side.
     * @see #mClient
     */
    public IApplicationThread getClient() {
        return mClient;
    }
@@ -211,51 +241,18 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
        mClient.scheduleTransaction(this);
    }


    // ObjectPoolItem implementation

    private ClientTransaction() {}

    /** Obtains an instance initialized with provided params. */
    @NonNull
    public static ClientTransaction obtain(@Nullable IApplicationThread client) {
        ClientTransaction instance = ObjectPool.obtain(ClientTransaction.class);
        if (instance == null) {
            instance = new ClientTransaction();
        }
        instance.mClient = client;

        return instance;
    }

    @Override
    public void recycle() {
        if (Flags.disableObjectPool()) {
            return;
        }
        int size = mTransactionItems.size();
        for (int i = 0; i < size; i++) {
            mTransactionItems.get(i).recycle();
        }
        mTransactionItems.clear();
        mActivityCallbacks = null;
        mLifecycleStateRequest = null;
        mClient = null;
        mActivityToken = null;
        ObjectPool.recycle(this);
    }

    // Parcelable implementation

    /** Write to Parcel. */
    /** Writes to Parcel. */
    @SuppressWarnings("AndroidFrameworkEfficientParcelable") // Item class is not final.
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeParcelableList(mTransactionItems, flags);
    }

    /** Read from Parcel. */
    /** Reads from Parcel. */
    private ClientTransaction(@NonNull Parcel in) {
        mClient = null;  // This field is unnecessary on the client side.
        in.readParcelableList(mTransactionItems, getClass().getClassLoader(),
                ClientTransactionItem.class);

+2 −2
Original line number Diff line number Diff line
@@ -78,10 +78,10 @@ import android.window.ActivityWindowInfo;
import android.window.WindowContextInfo;
import android.window.WindowTokenClientController;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;

import com.android.internal.content.ReferrerIntent;

@@ -1047,7 +1047,7 @@ public class ActivityThreadTest {

    @NonNull
    private static ClientTransaction newTransaction(@NonNull ActivityThread activityThread) {
        return ClientTransaction.obtain(activityThread.getApplicationThread());
        return new ClientTransaction(activityThread.getApplicationThread());
    }

    // Test activity
+2 −2
Original line number Diff line number Diff line
@@ -23,8 +23,8 @@ import static org.mockito.Mockito.verify;
import android.app.ClientTransactionHandler;
import android.platform.test.annotations.Presubmit;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;
@@ -52,7 +52,7 @@ public class ClientTransactionTests {
        final ClientTransactionHandler clientTransactionHandler =
                mock(ClientTransactionHandler.class);

        final ClientTransaction transaction = ClientTransaction.obtain(null /* client */);
        final ClientTransaction transaction = new ClientTransaction();
        transaction.addTransactionItem(callback1);
        transaction.addTransactionItem(callback2);
        transaction.addTransactionItem(stateRequest);
Loading