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

Commit a33c13df authored by Bryce Lee's avatar Bryce Lee
Browse files

Improve temporary logging around activity destruction.

This changelist improves logging for capture details around
b/71506345. These modifications are intended to be reverted once
the root cause has been found.

Bug: 71506345
Test: manual
Change-Id: I1dd5eba710e81bf78632359d4ee4c047fefa5da6
parent bc48bd8f
Loading
Loading
Loading
Loading
+52 −17
Original line number Diff line number Diff line
@@ -166,9 +166,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;
@@ -222,7 +222,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.
@@ -256,7 +256,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.
@@ -339,6 +339,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>();
@@ -2182,14 +2202,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,
@@ -2876,11 +2910,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;
@@ -4453,7 +4482,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);
@@ -4505,6 +4534,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;
    }
@@ -4516,9 +4551,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();
@@ -4780,7 +4815,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;
+1 −1
Original line number Diff line number Diff line
@@ -60,7 +60,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,
+2 −2
Original line number Diff line number Diff line
@@ -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) {
@@ -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();
+1 −1
Original line number Diff line number Diff line
@@ -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);
    }

+3 −1
Original line number Diff line number Diff line
@@ -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