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

Commit e5414204 authored by Zhen Zhang's avatar Zhen Zhang Committed by Automerger Merge Worker
Browse files

Merge "Log hibernation state with AppStartOccurred atom" into sc-dev am: 69f97fa1

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14100518

Change-Id: I65c69e06c5f533d5f9b29c719f270e5d2a236504
parents 1ee166f1 69f97fa1
Loading
Loading
Loading
Loading
+34 −5
Original line number Diff line number Diff line
@@ -96,6 +96,8 @@ import com.android.internal.os.BackgroundThread;
import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.LocalServices;
import com.android.server.apphibernation.AppHibernationManagerInternal;
import com.android.server.apphibernation.AppHibernationService;

import java.util.ArrayList;
import java.util.LinkedList;
@@ -163,6 +165,9 @@ class ActivityMetricsLogger {
     */
    private final LaunchObserverRegistryImpl mLaunchObserver;
    @VisibleForTesting static final int LAUNCH_OBSERVER_ACTIVITY_RECORD_PROTO_CHUNK_SIZE = 512;
    private final ArrayMap<String, Boolean> mLastHibernationStates = new ArrayMap<>();
    private AppHibernationManagerInternal mAppHibernationManagerInternal;
    private boolean mIsAppHibernationEnabled;

    /**
     * The information created when an intent is incoming but we do not yet know whether it will be
@@ -789,6 +794,27 @@ class ActivityMetricsLogger {
        }
    }

    @Nullable
    private AppHibernationManagerInternal getAppHibernationManagerInternal() {
        if (mAppHibernationManagerInternal == null) {
            mIsAppHibernationEnabled = AppHibernationService.isAppHibernationEnabled();
            mAppHibernationManagerInternal =
                    LocalServices.getService(AppHibernationManagerInternal.class);
        }
        return mAppHibernationManagerInternal;
    }

    /**
     * Notifies the tracker before the package is unstopped because of launching activity.
     * @param packageName The package to be unstopped.
     */
    void notifyBeforePackageUnstopped(@NonNull String packageName) {
        final AppHibernationManagerInternal ahmInternal = getAppHibernationManagerInternal();
        if (ahmInternal != null && mIsAppHibernationEnabled) {
            mLastHibernationStates.put(packageName, ahmInternal.isHibernatingGlobally(packageName));
        }
    }

    /**
     * Notifies the tracker that we called immediately before we call bindApplication on the client.
     *
@@ -823,6 +849,8 @@ class ActivityMetricsLogger {
        }

        stopLaunchTrace(info);
        final Boolean isHibernating =
                mLastHibernationStates.remove(info.mLastLaunchedActivity.packageName);
        if (abort) {
            mSupervisor.stopWaitingForActivityVisible(info.mLastLaunchedActivity);
            launchObserverNotifyActivityLaunchCancelled(info);
@@ -830,7 +858,7 @@ class ActivityMetricsLogger {
            if (info.isInterestingToLoggerAndObserver()) {
                launchObserverNotifyActivityLaunchFinished(info, timestampNs);
            }
            logAppTransitionFinished(info);
            logAppTransitionFinished(info, isHibernating != null ? isHibernating : false);
        }
        info.mPendingDrawActivities.clear();
        mTransitionInfoList.remove(info);
@@ -859,7 +887,7 @@ class ActivityMetricsLogger {
        }
    }

    private void logAppTransitionFinished(@NonNull TransitionInfo info) {
    private void logAppTransitionFinished(@NonNull TransitionInfo info, boolean isHibernating) {
        if (DEBUG_METRICS) Slog.i(TAG, "logging finished transition " + info);

        // Take a snapshot of the transition info before sending it to the handler for logging.
@@ -868,7 +896,7 @@ class ActivityMetricsLogger {
        if (info.isInterestingToLoggerAndObserver()) {
            BackgroundThread.getHandler().post(() -> logAppTransition(
                    info.mCurrentTransitionDeviceUptime, info.mCurrentTransitionDelayMs,
                    infoSnapshot));
                    infoSnapshot, isHibernating));
        }
        BackgroundThread.getHandler().post(() -> logAppDisplayed(infoSnapshot));
        if (info.mPendingFullyDrawn != null) {
@@ -880,7 +908,7 @@ class ActivityMetricsLogger {

    // This gets called on a background thread without holding the activity manager lock.
    private void logAppTransition(int currentTransitionDeviceUptime, int currentTransitionDelayMs,
            TransitionInfoSnapshot info) {
            TransitionInfoSnapshot info, boolean isHibernating) {
        final LogMaker builder = new LogMaker(APP_TRANSITION);
        builder.setPackageName(info.packageName);
        builder.setType(info.type);
@@ -933,7 +961,8 @@ class ActivityMetricsLogger {
                packageOptimizationInfo.getCompilationReason(),
                packageOptimizationInfo.getCompilationFilter(),
                info.sourceType,
                info.sourceEventDelayMs);
                info.sourceEventDelayMs,
                isHibernating);

        if (DEBUG_METRICS) {
            Slog.i(TAG, String.format("APP_START_OCCURRED(%s, %s, %s, %s, %s)",
+2 −0
Original line number Diff line number Diff line
@@ -6309,6 +6309,8 @@ class Task extends WindowContainer<WindowContainer> {
        // Launching this app's activity, make sure the app is no longer
        // considered stopped.
        try {
            mTaskSupervisor.getActivityMetricsLogger()
                    .notifyBeforePackageUnstopped(next.packageName);
            mAtmService.getPackageManager().setPackageStoppedState(
                    next.packageName, false, next.mUserId); /* TODO: Verify if correct userid */
        } catch (RemoteException e1) {