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

Commit 3d5b0124 authored by Winson Chung's avatar Winson Chung
Browse files

Add test api to gc system and sysui

Bug: 186268407
Test: Presubmit
Test: adb shell cmd statusbar run-gc
Change-Id: Ie0567e1a75f6c991d226b5f90f1b126139b6be44
parent 4f2e331f
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -271,4 +271,9 @@ oneway interface IStatusBar
     * @param enable {@code true} if enable, otherwise set to {@code false}.
     */
    void setNavigationBarLumaSamplingEnabled(int displayId, boolean enable);

    /**
     * Triggers a GC in the system and status bar.
     */
    void runGcForTest();
}
+72 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.internal.util;

import android.util.Slog;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * A helper class to handle gc'ing a process, mainly used for testing.
 *
 * @hide
 */
public final class GcUtils {
    private static final String TAG = GcUtils.class.getSimpleName();

    /**
     * Runs a GC and attempts to wait for finalization.
     */
    public static void runGcAndFinalizersSync() {
        Runtime.getRuntime().gc();
        Runtime.getRuntime().runFinalization();

        final CountDownLatch fence = new CountDownLatch(1);
        createFinalizationObserver(fence);
        try {
            do {
                Runtime.getRuntime().gc();
                Runtime.getRuntime().runFinalization();
            } while (!fence.await(100, TimeUnit.MILLISECONDS));
        } catch (InterruptedException ex) {
            throw new RuntimeException(ex);
        }
        Slog.v(TAG, "Running gc and finalizers");
    }

    /**
     * Create the observer in the scope of a method to minimize the chance that
     * it remains live in a DEX/machine register at the point of the fence guard.
     * This must be kept to avoid R8 inlining it.
     */
    private static void createFinalizationObserver(CountDownLatch fence) {
        new Object() {
            @Override
            protected void finalize() throws Throwable {
                try {
                    fence.countDown();
                } finally {
                    super.finalize();
                }
            }
        };
    }

    // Uninstantiable
    private GcUtils() {}
}
+7 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ import androidx.annotation.NonNull;
import com.android.internal.os.SomeArgs;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.GcUtils;
import com.android.internal.view.AppearanceRegion;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
import com.android.systemui.statusbar.commandline.CommandRegistry;
@@ -1086,6 +1087,12 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
        thr.start();
    }

    @Override
    public void runGcForTest() {
        // Gc sysui
        GcUtils.runGcAndFinalizersSync();
    }

    private final class H extends Handler {
        private H(Looper l) {
            super(l);
+18 −0
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ import com.android.internal.statusbar.NotificationVisibility;
import com.android.internal.statusbar.RegisterStatusBarResult;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.GcUtils;
import com.android.internal.view.AppearanceRegion;
import com.android.server.LocalServices;
import com.android.server.UiThread;
@@ -649,6 +650,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
    // ================================================================================
    // From IStatusBarService
    // ================================================================================

    @Override
    public void expandNotificationsPanel() {
        enforceExpandStatusBar();
@@ -971,6 +973,22 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
        return new int[] {disable1, disable2};
    }

    void runGcForTest() {
        if (!Build.IS_DEBUGGABLE) {
            throw new SecurityException("runGcForTest requires a debuggable build");
        }

        // Gc the system along the way
        GcUtils.runGcAndFinalizersSync();

        if (mBar != null) {
            try {
                mBar.runGcForTest();
            } catch (RemoteException ex) {
            }
        }
    }

    @Override
    public void setIcon(String slot, String iconPackage, int iconId, int iconLevel,
            String contentDescription) {
+7 −0
Original line number Diff line number Diff line
@@ -75,6 +75,8 @@ public class StatusBarShellCommand extends ShellCommand {
                    return runSendDisableFlag();
                case "tracing":
                    return runTracing();
                case "run-gc":
                    return runGc();
                // Handle everything that would be handled in `handleDefaultCommand()` explicitly,
                // so the default can be to pass all args to StatusBar
                case "-h":
@@ -213,6 +215,11 @@ public class StatusBarShellCommand extends ShellCommand {
        return 0;
    }

    private int runGc() {
        mInterface.runGcForTest();
        return 0;
    }

    @Override
    public void onHelp() {
        final PrintWriter pw = getOutPrintWriter();