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

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

Snap for 12327203 from db6f2b27 to 24Q4-release

Change-Id: I866b51712ef86144baad1261809d1ab20e6d6678
parents 67aeb02e db6f2b27
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -17,6 +17,17 @@
    <option name="test-suite-tag" value="apct" />
    <option name="test-suite-tag" value="apct-metric-instrumentation" />

    // Deal with Play Protect blocking apk installations.
    // The first setting disables the verification, the second one lowers the timeout from
    // 1hr to 10s, the third one resets the value after the test is complete, and the final
    // setting skips the device reboot after modifying the settings.
    <target_preparer class="com.android.tradefed.targetprep.DeviceSetup">
        <option name="set-global-setting" key="verifier_verify_adb_installs" value="0" />
        <option name="set-global-setting" key="verifier_engprod" value="1" />
        <option name="restore-settings" value="true" />
        <option name="force-skip-system-props" value="true" />
    </target_preparer>

    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
    <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
        <option name="push-file" key="trace_config_detailed.textproto" value="/data/misc/perfetto-traces/trace_config.textproto" />
+76 −53
Original line number Diff line number Diff line
@@ -37,9 +37,13 @@ import org.junit.Rule;
import org.junit.Test;

import java.util.ArrayList;
import java.util.concurrent.Executor;
import java.util.concurrent.FutureTask;
import java.util.Arrays;
import java.util.Comparator;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

/**
 * Benchmarks for {@link android.content.om.OverlayManager}.
@@ -49,7 +53,6 @@ public class OverlayManagerPerfTest {
    private static final int OVERLAY_PKG_COUNT = 10;
    private static Context sContext;
    private static OverlayManager sOverlayManager;
    private static Executor sExecutor;
    private static ArrayList<TestPackageInstaller.InstalledPackage> sSmallOverlays =
            new ArrayList<>();
    private static ArrayList<TestPackageInstaller.InstalledPackage> sLargeOverlays =
@@ -58,18 +61,45 @@ public class OverlayManagerPerfTest {
    @Rule
    public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();

    // Uncheck the checked exceptions in a callable for convenient stream usage.
    // Any exception will fail the test anyway.
    private static <T> T uncheck(Callable<T> c) {
        try {
            return c.call();
        } catch (RuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @BeforeClass
    public static void classSetUp() throws Exception {
        sContext = InstrumentationRegistry.getTargetContext();
        sOverlayManager = new OverlayManager(sContext);
        sExecutor = (command) -> new Thread(command).start();

        // Install all of the test overlays.
        TestPackageInstaller installer = new TestPackageInstaller(sContext);
        // Install all of the test overlays. Play Protect likes to block these for 10 sec each
        // so let's install them in parallel to speed up the wait.
        final var installer = new TestPackageInstaller(sContext);
        final var es = Executors.newFixedThreadPool(2 * OVERLAY_PKG_COUNT);
        final var smallFutures = new ArrayList<Future<TestPackageInstaller.InstalledPackage>>(
                OVERLAY_PKG_COUNT);
        final var largeFutures = new ArrayList<Future<TestPackageInstaller.InstalledPackage>>(
                OVERLAY_PKG_COUNT);
        for (int i = 0; i < OVERLAY_PKG_COUNT; i++) {
            sSmallOverlays.add(installer.installPackage("Overlay" + i +".apk"));
            sLargeOverlays.add(installer.installPackage("LargeOverlay" + i +".apk"));
            final var index = i;
            smallFutures.add(es.submit(() -> installer.installPackage("Overlay" + index + ".apk")));
            largeFutures.add(
                    es.submit(() -> installer.installPackage("LargeOverlay" + index + ".apk")));
        }
        es.shutdown();
        assertTrue(es.awaitTermination(15 * 2 * OVERLAY_PKG_COUNT, TimeUnit.SECONDS));
        sSmallOverlays.addAll(smallFutures.stream().map(f -> uncheck(f::get)).sorted(
                Comparator.comparing(
                        TestPackageInstaller.InstalledPackage::getPackageName)).toList());
        sLargeOverlays.addAll(largeFutures.stream().map(f -> uncheck(f::get)).sorted(
                Comparator.comparing(
                        TestPackageInstaller.InstalledPackage::getPackageName)).toList());
    }

    @AfterClass
@@ -77,7 +107,6 @@ public class OverlayManagerPerfTest {
        for (TestPackageInstaller.InstalledPackage overlay : sSmallOverlays) {
            overlay.uninstall();
        }

        for (TestPackageInstaller.InstalledPackage overlay : sLargeOverlays) {
            overlay.uninstall();
        }
@@ -86,37 +115,39 @@ public class OverlayManagerPerfTest {
    @After
    public void tearDown() throws Exception {
        // Disable all test overlays after each test.
        for (TestPackageInstaller.InstalledPackage overlay : sSmallOverlays) {
            assertSetEnabled(sContext, overlay.getPackageName(), false);
        }

        for (TestPackageInstaller.InstalledPackage overlay : sLargeOverlays) {
            assertSetEnabled(sContext, overlay.getPackageName(), false);
        }
        assertSetEnabled(false, sContext,
                Stream.concat(sSmallOverlays.stream(), sLargeOverlays.stream()).map(
                        p -> p.getPackageName()));
    }

    /**
     * Enables the overlay and waits for the APK path changes to be propagated to the context
     * AssetManager.
     */
    private void assertSetEnabled(Context context, String overlayPackage, boolean eanabled)
            throws Exception {
        sOverlayManager.setEnabled(overlayPackage, true, UserHandle.SYSTEM);
    private void assertSetEnabled(boolean enabled, Context context, Stream<String> packagesStream) {
        final var overlayPackages = packagesStream.toList();
        overlayPackages.forEach(
                name -> sOverlayManager.setEnabled(name, enabled, UserHandle.SYSTEM));

        // Wait for the overlay changes to propagate
        FutureTask<Boolean> task = new FutureTask<>(() -> {
            while (true) {
                for (String path : context.getAssets().getApkPaths()) {
                    if (eanabled == path.contains(overlayPackage)) {
                        return true;
                    }
        final var endTime = System.nanoTime() + TimeUnit.SECONDS.toNanos(20);
        final var expectedPackagesFound = enabled ? overlayPackages.size() : 0;
        boolean assetsUpdated = false;
        do {
            final var packagesFound = Arrays.stream(context.getAssets().getApkPaths()).filter(
                    assetPath -> overlayPackages.stream().anyMatch(assetPath::contains)).count();
            if (packagesFound == expectedPackagesFound) {
                assetsUpdated = true;
                break;
            }
            Thread.yield();
        } while (System.nanoTime() < endTime);
        assertTrue("Failed to set state to " + enabled + " for overlays " + overlayPackages,
                assetsUpdated);
    }
        });

        sExecutor.execute(task);
        assertTrue("Failed to load overlay " + overlayPackage,
                task.get(20, TimeUnit.SECONDS));
    private void assertSetEnabled(boolean enabled, Context context, String overlayPackage) {
        assertSetEnabled(enabled, context, Stream.of(overlayPackage));
    }

    @Test
@@ -124,11 +155,11 @@ public class OverlayManagerPerfTest {
        String packageName = sSmallOverlays.get(0).getPackageName();
        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
        while (state.keepRunning()) {
            assertSetEnabled(sContext, packageName, true);
            assertSetEnabled(true, sContext, packageName);

            // Disable the overlay for the next iteration of the test
            state.pauseTiming();
            assertSetEnabled(sContext, packageName, false);
            assertSetEnabled(false, sContext, packageName);
            state.resumeTiming();
        }
    }
@@ -138,11 +169,11 @@ public class OverlayManagerPerfTest {
        String packageName = sSmallOverlays.get(0).getPackageName();
        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
        while (state.keepRunning()) {
            assertSetEnabled(sContext, packageName, true);
            assertSetEnabled(true, sContext, packageName);

            // Disable the overlay and remove the idmap for the next iteration of the test
            state.pauseTiming();
            assertSetEnabled(sContext, packageName, false);
            assertSetEnabled(false, sContext, packageName);
            sOverlayManager.invalidateCachesForOverlay(packageName, UserHandle.SYSTEM);
            state.resumeTiming();
        }
@@ -153,11 +184,11 @@ public class OverlayManagerPerfTest {
        String packageName = sLargeOverlays.get(0).getPackageName();
        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
        while (state.keepRunning()) {
            assertSetEnabled(sContext, packageName, true);
            assertSetEnabled(true, sContext, packageName);

            // Disable the overlay and remove the idmap for the next iteration of the test
            state.pauseTiming();
            assertSetEnabled(sContext, packageName, false);
            assertSetEnabled(false, sContext, packageName);
            sOverlayManager.invalidateCachesForOverlay(packageName, UserHandle.SYSTEM);
            state.resumeTiming();
        }
@@ -169,30 +200,28 @@ public class OverlayManagerPerfTest {
        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
        while (state.keepRunning()) {
            state.pauseTiming();
            assertSetEnabled(sContext, packageName, true);
            assertSetEnabled(true, sContext, packageName);
            state.resumeTiming();

            assertSetEnabled(sContext, packageName, false);
            assertSetEnabled(false, sContext, packageName);
        }
    }

    @Test
    public void getStringOneSmallOverlay() throws Exception {
        String packageName = sSmallOverlays.get(0).getPackageName();
        assertSetEnabled(sContext, packageName, true);
        assertSetEnabled(true, sContext, packageName);

        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
        while (state.keepRunning()) {
            sContext.getString(R.string.short_text);
        }

        assertSetEnabled(sContext, packageName, false);
    }

    @Test
    public void getStringOneLargeOverlay() throws Exception {
        String packageName = sLargeOverlays.get(0).getPackageName();
        assertSetEnabled(sContext, packageName, true);
        assertSetEnabled(true, sContext, packageName);

        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
        while (state.keepRunning()) {
@@ -200,16 +229,12 @@ public class OverlayManagerPerfTest {
                sContext.getString(resId);
            }
        }

        assertSetEnabled(sContext, packageName, false);
    }

    @Test
    public void getStringTenOverlays() throws Exception {
        // Enable all test overlays
        for (TestPackageInstaller.InstalledPackage overlay : sSmallOverlays) {
            assertSetEnabled(sContext, overlay.getPackageName(), true);
        }
        // Enable all small test overlays
        assertSetEnabled(true, sContext, sSmallOverlays.stream().map(p -> p.getPackageName()));

        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
        while (state.keepRunning()) {
@@ -219,10 +244,8 @@ public class OverlayManagerPerfTest {

    @Test
    public void getStringLargeTenOverlays() throws Exception {
        // Enable all test overlays
        for (TestPackageInstaller.InstalledPackage overlay : sLargeOverlays) {
            assertSetEnabled(sContext, overlay.getPackageName(), true);
        }
        // Enable all large test overlays
        assertSetEnabled(true, sContext, sLargeOverlays.stream().map(p -> p.getPackageName()));

        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
        while (state.keepRunning()) {
+2 −1
Original line number Diff line number Diff line
@@ -5808,9 +5808,10 @@ public class JobSchedulerService extends com.android.server.SystemService

    static void dumpHelp(PrintWriter pw) {
        pw.println("Job Scheduler (jobscheduler) dump options:");
        pw.println("  [-h] [package] ...");
        pw.println("  [-h] [package] [--proto] ...");
        pw.println("    -h: print this help");
        pw.println("  [package] is an optional package name to limit the output to.");
        pw.println("    --proto: output dump in protocol buffer format.");
    }

    /** Sort jobs by caller UID, then by Job ID. */
+40 −5
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ import android.os.Bundle;
import android.os.Debug;
import android.os.Handler;
import android.os.IBinder;
import android.os.IpcDataCache;
import android.os.LocaleList;
import android.os.Parcel;
import android.os.Parcelable;
@@ -237,6 +238,44 @@ public class ActivityManager {
    private static final RateLimitingCache<List<ProcessErrorStateInfo>> mErrorProcessesCache =
            new RateLimitingCache<>(10, 2);

    /**
     * Query handler for mGetCurrentUserIdCache - returns a cached value of the current foreground
     * user id if the backstage_power/android.app.cache_get_current_user_id flag is enabled.
     */
    private static final IpcDataCache.QueryHandler<Void, Integer> mGetCurrentUserIdQuery =
            new IpcDataCache.QueryHandler<>() {
                @Override
                public Integer apply(Void query) {
                    try {
                        return getService().getCurrentUserId();
                    } catch (RemoteException e) {
                        throw e.rethrowFromSystemServer();
                    }
                }

                @Override
                public boolean shouldBypassCache(Void query) {
                    // If the flag to enable the new caching behavior is off, bypass the cache.
                    return !Flags.cacheGetCurrentUserId();
                }
            };

    /** A cache which maintains the current foreground user id. */
    private static final IpcDataCache<Void, Integer> mGetCurrentUserIdCache =
            new IpcDataCache<>(1, IpcDataCache.MODULE_SYSTEM,
                    /* api= */ "getCurrentUserId", /* cacheName= */ "CurrentUserIdCache",
                    mGetCurrentUserIdQuery);

    /**
     * The current foreground user has changed - invalidate the cache. Currently only called from
     * UserController when a user switch occurs.
     * @hide
     */
    public static void invalidateGetCurrentUserIdCache() {
        IpcDataCache.invalidateCache(
                IpcDataCache.MODULE_SYSTEM, /* api= */ "getCurrentUserId");
    }

    /**
     * Map of callbacks that have registered for {@link UidFrozenStateChanged} events.
     * Will be called when a Uid has become frozen or unfrozen.
@@ -5244,11 +5283,7 @@ public class ActivityManager {
    })
    @android.ravenwood.annotation.RavenwoodReplace
    public static int getCurrentUser() {
        try {
            return getService().getCurrentUserId();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        return mGetCurrentUserIdCache.query(null);
    }

    /** @hide */
+10 −0
Original line number Diff line number Diff line
@@ -104,3 +104,13 @@ flag {
     }
}

flag {
     namespace: "backstage_power"
     name: "cache_get_current_user_id"
     description: "Add caching for getCurrentUserId"
     is_fixed_read_only: true
     bug: "361853873"
     metadata {
         purpose: PURPOSE_BUGFIX
     }
}
Loading