Loading core/java/android/app/ActivityThread.java +52 −17 Original line number Diff line number Diff line Loading @@ -167,9 +167,9 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.InetAddress; import java.text.DateFormat; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; Loading Loading @@ -223,7 +223,7 @@ public final class ActivityThread extends ClientTransactionHandler { private static final boolean REPORT_TO_ACTIVITY = true; // Maximum number of recent tokens to maintain for debugging purposes private static final int MAX_RECENT_TOKENS = 10; private static final int MAX_DESTROYED_ACTIVITIES = 10; /** * Denotes an invalid sequence number corresponding to a process state change. Loading Loading @@ -257,7 +257,7 @@ public final class ActivityThread extends ClientTransactionHandler { final H mH = new H(); final Executor mExecutor = new HandlerExecutor(mH); final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>(); final ArrayDeque<Integer> mRecentTokens = new ArrayDeque<>(); final ArrayList<DestroyedActivityInfo> mRecentDestroyedActivities = new ArrayList<>(); // List of new activities (via ActivityRecord.nextIdle) that should // be reported when next we idle. Loading Loading @@ -340,6 +340,26 @@ public final class ActivityThread extends ClientTransactionHandler { } } /** * TODO(b/71506345): Remove this once bug is resolved. */ private static final class DestroyedActivityInfo { private final Integer mToken; private final String mReason; private final long mTime; DestroyedActivityInfo(Integer token, String reason) { mToken = token; mReason = reason; mTime = System.currentTimeMillis(); } void dump(PrintWriter pw, String prefix) { pw.println(prefix + "[token:" + mToken + " | time:" + mTime + " | reason:" + mReason + "]"); } } // The lock of mProviderMap protects the following variables. final ArrayMap<ProviderKey, ProviderClientRecord> mProviderMap = new ArrayMap<ProviderKey, ProviderClientRecord>(); Loading Loading @@ -2164,14 +2184,28 @@ public final class ActivityThread extends ClientTransactionHandler { @Override public void dump(PrintWriter pw, String prefix) { pw.println(prefix + "mActivities:"); pw.println(prefix + "Activities:"); for (ArrayMap.Entry<IBinder, ActivityClientRecord> entry : mActivities.entrySet()) { if (!mActivities.isEmpty()) { final Iterator<Map.Entry<IBinder, ActivityClientRecord>> activitiesIterator = mActivities.entrySet().iterator(); while (activitiesIterator.hasNext()) { final ArrayMap.Entry<IBinder, ActivityClientRecord> entry = activitiesIterator.next(); pw.println(prefix + " [token:" + entry.getKey().hashCode() + " record:" + entry.getValue().toString() + "]"); } } pw.println(prefix + "mRecentTokens:" + mRecentTokens); if (!mRecentDestroyedActivities.isEmpty()) { pw.println(prefix + "Recent destroyed activities:"); for (int i = 0, size = mRecentDestroyedActivities.size(); i < size; i++) { final DestroyedActivityInfo info = mRecentDestroyedActivities.get(i); pw.print(prefix); info.dump(pw, " "); } } } public static void dumpMemInfoTable(PrintWriter pw, Debug.MemoryInfo memInfo, boolean checkin, Loading Loading @@ -2858,11 +2892,6 @@ public final class ActivityThread extends ClientTransactionHandler { r.setState(ON_CREATE); mActivities.put(r.token, r); mRecentTokens.push(r.token.hashCode()); if (mRecentTokens.size() > MAX_RECENT_TOKENS) { mRecentTokens.removeLast(); } } catch (SuperNotCalledException e) { throw e; Loading Loading @@ -4419,7 +4448,7 @@ public final class ActivityThread extends ClientTransactionHandler { /** Core implementation of activity destroy call. */ ActivityClientRecord performDestroyActivity(IBinder token, boolean finishing, int configChanges, boolean getNonConfigInstance) { int configChanges, boolean getNonConfigInstance, String reason) { ActivityClientRecord r = mActivities.get(token); Class<? extends Activity> activityClass = null; if (localLOGV) Slog.v(TAG, "Performing finish of " + r); Loading Loading @@ -4471,6 +4500,12 @@ public final class ActivityThread extends ClientTransactionHandler { r.setState(ON_DESTROY); } mActivities.remove(token); mRecentDestroyedActivities.add(0, new DestroyedActivityInfo(token.hashCode(), reason)); final int recentDestroyedActivitiesSize = mRecentDestroyedActivities.size(); if (recentDestroyedActivitiesSize > MAX_DESTROYED_ACTIVITIES) { mRecentDestroyedActivities.remove(recentDestroyedActivitiesSize - 1); } StrictMode.decrementExpectedActivityCount(activityClass); return r; } Loading @@ -4482,9 +4517,9 @@ public final class ActivityThread extends ClientTransactionHandler { @Override public void handleDestroyActivity(IBinder token, boolean finishing, int configChanges, boolean getNonConfigInstance) { boolean getNonConfigInstance, String reason) { ActivityClientRecord r = performDestroyActivity(token, finishing, configChanges, getNonConfigInstance); configChanges, getNonConfigInstance, reason); if (r != null) { cleanUpPendingRemoveWindows(r, finishing); WindowManager wm = r.activity.getWindowManager(); Loading Loading @@ -4709,7 +4744,7 @@ public final class ActivityThread extends ClientTransactionHandler { callActivityOnStop(r, true /* saveState */, "handleRelaunchActivity"); } handleDestroyActivity(r.token, false, configChanges, true); handleDestroyActivity(r.token, false, configChanges, true, "handleRelaunchActivity"); r.activity = null; r.window = null; Loading core/java/android/app/ClientTransactionHandler.java +1 −1 Original line number Diff line number Diff line Loading @@ -61,7 +61,7 @@ public abstract class ClientTransactionHandler { /** Destroy the activity. */ public abstract void handleDestroyActivity(IBinder token, boolean finishing, int configChanges, boolean getNonConfigInstance); boolean getNonConfigInstance, String reason); /** Pause the activity. */ public abstract void handlePauseActivity(IBinder token, boolean finished, boolean userLeaving, Loading core/java/android/app/LocalActivityManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -380,7 +380,7 @@ public class LocalActivityManager { } if (localLOGV) Log.v(TAG, r.id + ": destroying"); mActivityThread.performDestroyActivity(r, finish, 0 /* configChanges */, false /* getNonConfigInstance */); false /* getNonConfigInstance */, "LocalActivityManager::performDestroy"); r.activity = null; r.window = null; if (finish) { Loading Loading @@ -645,7 +645,7 @@ public class LocalActivityManager { LocalActivityRecord r = mActivityArray.get(i); if (localLOGV) Log.v(TAG, r.id + ": destroying"); mActivityThread.performDestroyActivity(r, finishing, 0 /* configChanges */, false /* getNonConfigInstance */); false /* getNonConfigInstance */, "LocalActivityManager::dispatchDestroy"); } mActivities.clear(); mActivityArray.clear(); Loading core/java/android/app/servertransaction/DestroyActivityItem.java +1 −1 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ public class DestroyActivityItem extends ActivityLifecycleItem { PendingTransactionActions pendingActions) { Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityDestroy"); client.handleDestroyActivity(token, mFinished, mConfigChanges, false /* getNonConfigInstance */); false /* getNonConfigInstance */, getDescription()); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } Loading core/java/android/app/servertransaction/TransactionExecutor.java +3 −1 Original line number Diff line number Diff line Loading @@ -194,7 +194,9 @@ public class TransactionExecutor { break; case ON_DESTROY: mTransactionHandler.handleDestroyActivity(r.token, false /* finishing */, 0 /* configChanges */, false /* getNonConfigInstance */); 0 /* configChanges */, false /* getNonConfigInstance */, "performLifecycleSequence. cycling to:" + mLifecycleSequence.get(size - 1)); break; case ON_RESTART: mTransactionHandler.performRestartActivity(r.token, false /* start */); Loading Loading
core/java/android/app/ActivityThread.java +52 −17 Original line number Diff line number Diff line Loading @@ -167,9 +167,9 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.InetAddress; import java.text.DateFormat; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; Loading Loading @@ -223,7 +223,7 @@ public final class ActivityThread extends ClientTransactionHandler { private static final boolean REPORT_TO_ACTIVITY = true; // Maximum number of recent tokens to maintain for debugging purposes private static final int MAX_RECENT_TOKENS = 10; private static final int MAX_DESTROYED_ACTIVITIES = 10; /** * Denotes an invalid sequence number corresponding to a process state change. Loading Loading @@ -257,7 +257,7 @@ public final class ActivityThread extends ClientTransactionHandler { final H mH = new H(); final Executor mExecutor = new HandlerExecutor(mH); final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>(); final ArrayDeque<Integer> mRecentTokens = new ArrayDeque<>(); final ArrayList<DestroyedActivityInfo> mRecentDestroyedActivities = new ArrayList<>(); // List of new activities (via ActivityRecord.nextIdle) that should // be reported when next we idle. Loading Loading @@ -340,6 +340,26 @@ public final class ActivityThread extends ClientTransactionHandler { } } /** * TODO(b/71506345): Remove this once bug is resolved. */ private static final class DestroyedActivityInfo { private final Integer mToken; private final String mReason; private final long mTime; DestroyedActivityInfo(Integer token, String reason) { mToken = token; mReason = reason; mTime = System.currentTimeMillis(); } void dump(PrintWriter pw, String prefix) { pw.println(prefix + "[token:" + mToken + " | time:" + mTime + " | reason:" + mReason + "]"); } } // The lock of mProviderMap protects the following variables. final ArrayMap<ProviderKey, ProviderClientRecord> mProviderMap = new ArrayMap<ProviderKey, ProviderClientRecord>(); Loading Loading @@ -2164,14 +2184,28 @@ public final class ActivityThread extends ClientTransactionHandler { @Override public void dump(PrintWriter pw, String prefix) { pw.println(prefix + "mActivities:"); pw.println(prefix + "Activities:"); for (ArrayMap.Entry<IBinder, ActivityClientRecord> entry : mActivities.entrySet()) { if (!mActivities.isEmpty()) { final Iterator<Map.Entry<IBinder, ActivityClientRecord>> activitiesIterator = mActivities.entrySet().iterator(); while (activitiesIterator.hasNext()) { final ArrayMap.Entry<IBinder, ActivityClientRecord> entry = activitiesIterator.next(); pw.println(prefix + " [token:" + entry.getKey().hashCode() + " record:" + entry.getValue().toString() + "]"); } } pw.println(prefix + "mRecentTokens:" + mRecentTokens); if (!mRecentDestroyedActivities.isEmpty()) { pw.println(prefix + "Recent destroyed activities:"); for (int i = 0, size = mRecentDestroyedActivities.size(); i < size; i++) { final DestroyedActivityInfo info = mRecentDestroyedActivities.get(i); pw.print(prefix); info.dump(pw, " "); } } } public static void dumpMemInfoTable(PrintWriter pw, Debug.MemoryInfo memInfo, boolean checkin, Loading Loading @@ -2858,11 +2892,6 @@ public final class ActivityThread extends ClientTransactionHandler { r.setState(ON_CREATE); mActivities.put(r.token, r); mRecentTokens.push(r.token.hashCode()); if (mRecentTokens.size() > MAX_RECENT_TOKENS) { mRecentTokens.removeLast(); } } catch (SuperNotCalledException e) { throw e; Loading Loading @@ -4419,7 +4448,7 @@ public final class ActivityThread extends ClientTransactionHandler { /** Core implementation of activity destroy call. */ ActivityClientRecord performDestroyActivity(IBinder token, boolean finishing, int configChanges, boolean getNonConfigInstance) { int configChanges, boolean getNonConfigInstance, String reason) { ActivityClientRecord r = mActivities.get(token); Class<? extends Activity> activityClass = null; if (localLOGV) Slog.v(TAG, "Performing finish of " + r); Loading Loading @@ -4471,6 +4500,12 @@ public final class ActivityThread extends ClientTransactionHandler { r.setState(ON_DESTROY); } mActivities.remove(token); mRecentDestroyedActivities.add(0, new DestroyedActivityInfo(token.hashCode(), reason)); final int recentDestroyedActivitiesSize = mRecentDestroyedActivities.size(); if (recentDestroyedActivitiesSize > MAX_DESTROYED_ACTIVITIES) { mRecentDestroyedActivities.remove(recentDestroyedActivitiesSize - 1); } StrictMode.decrementExpectedActivityCount(activityClass); return r; } Loading @@ -4482,9 +4517,9 @@ public final class ActivityThread extends ClientTransactionHandler { @Override public void handleDestroyActivity(IBinder token, boolean finishing, int configChanges, boolean getNonConfigInstance) { boolean getNonConfigInstance, String reason) { ActivityClientRecord r = performDestroyActivity(token, finishing, configChanges, getNonConfigInstance); configChanges, getNonConfigInstance, reason); if (r != null) { cleanUpPendingRemoveWindows(r, finishing); WindowManager wm = r.activity.getWindowManager(); Loading Loading @@ -4709,7 +4744,7 @@ public final class ActivityThread extends ClientTransactionHandler { callActivityOnStop(r, true /* saveState */, "handleRelaunchActivity"); } handleDestroyActivity(r.token, false, configChanges, true); handleDestroyActivity(r.token, false, configChanges, true, "handleRelaunchActivity"); r.activity = null; r.window = null; Loading
core/java/android/app/ClientTransactionHandler.java +1 −1 Original line number Diff line number Diff line Loading @@ -61,7 +61,7 @@ public abstract class ClientTransactionHandler { /** Destroy the activity. */ public abstract void handleDestroyActivity(IBinder token, boolean finishing, int configChanges, boolean getNonConfigInstance); boolean getNonConfigInstance, String reason); /** Pause the activity. */ public abstract void handlePauseActivity(IBinder token, boolean finished, boolean userLeaving, Loading
core/java/android/app/LocalActivityManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -380,7 +380,7 @@ public class LocalActivityManager { } if (localLOGV) Log.v(TAG, r.id + ": destroying"); mActivityThread.performDestroyActivity(r, finish, 0 /* configChanges */, false /* getNonConfigInstance */); false /* getNonConfigInstance */, "LocalActivityManager::performDestroy"); r.activity = null; r.window = null; if (finish) { Loading Loading @@ -645,7 +645,7 @@ public class LocalActivityManager { LocalActivityRecord r = mActivityArray.get(i); if (localLOGV) Log.v(TAG, r.id + ": destroying"); mActivityThread.performDestroyActivity(r, finishing, 0 /* configChanges */, false /* getNonConfigInstance */); false /* getNonConfigInstance */, "LocalActivityManager::dispatchDestroy"); } mActivities.clear(); mActivityArray.clear(); Loading
core/java/android/app/servertransaction/DestroyActivityItem.java +1 −1 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ public class DestroyActivityItem extends ActivityLifecycleItem { PendingTransactionActions pendingActions) { Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityDestroy"); client.handleDestroyActivity(token, mFinished, mConfigChanges, false /* getNonConfigInstance */); false /* getNonConfigInstance */, getDescription()); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } Loading
core/java/android/app/servertransaction/TransactionExecutor.java +3 −1 Original line number Diff line number Diff line Loading @@ -194,7 +194,9 @@ public class TransactionExecutor { break; case ON_DESTROY: mTransactionHandler.handleDestroyActivity(r.token, false /* finishing */, 0 /* configChanges */, false /* getNonConfigInstance */); 0 /* configChanges */, false /* getNonConfigInstance */, "performLifecycleSequence. cycling to:" + mLifecycleSequence.get(size - 1)); break; case ON_RESTART: mTransactionHandler.performRestartActivity(r.token, false /* start */); Loading