From 2f038309e06b5f70e65c0432abcea9f7db21dfe3 Mon Sep 17 00:00:00 2001 From: Alex Buynytskyy Date: Mon, 21 Mar 2022 12:55:05 -0700 Subject: [PATCH] Benchmark fix. Previous change removed full GC from uninstall flow. Add a shell command to force full GC. Use the shell command to get to a clean state after install/uninstall cycle. ========================================================================================================================================================== (previous) Runtime.getRuntime().gc(); --------------------------------- com.android.perftests.packagemanager (1 Test(s)) [1/1] android.content.pm.PackageInstallerBenchmark#commit_threeMultiplePackageSessions_untilFinishBenchmark: PASSED (02m10.101s) commit_threeMultiplePackageSessions_untilFinishBenchmark_min (ns): 689576794 commit_threeMultiplePackageSessions_untilFinishBenchmark_median (ns): 714554346 commit_threeMultiplePackageSessions_untilFinishBenchmark_mean (ns): 711425403 commit_threeMultiplePackageSessions_untilFinishBenchmark_standardDeviation: 17602400 --------------------------------- com.android.perftests.packagemanager (1 Test(s)) [1/1] android.content.pm.PackageInstallerBenchmark#commit_threeMultiplePackageSessions_untilFinishBenchmark: PASSED (02m24.778s) commit_threeMultiplePackageSessions_untilFinishBenchmark_min (ns): 733331347 commit_threeMultiplePackageSessions_untilFinishBenchmark_median (ns): 761475101 commit_threeMultiplePackageSessions_untilFinishBenchmark_mean (ns): 768526419 commit_threeMultiplePackageSessions_untilFinishBenchmark_standardDeviation: 30700805 ========================================================================================================================================================== (current) VMRuntime.getRuntime().requestConcurrentGC(); --------------------------------- com.android.perftests.packagemanager (1 Test(s)) [1/1] android.content.pm.PackageInstallerBenchmark#commit_threeMultiplePackageSessions_untilFinishBenchmark: PASSED (01m42.290s) commit_threeMultiplePackageSessions_untilFinishBenchmark_min (ns): 781405493 commit_threeMultiplePackageSessions_untilFinishBenchmark_median (ns): 793544987 commit_threeMultiplePackageSessions_untilFinishBenchmark_mean (ns): 802736110 commit_threeMultiplePackageSessions_untilFinishBenchmark_standardDeviation: 21416153 --------------------------------- com.android.perftests.packagemanager (1 Test(s)) [1/1] android.content.pm.PackageInstallerBenchmark#commit_threeMultiplePackageSessions_untilFinishBenchmark: PASSED (01m55.299s) commit_threeMultiplePackageSessions_untilFinishBenchmark_min (ns): 834772461 commit_threeMultiplePackageSessions_untilFinishBenchmark_median (ns): 845870959 commit_threeMultiplePackageSessions_untilFinishBenchmark_mean (ns): 853225375 commit_threeMultiplePackageSessions_untilFinishBenchmark_standardDeviation: 20008646 ========================================================================================================================================================== (fixed) --------------------------------- com.android.perftests.packagemanager (1 Test(s)) [1/1] android.content.pm.PackageInstallerBenchmark#commit_threeMultiplePackageSessions_untilFinishBenchmark: PASSED (01m53.377s) commit_threeMultiplePackageSessions_untilFinishBenchmark_min (ns): 692397872 commit_threeMultiplePackageSessions_untilFinishBenchmark_median (ns): 724355473 commit_threeMultiplePackageSessions_untilFinishBenchmark_mean (ns): 718845819 commit_threeMultiplePackageSessions_untilFinishBenchmark_standardDeviation: 24269029 --------------------------------- com.android.perftests.packagemanager (1 Test(s)) [1/1] android.content.pm.PackageInstallerBenchmark#commit_threeMultiplePackageSessions_untilFinishBenchmark: PASSED (02m12.683s) commit_threeMultiplePackageSessions_untilFinishBenchmark_min (ns): 745539006 commit_threeMultiplePackageSessions_untilFinishBenchmark_median (ns): 793251286 commit_threeMultiplePackageSessions_untilFinishBenchmark_mean (ns): 788150394 commit_threeMultiplePackageSessions_untilFinishBenchmark_standardDeviation: 27868293 Bug: 222961573 Fixes: 222961573 Test: atest PackageInstallerBenchmark Change-Id: I0dda41781b0de5f3350498a7ca3a6d1296f63a04 --- .../content/pm/PackageInstallerBenchmark.java | 36 +++++++++++++++---- .../server/pm/PackageManagerShellCommand.java | 9 +++++ 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/apct-tests/perftests/packagemanager/src/android/content/pm/PackageInstallerBenchmark.java b/apct-tests/perftests/packagemanager/src/android/content/pm/PackageInstallerBenchmark.java index 3b4f72b2e50a9..e20f30d1810b6 100644 --- a/apct-tests/perftests/packagemanager/src/android/content/pm/PackageInstallerBenchmark.java +++ b/apct-tests/perftests/packagemanager/src/android/content/pm/PackageInstallerBenchmark.java @@ -17,10 +17,12 @@ package android.content.pm; import android.Manifest; +import android.app.UiAutomation; import android.content.Context; import android.content.Intent; import android.content.IntentSender; import android.os.HandlerThread; +import android.os.ParcelFileDescriptor; import android.perftests.utils.BenchmarkState; import android.perftests.utils.PerfStatusReporter; import android.util.Log; @@ -39,7 +41,10 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; @@ -203,13 +208,33 @@ public class PackageInstallerBenchmark { } private void uninstallSession(BenchmarkState state, String...packageNames) - throws InterruptedException { + throws Exception { state.pauseTiming(); uninstall(true /* stop at fail */, packageNames); mPackageInstaller.unregisterSessionCallback(mSessionCallback); + executeShellCommand("pm gc"); state.resumeTiming(); } + private static String executeShellCommand(String command) throws IOException { + UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation(); + final ParcelFileDescriptor stdout = uiAutomation.executeShellCommand(command); + try (InputStream inputStream = new ParcelFileDescriptor.AutoCloseInputStream(stdout); + ByteArrayOutputStream result = new ByteArrayOutputStream()) { + writeFullStream(inputStream, result); + return result.toString("UTF-8"); + } + } + + private static void writeFullStream(InputStream inputStream, OutputStream outputStream) + throws IOException { + final byte[] buffer = new byte[1024]; + int length; + while ((length = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, length); + } + } + @Test(timeout = 600_000L) public void commit_aSingleApkSession_untilFinishBenchmark() throws Exception { uninstall(false /* stop at fail */, TestApp.A); @@ -247,8 +272,7 @@ public class PackageInstallerBenchmark { } @Test(timeout = 600_000L) - public void commit_aMultiplePackagesSession_untilFinishBenchmark() - throws IOException, InterruptedException { + public void commit_aMultiplePackagesSession_untilFinishBenchmark() throws Exception { uninstall(false /* stop at fail */, TestApp.A, TestApp.B, TestApp.C); final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); @@ -269,8 +293,7 @@ public class PackageInstallerBenchmark { } @Test(timeout = 600_000L) - public void commit_threeMultiplePackageSessions_untilFinishBenchmark() - throws Exception { + public void commit_threeMultiplePackageSessions_untilFinishBenchmark() throws Exception { uninstall(false /* stop at fail */, TestApp.A, TestApp.B, TestApp.C); final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); @@ -293,8 +316,7 @@ public class PackageInstallerBenchmark { } @Test(timeout = 600_000L) - public void commit_aMultipleApksSession_untilFinishBenchmark() - throws IOException, InterruptedException { + public void commit_aMultipleApksSession_untilFinishBenchmark() throws Exception { uninstall(false /* stop at fail */, TestApp.A); final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 15753cd24e85b..581e4e26da81e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -188,6 +188,8 @@ class PackageManagerShellCommand extends ShellCommand { return runDump(); case "list": return runList(); + case "gc": + return runGc(); case "resolve-activity": return runResolveActivity(); case "query-activities": @@ -687,6 +689,13 @@ class PackageManagerShellCommand extends ShellCommand { return -1; } + private int runGc() throws RemoteException { + Runtime.getRuntime().gc(); + final PrintWriter pw = getOutPrintWriter(); + pw.println("Ok"); + return 0; + } + private int runListFeatures() throws RemoteException { final PrintWriter pw = getOutPrintWriter(); final List list = mInterface.getSystemAvailableFeatures().getList();