diff options
| author | 2024-07-24 03:43:00 +0000 | |
|---|---|---|
| committer | 2024-07-24 03:43:00 +0000 | |
| commit | 54b1fa9c4a69b719b406f3b51c4b024c9abd00e7 (patch) | |
| tree | d1665c6bcfa9af70ce1b7f5ca05ce57058f8a92a | |
| parent | f3666374e920a62ee6dd0c0fafd19bab96618e28 (diff) | |
| parent | bf6e6a269306add96de96c94156573a313cac072 (diff) | |
Merge "Remove LaunchActivityItem object pooling (12/n)." into main
5 files changed, 171 insertions, 198 deletions
diff --git a/core/java/android/app/servertransaction/LaunchActivityItem.java b/core/java/android/app/servertransaction/LaunchActivityItem.java index 7819e1ef94c6..235a9f7aeb4c 100644 --- a/core/java/android/app/servertransaction/LaunchActivityItem.java +++ b/core/java/android/app/servertransaction/LaunchActivityItem.java @@ -20,9 +20,12 @@ import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; 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.ActivityClient; +import android.app.ActivityManager.ProcessState; import android.app.ActivityOptions.SceneTransitionInfo; import android.app.ActivityThread.ActivityClientRecord; import android.app.ClientTransactionHandler; @@ -52,41 +55,148 @@ import java.util.Objects; /** * Request to launch an activity. + * * @hide */ public class LaunchActivityItem extends ClientTransactionItem { - private IBinder mActivityToken; + @NonNull + private final IBinder mActivityToken; + + // TODO(b/170729553): Mark this with @NonNull and final once @UnsupportedAppUsage removed. + // We cannot do it now to avoid app compatibility regression. @UnsupportedAppUsage private Intent mIntent; - private int mIdent; + + // TODO(b/170729553): Mark this with @NonNull and final once @UnsupportedAppUsage removed. + // We cannot do it now to avoid app compatibility regression. @UnsupportedAppUsage private ActivityInfo mInfo; - private Configuration mCurConfig; - private Configuration mOverrideConfig; - private int mDeviceId; - private String mReferrer; - private IVoiceInteractor mVoiceInteractor; - private int mProcState; - private Bundle mState; - private PersistableBundle mPersistentState; - private List<ResultInfo> mPendingResults; - private List<ReferrerIntent> mPendingNewIntents; - private SceneTransitionInfo mSceneTransitionInfo; - private boolean mIsForward; - private ProfilerInfo mProfilerInfo; - private IBinder mAssistToken; - private IBinder mShareableActivityToken; - private boolean mLaunchedFromBubble; - private IBinder mTaskFragmentToken; - private IBinder mInitialCallerInfoAccessToken; - private ActivityWindowInfo mActivityWindowInfo; + + @NonNull + private final Configuration mCurConfig; + + @NonNull + private final Configuration mOverrideConfig; + + @Nullable + private final String mReferrer; + + @Nullable + private final IVoiceInteractor mVoiceInteractor; + + @Nullable + private final Bundle mState; + + @Nullable + private final PersistableBundle mPersistentState; + + @Nullable + private final List<ResultInfo> mPendingResults; + + @Nullable + private final List<ReferrerIntent> mPendingNewIntents; + + @Nullable + private final SceneTransitionInfo mSceneTransitionInfo; + + @Nullable + private final ProfilerInfo mProfilerInfo; + + @NonNull + private final IBinder mAssistToken; + + @NonNull + private final IBinder mShareableActivityToken; + + @Nullable + private final IBinder mTaskFragmentToken; + + @NonNull + private final IBinder mInitialCallerInfoAccessToken; + + @NonNull + private final ActivityWindowInfo mActivityWindowInfo; /** * It is only non-null if the process is the first time to launch activity. It is only an * optimization for quick look up of the interface so the field is ignored for comparison. */ - private IActivityClientController mActivityClientController; + @Nullable + private final IActivityClientController mActivityClientController; + + private final int mIdent; + private final int mDeviceId; + private final int mProcState; + private final boolean mIsForward; + private final boolean mLaunchedFromBubble; + + public LaunchActivityItem(@NonNull IBinder activityToken, @NonNull Intent intent, + int ident, @NonNull ActivityInfo info, @NonNull Configuration curConfig, + @NonNull Configuration overrideConfig, int deviceId, @Nullable String referrer, + @Nullable IVoiceInteractor voiceInteractor, @ProcessState int procState, + @Nullable Bundle state, @Nullable PersistableBundle persistentState, + @Nullable List<ResultInfo> pendingResults, + @Nullable List<ReferrerIntent> pendingNewIntents, + @Nullable SceneTransitionInfo sceneTransitionInfo, + boolean isForward, @Nullable ProfilerInfo profilerInfo, @NonNull IBinder assistToken, + @Nullable IActivityClientController activityClientController, + @NonNull IBinder shareableActivityToken, boolean launchedFromBubble, + @Nullable IBinder taskFragmentToken, @NonNull IBinder initialCallerInfoAccessToken, + @NonNull ActivityWindowInfo activityWindowInfo) { + this(activityToken, ident, new Configuration(curConfig), new Configuration(overrideConfig), + deviceId, referrer, voiceInteractor, procState, + state != null ? new Bundle(state) : null, + persistentState != null ? new PersistableBundle(persistentState) : null, + pendingResults != null ? new ArrayList<>(pendingResults) : null, + pendingNewIntents != null ? new ArrayList<>(pendingNewIntents) : null, + sceneTransitionInfo, isForward, + profilerInfo != null ? new ProfilerInfo(profilerInfo) : null, + assistToken, activityClientController, shareableActivityToken, launchedFromBubble, + taskFragmentToken, initialCallerInfoAccessToken, + new ActivityWindowInfo(activityWindowInfo)); + mIntent = new Intent(intent); + mInfo = new ActivityInfo(info); + } + + // TODO(b/170729553): Merge this constructor with previous one if no @UnsupportedAppUsage filed. + // We cannot do it now to avoid app compatibility regression. + private LaunchActivityItem(@NonNull IBinder activityToken, int ident, + @NonNull Configuration curConfig, + @NonNull Configuration overrideConfig, int deviceId, @Nullable String referrer, + @Nullable IVoiceInteractor voiceInteractor, @ProcessState int procState, + @Nullable Bundle state, @Nullable PersistableBundle persistentState, + @Nullable List<ResultInfo> pendingResults, + @Nullable List<ReferrerIntent> pendingNewIntents, + @Nullable SceneTransitionInfo sceneTransitionInfo, + boolean isForward, @Nullable ProfilerInfo profilerInfo, @NonNull IBinder assistToken, + @Nullable IActivityClientController activityClientController, + @NonNull IBinder shareableActivityToken, boolean launchedFromBubble, + @Nullable IBinder taskFragmentToken, @NonNull IBinder initialCallerInfoAccessToken, + @NonNull ActivityWindowInfo activityWindowInfo) { + mActivityToken = activityToken; + mIdent = ident; + mCurConfig = curConfig; + mOverrideConfig = overrideConfig; + mDeviceId = deviceId; + mReferrer = referrer; + mVoiceInteractor = voiceInteractor; + mProcState = procState; + mState = state; + mPersistentState = persistentState; + mPendingResults = pendingResults; + mPendingNewIntents = pendingNewIntents; + mSceneTransitionInfo = sceneTransitionInfo; + mIsForward = isForward; + mProfilerInfo = profilerInfo; + mAssistToken = assistToken; + mActivityClientController = activityClientController; + mShareableActivityToken = shareableActivityToken; + mLaunchedFromBubble = launchedFromBubble; + mTaskFragmentToken = taskFragmentToken; + mInitialCallerInfoAccessToken = initialCallerInfoAccessToken; + mActivityWindowInfo = activityWindowInfo; + } @Override public void preExecute(@NonNull ClientTransactionHandler client) { @@ -119,44 +229,6 @@ public class LaunchActivityItem extends ClientTransactionItem { client.countLaunchingActivities(-1); } - // ObjectPoolItem implementation - - private LaunchActivityItem() {} - - /** Obtain an instance initialized with provided params. */ - @NonNull - public static LaunchActivityItem obtain(@NonNull IBinder activityToken, @NonNull Intent intent, - int ident, @NonNull ActivityInfo info, @NonNull Configuration curConfig, - @NonNull Configuration overrideConfig, int deviceId, @Nullable String referrer, - @Nullable IVoiceInteractor voiceInteractor, int procState, @Nullable Bundle state, - @Nullable PersistableBundle persistentState, @Nullable List<ResultInfo> pendingResults, - @Nullable List<ReferrerIntent> pendingNewIntents, - @Nullable SceneTransitionInfo sceneTransitionInfo, - boolean isForward, @Nullable ProfilerInfo profilerInfo, @NonNull IBinder assistToken, - @Nullable IActivityClientController activityClientController, - @NonNull IBinder shareableActivityToken, boolean launchedFromBubble, - @Nullable IBinder taskFragmentToken, @NonNull IBinder initialCallerInfoAccessToken, - @NonNull ActivityWindowInfo activityWindowInfo) { - LaunchActivityItem instance = ObjectPool.obtain(LaunchActivityItem.class); - if (instance == null) { - instance = new LaunchActivityItem(); - } - setValues(instance, activityToken, new Intent(intent), ident, new ActivityInfo(info), - new Configuration(curConfig), new Configuration(overrideConfig), deviceId, - referrer, voiceInteractor, procState, - state != null ? new Bundle(state) : null, - persistentState != null ? new PersistableBundle(persistentState) : null, - pendingResults != null ? new ArrayList<>(pendingResults) : null, - pendingNewIntents != null ? new ArrayList<>(pendingNewIntents) : null, - sceneTransitionInfo, isForward, - profilerInfo != null ? new ProfilerInfo(profilerInfo) : null, - assistToken, activityClientController, shareableActivityToken, - launchedFromBubble, taskFragmentToken, initialCallerInfoAccessToken, - new ActivityWindowInfo(activityWindowInfo)); - - return instance; - } - @VisibleForTesting(visibility = PACKAGE) @NonNull @Override @@ -164,22 +236,13 @@ public class LaunchActivityItem extends ClientTransactionItem { return mActivityToken; } - @Override - public void recycle() { - setValues(this, null, null, 0, null, null, null, 0, null, null, 0, null, null, null, null, - null, false, null, null, null, null, false, null, null, null); - ObjectPool.recycle(this); - } - // Parcelable implementation - /** Write from Parcel. */ + /** Writes to Parcel. */ @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeStrongBinder(mActivityToken); - dest.writeTypedObject(mIntent, flags); dest.writeInt(mIdent); - dest.writeTypedObject(mInfo, flags); dest.writeTypedObject(mCurConfig, flags); dest.writeTypedObject(mOverrideConfig, flags); dest.writeInt(mDeviceId); @@ -200,28 +263,40 @@ public class LaunchActivityItem extends ClientTransactionItem { dest.writeStrongBinder(mTaskFragmentToken); dest.writeStrongBinder(mInitialCallerInfoAccessToken); dest.writeTypedObject(mActivityWindowInfo, flags); + + dest.writeTypedObject(mIntent, flags); + dest.writeTypedObject(mInfo, flags); } - /** Read from Parcel. */ + /** Reads from Parcel. */ private LaunchActivityItem(@NonNull Parcel in) { - setValues(this, in.readStrongBinder(), in.readTypedObject(Intent.CREATOR), in.readInt(), - in.readTypedObject(ActivityInfo.CREATOR), in.readTypedObject(Configuration.CREATOR), - in.readTypedObject(Configuration.CREATOR), in.readInt(), in.readString(), - IVoiceInteractor.Stub.asInterface(in.readStrongBinder()), in.readInt(), - in.readBundle(getClass().getClassLoader()), - in.readPersistableBundle(getClass().getClassLoader()), - in.createTypedArrayList(ResultInfo.CREATOR), - in.createTypedArrayList(ReferrerIntent.CREATOR), - in.readTypedObject(SceneTransitionInfo.CREATOR), - in.readBoolean(), - in.readTypedObject(ProfilerInfo.CREATOR), - in.readStrongBinder(), - IActivityClientController.Stub.asInterface(in.readStrongBinder()), - in.readStrongBinder(), - in.readBoolean(), - in.readStrongBinder(), - in.readStrongBinder(), - in.readTypedObject(ActivityWindowInfo.CREATOR)); + this(in.readStrongBinder() /* activityToken */, + in.readInt() /* ident */, + requireNonNull(in.readTypedObject(Configuration.CREATOR)) /* curConfig */, + requireNonNull(in.readTypedObject(Configuration.CREATOR)) /* overrideConfig */, + in.readInt() /* deviceId */, + in.readString() /* referrer */, + IVoiceInteractor.Stub.asInterface(in.readStrongBinder()) /* voiceInteractor */, + in.readInt() /* procState */, + in.readBundle(in.getClass().getClassLoader()) /* state */, + in.readPersistableBundle(in.getClass().getClassLoader()) /* persistentState */, + in.createTypedArrayList(ResultInfo.CREATOR) /* pendingResults */, + in.createTypedArrayList(ReferrerIntent.CREATOR) /* pendingNewIntents */, + in.readTypedObject(SceneTransitionInfo.CREATOR) /* sceneTransitionInfo */, + in.readBoolean() /* isForward */, + in.readTypedObject(ProfilerInfo.CREATOR) /* profilerInfo */, + in.readStrongBinder() /* assistToken */, + IActivityClientController.Stub.asInterface( + in.readStrongBinder()) /* activityClientController */, + in.readStrongBinder() /* shareableActivityToken */, + in.readBoolean() /* launchedFromBubble */, + in.readStrongBinder() /* taskFragmentToken */, + in.readStrongBinder() /* initialCallerInfoAccessToken */, + requireNonNull(in.readTypedObject(ActivityWindowInfo.CREATOR)) + /* activityWindowInfo */ + ); + mIntent = in.readTypedObject(Intent.CREATOR); + mInfo = in.readTypedObject(ActivityInfo.CREATOR); } public static final @NonNull Creator<LaunchActivityItem> CREATOR = new Creator<>() { @@ -339,45 +414,4 @@ public class LaunchActivityItem extends ClientTransactionItem { + ",activityWindowInfo=" + mActivityWindowInfo + "}"; } - - // Using the same method to set and clear values to make sure we don't forget anything - private static void setValues(@Nullable LaunchActivityItem instance, - @Nullable IBinder activityToken, @Nullable Intent intent, int ident, - @Nullable ActivityInfo info, @Nullable Configuration curConfig, - @Nullable Configuration overrideConfig, int deviceId, - @Nullable String referrer, @Nullable IVoiceInteractor voiceInteractor, - int procState, @Nullable Bundle state, @Nullable PersistableBundle persistentState, - @Nullable List<ResultInfo> pendingResults, - @Nullable List<ReferrerIntent> pendingNewIntents, - @Nullable SceneTransitionInfo sceneTransitionInfo, boolean isForward, - @Nullable ProfilerInfo profilerInfo, @Nullable IBinder assistToken, - @Nullable IActivityClientController activityClientController, - @Nullable IBinder shareableActivityToken, boolean launchedFromBubble, - @Nullable IBinder taskFragmentToken, @Nullable IBinder initialCallerInfoAccessToken, - @Nullable ActivityWindowInfo activityWindowInfo) { - instance.mActivityToken = activityToken; - instance.mIntent = intent; - instance.mIdent = ident; - instance.mInfo = info; - instance.mCurConfig = curConfig; - instance.mOverrideConfig = overrideConfig; - instance.mDeviceId = deviceId; - instance.mReferrer = referrer; - instance.mVoiceInteractor = voiceInteractor; - instance.mProcState = procState; - instance.mState = state; - instance.mPersistentState = persistentState; - instance.mPendingResults = pendingResults; - instance.mPendingNewIntents = pendingNewIntents; - instance.mSceneTransitionInfo = sceneTransitionInfo; - instance.mIsForward = isForward; - instance.mProfilerInfo = profilerInfo; - instance.mAssistToken = assistToken; - instance.mActivityClientController = activityClientController; - instance.mShareableActivityToken = shareableActivityToken; - instance.mLaunchedFromBubble = launchedFromBubble; - instance.mTaskFragmentToken = taskFragmentToken; - instance.mInitialCallerInfoAccessToken = initialCallerInfoAccessToken; - instance.mActivityWindowInfo = activityWindowInfo; - } } diff --git a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java index eb48314d75c1..098e92e812b5 100644 --- a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java @@ -18,20 +18,11 @@ package android.app.servertransaction; import static android.app.servertransaction.TestUtils.config; import static android.app.servertransaction.TestUtils.referrerIntentList; -import static android.app.servertransaction.TestUtils.resultInfoList; import static org.junit.Assert.assertNotSame; import android.annotation.NonNull; -import android.app.servertransaction.TestUtils.LaunchActivityItemBuilder; -import android.content.Intent; -import android.content.pm.ActivityInfo; -import android.content.pm.ApplicationInfo; -import android.content.res.Configuration; -import android.os.Binder; -import android.os.Bundle; import android.os.IBinder; -import android.os.PersistableBundle; import android.platform.test.annotations.Presubmit; import android.window.ActivityWindowInfo; @@ -77,54 +68,6 @@ public class ObjectPoolTests { } @Test - public void testRecycleLaunchActivityItem() { - final IBinder activityToken = new Binder(); - final Intent intent = new Intent("action"); - final int ident = 57; - final ActivityInfo activityInfo = new ActivityInfo(); - activityInfo.flags = 42; - activityInfo.setMaxAspectRatio(2.4f); - activityInfo.launchToken = "token"; - activityInfo.applicationInfo = new ApplicationInfo(); - activityInfo.packageName = "packageName"; - activityInfo.name = "name"; - final Configuration overrideConfig = new Configuration(); - overrideConfig.assetsSeq = 5; - final String referrer = "referrer"; - final int procState = 4; - final Bundle bundle = new Bundle(); - bundle.putString("key", "value"); - final PersistableBundle persistableBundle = new PersistableBundle(); - persistableBundle.putInt("k", 4); - final IBinder assistToken = new Binder(); - final IBinder shareableActivityToken = new Binder(); - final int deviceId = 3; - final IBinder taskFragmentToken = new Binder(); - final IBinder initialCallerInfoAccessToken = new Binder(); - final ActivityWindowInfo activityWindowInfo = new ActivityWindowInfo(); - - testRecycle(() -> new LaunchActivityItemBuilder( - activityToken, intent, activityInfo) - .setIdent(ident) - .setCurConfig(config()) - .setOverrideConfig(overrideConfig) - .setReferrer(referrer) - .setProcState(procState) - .setState(bundle) - .setPersistentState(persistableBundle) - .setPendingResults(resultInfoList()) - .setPendingNewIntents(referrerIntentList()) - .setIsForward(true) - .setAssistToken(assistToken) - .setShareableActivityToken(shareableActivityToken) - .setTaskFragmentToken(taskFragmentToken) - .setDeviceId(deviceId) - .setInitialCallerInfoAccessToken(initialCallerInfoAccessToken) - .setActivityWindowInfo(activityWindowInfo) - .build()); - } - - @Test public void testRecycleMoveToDisplayItem() { testRecycle(() -> MoveToDisplayItem.obtain(mActivityToken, 4, config(), new ActivityWindowInfo())); diff --git a/core/tests/coretests/src/android/app/servertransaction/TestUtils.java b/core/tests/coretests/src/android/app/servertransaction/TestUtils.java index c1b9efda4652..24bc547e6782 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TestUtils.java +++ b/core/tests/coretests/src/android/app/servertransaction/TestUtils.java @@ -271,7 +271,7 @@ class TestUtils { @NonNull LaunchActivityItem build() { - return LaunchActivityItem.obtain(mActivityToken, mIntent, mIdent, mInfo, + return new LaunchActivityItem(mActivityToken, mIntent, mIdent, mInfo, mCurConfig, mOverrideConfig, mDeviceId, mReferrer, mVoiceInteractor, mProcState, mState, mPersistentState, mPendingResults, mPendingNewIntents, mActivityOptions != null ? mActivityOptions.getSceneTransitionInfo() : null, diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java index d240f3e97c76..dd4aa1dde54d 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java @@ -163,7 +163,7 @@ public class TransactionParcelTests { // Write to parcel final IBinder activityToken = new Binder(); final Intent intent = new Intent("action"); - int ident = 57; + final int ident = 57; final ActivityInfo activityInfo = new ActivityInfo(); activityInfo.flags = 42; activityInfo.setMaxAspectRatio(2.4f); @@ -174,7 +174,7 @@ public class TransactionParcelTests { final Configuration overrideConfig = new Configuration(); overrideConfig.assetsSeq = 5; final String referrer = "referrer"; - int procState = 4; + final int procState = 4; final Bundle bundle = new Bundle(); bundle.putString("key", "value"); bundle.putParcelable("data", new ParcelableData(1)); @@ -326,9 +326,7 @@ public class TransactionParcelTests { * android.app.servertransaction.TransactionParcelTests$ParcelableData". */ public static class ParcelableData implements Parcelable { - int mValue; - - ParcelableData() {} + private final int mValue; ParcelableData(int value) { mValue = value; @@ -344,12 +342,10 @@ public class TransactionParcelTests { dest.writeInt(mValue); } - public static final Creator<ParcelableData> CREATOR = new Creator<ParcelableData>() { + public static final Creator<ParcelableData> CREATOR = new Creator<>() { @Override public ParcelableData createFromParcel(Parcel source) { - final ParcelableData data = new ParcelableData(); - data.mValue = source.readInt(); - return data; + return new ParcelableData(source.readInt()); } @Override diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index bc7ed653ddfd..b0d8925efcfe 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -929,7 +929,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { final boolean isTransitionForward = r.isTransitionForward(); final IBinder fragmentToken = r.getTaskFragment().getFragmentToken(); final int deviceId = getDeviceIdForDisplayId(r.getDisplayId()); - final LaunchActivityItem launchActivityItem = LaunchActivityItem.obtain(r.token, + final LaunchActivityItem launchActivityItem = new LaunchActivityItem(r.token, r.intent, System.identityHashCode(r), r.info, procConfig, overrideConfig, deviceId, r.getFilteredReferrer(r.launchedFromPackage), task.voiceInteractor, |