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

Commit f1d4f114 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 11920703 from 6133ac12 to 24Q3-release

Change-Id: Id526e0dbd98094ab50b922695f847e8d218e62df
parents 92ee68e0 6133ac12
Loading
Loading
Loading
Loading
+3 −58
Original line number Diff line number Diff line
@@ -19,16 +19,13 @@ import android.annotation.Nullable;
import android.os.Bundle;
import android.os.SystemClock;
import android.perftests.utils.ShellHelper;
import android.util.Log;

import java.util.ArrayList;

// Based on //platform/frameworks/base/apct-tests/perftests/utils/BenchmarkState.java
public class BenchmarkRunner {
    private static final String TAG = BenchmarkRunner.class.getSimpleName();

    private static final long COOL_OFF_PERIOD_MS = 1000;
    private static final int CPU_IDLE_TIMEOUT_MS = 60 * 1000;
    private static final int CPU_IDLE_THRESHOLD_PERCENTAGE = 90;

    private static final int NUM_ITERATIONS = 4;

@@ -83,7 +80,7 @@ public class BenchmarkRunner {

    private void prepareForNextRun() {
        SystemClock.sleep(COOL_OFF_PERIOD_MS);
        waitCoolDownPeriod();
        ShellHelper.runShellCommand("am wait-for-broadcast-idle --flush-broadcast-loopers");
        mStartTimeNs = System.nanoTime();
        mPausedDurationNs = 0;
    }
@@ -105,7 +102,7 @@ public class BenchmarkRunner {
     * to avoid unnecessary waiting.
     */
    public void resumeTiming() {
        waitCoolDownPeriod();
        ShellHelper.runShellCommand("am wait-for-broadcast-idle --flush-broadcast-loopers");
        resumeTimer();
    }

@@ -165,56 +162,4 @@ public class BenchmarkRunner {
        }
        return null;
    }

    /** Waits for the broadcast queue and the CPU cores to be idle. */
    public void waitCoolDownPeriod() {
        waitForBroadcastIdle();
        waitForCpuIdle();
    }

    private void waitForBroadcastIdle() {
        Log.d(TAG, "starting to waitForBroadcastIdle");
        final long startedAt = System.currentTimeMillis();
        ShellHelper.runShellCommand("am wait-for-broadcast-idle --flush-broadcast-loopers");
        final long elapsed = System.currentTimeMillis() - startedAt;
        Log.d(TAG, "waitForBroadcastIdle is complete in " + elapsed + " ms");
    }
    private void waitForCpuIdle() {
        Log.d(TAG, "starting to waitForCpuIdle");
        final long startedAt = System.currentTimeMillis();
        while (true) {
            final int idleCpuPercentage = getIdleCpuPercentage();
            final long elapsed = System.currentTimeMillis() - startedAt;
            Log.d(TAG, "waitForCpuIdle " + idleCpuPercentage + "% (" + elapsed + "ms elapsed)");
            if (idleCpuPercentage >= CPU_IDLE_THRESHOLD_PERCENTAGE) {
                Log.d(TAG, "waitForCpuIdle is complete in " + elapsed + " ms");
                return;
            }
            if (elapsed >= CPU_IDLE_TIMEOUT_MS) {
                Log.e(TAG, "Ending waitForCpuIdle because it didn't finish in "
                        + CPU_IDLE_TIMEOUT_MS + " ms");
                return;
            }
            SystemClock.sleep(1000);
        }
    }

    private int getIdleCpuPercentage() {
        String output = ShellHelper.runShellCommand("top -m 1 -n 1");
        String[] tokens = output.split("\\s+");
        float totalCpu = -1;
        float idleCpu = -1;
        for (String token : tokens) {
            if (token.contains("%cpu")) {
                totalCpu = Float.parseFloat(token.split("%")[0]);
            } else if (token.contains("%idle")) {
                idleCpu = Float.parseFloat(token.split("%")[0]);
            }
        }
        if (totalCpu < 0 || idleCpu < 0) {
            Log.e(TAG, "Could not get idle cpu percentage, output=" + output);
            return -1;
        }
        return (int) (100 * idleCpu / totalCpu);
    }
}
 No newline at end of file
+91 −10
Original line number Diff line number Diff line
@@ -188,6 +188,21 @@ public class UserLifecycleTests {
        }
    }

    /** Tests creating a new user, with wait times between iterations. */
    @Test(timeout = TIMEOUT_MAX_TEST_TIME_MS)
    public void createUser_realistic() throws RemoteException {
        while (mRunner.keepRunning()) {
            Log.i(TAG, "Starting timer");
            final int userId = createUserNoFlags();

            mRunner.pauseTiming();
            Log.i(TAG, "Stopping timer");
            removeUser(userId);
            waitCoolDownPeriod();
            mRunner.resumeTimingForNextIteration();
        }
    }

    /** Tests creating and starting a new user. */
    @Test(timeout = TIMEOUT_MAX_TEST_TIME_MS)
    public void createAndStartUser() throws RemoteException {
@@ -224,6 +239,7 @@ public class UserLifecycleTests {
            mRunner.pauseTiming();
            Log.d(TAG, "Stopping timer");
            removeUser(userId);
            waitCoolDownPeriod();
            mRunner.resumeTimingForNextIteration();
        }
    }
@@ -238,6 +254,7 @@ public class UserLifecycleTests {
            mRunner.pauseTiming();
            final int userId = createUserNoFlags();

            waitForBroadcastIdle();
            runThenWaitForBroadcasts(userId, () -> {
                mRunner.resumeTiming();
                Log.i(TAG, "Starting timer");
@@ -292,6 +309,9 @@ public class UserLifecycleTests {

            preStartUser(userId, numberOfIterationsToSkip);

            waitForBroadcastIdle();
            waitCoolDownPeriod();

            runThenWaitForBroadcasts(userId, () -> {
                mRunner.resumeTiming();
                Log.i(TAG, "Starting timer");
@@ -333,6 +353,9 @@ public class UserLifecycleTests {
        while (mRunner.keepRunning()) {
            mRunner.pauseTiming();

            waitForBroadcastIdle();
            waitCoolDownPeriod();

            runThenWaitForBroadcasts(userId, () -> {
                mRunner.resumeTiming();
                Log.i(TAG, "Starting timer");
@@ -397,6 +420,7 @@ public class UserLifecycleTests {
        while (mRunner.keepRunning()) {
            mRunner.pauseTiming();

            waitCoolDownPeriod();
            mRunner.resumeTiming();
            Log.i(TAG, "Starting timer");

@@ -430,6 +454,7 @@ public class UserLifecycleTests {
            mRunner.pauseTiming();
            Log.d(TAG, "Stopping timer");
            removeUser(userId);
            waitCoolDownPeriod();
            mRunner.resumeTimingForNextIteration();
        }
    }
@@ -441,7 +466,6 @@ public class UserLifecycleTests {
            mRunner.pauseTiming();
            final int startUser = mAm.getCurrentUser();
            final int userId = createUserNoFlags();

            mRunner.resumeTiming();
            Log.i(TAG, "Starting timer");

@@ -455,6 +479,27 @@ public class UserLifecycleTests {
        }
    }

    /** Tests switching to an uninitialized user with wait times between iterations. */
    @Test(timeout = TIMEOUT_MAX_TEST_TIME_MS)
    public void switchUser_realistic() throws Exception {
        while (mRunner.keepRunning()) {
            mRunner.pauseTiming();
            final int startUser = ActivityManager.getCurrentUser();
            final int userId = createUserNoFlags();
            waitCoolDownPeriod();
            Log.d(TAG, "Starting timer");
            mRunner.resumeTiming();

            switchUser(userId);

            mRunner.pauseTiming();
            Log.d(TAG, "Stopping timer");
            switchUserNoCheck(startUser);
            removeUser(userId);
            mRunner.resumeTimingForNextIteration();
        }
    }

    /** Tests switching to a previously-started, but no-longer-running, user. */
    @Test(timeout = TIMEOUT_MAX_TEST_TIME_MS)
    public void switchUser_stopped() throws RemoteException {
@@ -462,7 +507,6 @@ public class UserLifecycleTests {
            mRunner.pauseTiming();
            final int startUser = mAm.getCurrentUser();
            final int testUser = initializeNewUserAndSwitchBack(/* stopNewUser */ true);

            mRunner.resumeTiming();
            Log.i(TAG, "Starting timer");

@@ -492,6 +536,7 @@ public class UserLifecycleTests {

        while (mRunner.keepRunning()) {
            mRunner.pauseTiming();
            waitCoolDownPeriod();
            Log.d(TAG, "Starting timer");
            mRunner.resumeTiming();

@@ -517,6 +562,7 @@ public class UserLifecycleTests {
                /* useStaticWallpaper */true);
        while (mRunner.keepRunning()) {
            mRunner.pauseTiming();
            waitCoolDownPeriod();
            Log.d(TAG, "Starting timer");
            mRunner.resumeTiming();

@@ -560,6 +606,7 @@ public class UserLifecycleTests {
        final int testUser = initializeNewUserAndSwitchBack(/* stopNewUser */ false);
        while (mRunner.keepRunning()) {
            mRunner.pauseTiming();
            waitCoolDownPeriod();
            Log.d(TAG, "Starting timer");
            mRunner.resumeTiming();

@@ -567,6 +614,7 @@ public class UserLifecycleTests {

            mRunner.pauseTiming();
            Log.d(TAG, "Stopping timer");
            waitForBroadcastIdle();
            switchUserNoCheck(startUser);
            mRunner.resumeTimingForNextIteration();
        }
@@ -583,6 +631,7 @@ public class UserLifecycleTests {
                /* useStaticWallpaper */ true);
        while (mRunner.keepRunning()) {
            mRunner.pauseTiming();
            waitCoolDownPeriod();
            Log.d(TAG, "Starting timer");
            mRunner.resumeTiming();

@@ -590,6 +639,7 @@ public class UserLifecycleTests {

            mRunner.pauseTiming();
            Log.d(TAG, "Stopping timer");
            waitForBroadcastIdle();
            switchUserNoCheck(startUser);
            mRunner.resumeTimingForNextIteration();
        }
@@ -625,11 +675,13 @@ public class UserLifecycleTests {
    @Test(timeout = TIMEOUT_MAX_TEST_TIME_MS)
    public void stopUser_realistic() throws RemoteException {
        final int userId = createUserNoFlags();
        waitCoolDownPeriod();
        while (mRunner.keepRunning()) {
            mRunner.pauseTiming();
            runThenWaitForBroadcasts(userId, ()-> {
                mIam.startUserInBackground(userId);
            }, Intent.ACTION_USER_STARTED, Intent.ACTION_MEDIA_MOUNTED);
            waitCoolDownPeriod();
            Log.d(TAG, "Starting timer");
            mRunner.resumeTiming();

@@ -651,7 +703,7 @@ public class UserLifecycleTests {
            final int startUser = mAm.getCurrentUser();
            final int userId = createUserNoFlags();

            mRunner.waitCoolDownPeriod();
            waitForBroadcastIdle();
            mUserSwitchWaiter.runThenWaitUntilBootCompleted(userId, () -> {
                mRunner.resumeTiming();
                Log.i(TAG, "Starting timer");
@@ -674,7 +726,7 @@ public class UserLifecycleTests {
            final int startUser = ActivityManager.getCurrentUser();
            final int userId = createUserNoFlags();

            mRunner.waitCoolDownPeriod();
            waitCoolDownPeriod();
            mUserSwitchWaiter.runThenWaitUntilBootCompleted(userId, () -> {
                mRunner.resumeTiming();
                Log.d(TAG, "Starting timer");
@@ -700,7 +752,7 @@ public class UserLifecycleTests {
                switchUser(userId);
            }, Intent.ACTION_MEDIA_MOUNTED);

            mRunner.waitCoolDownPeriod();
            waitForBroadcastIdle();
            mUserSwitchWaiter.runThenWaitUntilSwitchCompleted(startUser, () -> {
                runThenWaitForBroadcasts(userId, () -> {
                    mRunner.resumeTiming();
@@ -729,7 +781,7 @@ public class UserLifecycleTests {
                switchUser(userId);
            }, Intent.ACTION_MEDIA_MOUNTED);

            mRunner.waitCoolDownPeriod();
            waitCoolDownPeriod();
            mUserSwitchWaiter.runThenWaitUntilSwitchCompleted(startUser, () -> {
                runThenWaitForBroadcasts(userId, () -> {
                    mRunner.resumeTiming();
@@ -775,6 +827,7 @@ public class UserLifecycleTests {
            Log.d(TAG, "Stopping timer");
            attestTrue("Failed creating profile " + userId, mUm.isManagedProfile(userId));
            removeUser(userId);
            waitCoolDownPeriod();
            mRunner.resumeTimingForNextIteration();
        }
    }
@@ -815,6 +868,7 @@ public class UserLifecycleTests {
            mRunner.pauseTiming();
            Log.d(TAG, "Stopping timer");
            removeUser(userId);
            waitCoolDownPeriod();
            mRunner.resumeTimingForNextIteration();
        }
    }
@@ -859,6 +913,7 @@ public class UserLifecycleTests {

            mRunner.pauseTiming();
            Log.d(TAG, "Stopping timer");
            waitCoolDownPeriod();
            mRunner.resumeTimingForNextIteration();
        }
        removeUser(userId);
@@ -910,6 +965,7 @@ public class UserLifecycleTests {
            mRunner.pauseTiming();
            Log.d(TAG, "Stopping timer");
            removeUser(userId);
            waitCoolDownPeriod();
            mRunner.resumeTimingForNextIteration();
        }
    }
@@ -974,6 +1030,7 @@ public class UserLifecycleTests {
            mRunner.pauseTiming();
            Log.d(TAG, "Stopping timer");
            removeUser(userId);
            waitCoolDownPeriod();
            mRunner.resumeTimingForNextIteration();
        }
    }
@@ -1014,6 +1071,7 @@ public class UserLifecycleTests {
            mRunner.pauseTiming();
            Log.d(TAG, "Stopping timer");
            removeUser(userId);
            waitCoolDownPeriod();
            mRunner.resumeTimingForNextIteration();
        }
    }
@@ -1066,6 +1124,7 @@ public class UserLifecycleTests {
            mRunner.pauseTiming();
            Log.d(TAG, "Stopping timer");
            removeUser(userId);
            waitCoolDownPeriod();
            mRunner.resumeTimingForNextIteration();
        }
    }
@@ -1105,6 +1164,7 @@ public class UserLifecycleTests {
            runThenWaitForBroadcasts(userId, () -> {
                startUserInBackgroundAndWaitForUnlock(userId);
            }, Intent.ACTION_MEDIA_MOUNTED);
            waitCoolDownPeriod();
            mRunner.resumeTiming();
            Log.d(TAG, "Starting timer");

@@ -1220,7 +1280,6 @@ public class UserLifecycleTests {
     * If lack of success should fail the test, use {@link #switchUser(int)} instead.
     */
    private boolean switchUserNoCheck(int userId) throws RemoteException {
        mRunner.waitCoolDownPeriod();
        final boolean[] success = {true};
        mUserSwitchWaiter.runThenWaitUntilSwitchCompleted(userId, () -> {
            mAm.switchUser(userId);
@@ -1237,7 +1296,7 @@ public class UserLifecycleTests {
     */
    private void stopUserAfterWaitingForBroadcastIdle(int userId)
            throws RemoteException {
        mRunner.waitCoolDownPeriod();
        waitForBroadcastIdle();
        stopUser(userId);
    }

@@ -1379,8 +1438,6 @@ public class UserLifecycleTests {
     */
    private void runThenWaitForBroadcasts(int userId, FunctionalUtils.ThrowingRunnable runnable,
            String... actions) {
        mRunner.waitCoolDownPeriod();

        final String unreceivedAction =
                mBroadcastWaiter.runThenWaitForBroadcasts(userId, runnable, actions);

@@ -1481,4 +1538,28 @@ public class UserLifecycleTests {
        assertEquals("", ShellHelper.runShellCommand("setprop " + name + " " + value));
        return TextUtils.firstNotEmpty(oldValue, "invalid");
    }

    private void waitForBroadcastIdle() {
        try {
            ShellHelper.runShellCommandWithTimeout(
                    "am wait-for-broadcast-idle --flush-broadcast-loopers", TIMEOUT_IN_SECOND);
        } catch (TimeoutException e) {
            Log.e(TAG, "Ending waitForBroadcastIdle because it is taking too long", e);
        }
    }

    private void sleep(long ms) {
        try {
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            // Ignore
        }
    }

    private void waitCoolDownPeriod() {
        // Heuristic value based on local tests. Stability increased compared to no waiting.
        final int tenSeconds = 1000 * 10;
        waitForBroadcastIdle();
        sleep(tenSeconds);
    }
}
+75 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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 android.perftests.permission

import android.Manifest
import android.companion.virtual.VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT
import android.content.Context
import android.perftests.utils.PerfStatusReporter
import android.permission.PermissionManager
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import com.android.compatibility.common.util.AdoptShellPermissionsRule
import com.android.compatibility.common.util.SystemUtil.runShellCommand
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class PermissionManagerPerfTest {
    @get:Rule var perfStatusReporter = PerfStatusReporter()
    @get:Rule
    val mAdoptShellPermissionsRule =
        AdoptShellPermissionsRule(
            InstrumentationRegistry.getInstrumentation().getUiAutomation(),
            Manifest.permission.INSTALL_PACKAGES,
            Manifest.permission.DELETE_PACKAGES,
            Manifest.permission.GRANT_RUNTIME_PERMISSIONS,
            Manifest.permission.MANAGE_ONE_TIME_PERMISSION_SESSIONS,
            Manifest.permission.REVOKE_RUNTIME_PERMISSIONS,
        )

    val context: Context = InstrumentationRegistry.getInstrumentation().targetContext
    val permissionManager = context.getSystemService(PermissionManager::class.java)!!

    @Before
    fun setup() {
        val apkPath = "$APK_DIR${APK_NAME}.apk"
        runShellCommand("pm install -tg $apkPath")
    }

    @After
    fun cleanup() {
        runShellCommand("pm uninstall $PKG_NAME")
    }

    @Test
    fun testGetAllPermissionStates() {
        val benchmarkState = perfStatusReporter.benchmarkState
        while (benchmarkState.keepRunning()) {
            permissionManager.getAllPermissionStates(PKG_NAME, PERSISTENT_DEVICE_ID_DEFAULT)
        }
    }

    companion object {
        private const val APK_DIR = "/data/local/tmp/perftests/"
        private const val APK_NAME = "UsePermissionApp0"
        private const val PKG_NAME = "android.perftests.appenumeration0"
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import java.io.IOException
import java.io.InputStreamReader
import java.util.concurrent.TimeUnit
import java.util.function.BiConsumer
import org.junit.Ignore

@RunWith(AndroidJUnit4::class)
class PermissionServicePerfTest {
@@ -48,6 +49,7 @@ class PermissionServicePerfTest {
    val mUiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation()

    @Test
    @Ignore("Fails to capture duration, results in infinite loop and execution timeout")
    fun testInstallPackages() {
        mUiAutomation.executeShellCommand(COMMAND_TRACE_START)
        eventually { assertThat(Trace.isTagEnabled(TRACE_TAG)).isTrue() }
+12 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ import static android.app.admin.flags.Flags.FLAG_HEADLESS_DEVICE_OWNER_PROVISION
import static android.app.admin.flags.Flags.FLAG_HEADLESS_DEVICE_OWNER_SINGLE_USER_ENABLED;
import static android.app.admin.flags.Flags.FLAG_SECURITY_LOG_V2_ENABLED;
import static android.app.admin.flags.Flags.onboardingBugreportV2Enabled;
import static android.app.admin.flags.Flags.onboardingConsentlessBugreports;
import static android.app.admin.flags.Flags.FLAG_IS_MTE_POLICY_ENFORCED;
import static android.content.Intent.LOCAL_FLAG_FROM_SYSTEM;
import static android.net.NetworkCapabilities.NET_ENTERPRISE_ID_1;
@@ -17626,6 +17627,17 @@ public class DevicePolicyManager {
        return onboardingBugreportV2Enabled();
    }
    // TODO(b/308755220): Remove once the build is finalised.
    /**
     * Returns true if the flag for consentless bugreports is enabled.
     *
     * @hide
     */
    @UnsupportedAppUsage
    public boolean isOnboardingConsentlessBugreportFlagEnabled() {
        return onboardingConsentlessBugreports();
    }
    /**
     * Returns the subscription ids of all subscriptions which were downloaded by the calling
     * admin.
Loading