From fa8b57d4f50c1673947d0d9cf2c490e96d6e877a Mon Sep 17 00:00:00 2001 From: Andreas Gampe Date: Fri, 31 Aug 2018 15:47:01 -0700 Subject: [PATCH] Framework: Allow root to send bg-dexopt To allow testing, and work on rooted userdebug devices, allow the root user to issue package bg-dexopt commands. Bug: 111798412 Test: atest BackgroundDexOptServiceIntegrationTests Change-Id: I5f52b8322ba386c797a9176a1b216cc547c66456 --- .../com/android/server/pm/PackageManagerService.java | 10 +++++----- .../android/server/pm/PackageManagerShellCommand.java | 1 + .../pm/BackgroundDexOptServiceIntegrationTests.java | 7 ++++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 182901ac0ba6b..9b097bfe0bc37 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -8960,15 +8960,15 @@ public class PackageManagerService extends IPackageManager.Stub } /** - * Enforces that only the system UID or shell's UID can call a method exposed - * via Binder. + * Enforces that only the system UID or root's UID or shell's UID can call + * a method exposed via Binder. * * @param message used as message if SecurityException is thrown * @throws SecurityException if the caller is not system or shell */ - private static void enforceSystemOrShell(String message) { + private static void enforceSystemOrRootOrShell(String message) { final int uid = Binder.getCallingUid(); - if (uid != Process.SYSTEM_UID && uid != Process.SHELL_UID) { + if (uid != Process.SYSTEM_UID && uid != Process.ROOT_UID && uid != Process.SHELL_UID) { throw new SecurityException(message); } } @@ -9454,7 +9454,7 @@ public class PackageManagerService extends IPackageManager.Stub if (getInstantAppPackageName(Binder.getCallingUid()) != null) { return false; } - enforceSystemOrShell("runBackgroundDexoptJob"); + enforceSystemOrRootOrShell("runBackgroundDexoptJob"); final long identity = Binder.clearCallingIdentity(); try { return BackgroundDexOptService.runIdleOptimizationsNow(this, mContext, packageNames); diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index f2c0395f9f0ea..361416adc4efc 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -1302,6 +1302,7 @@ class PackageManagerShellCommand extends ShellCommand { } boolean result = mInterface.runBackgroundDexoptJob(packageNames.isEmpty() ? null : packageNames); + getOutPrintWriter().println(result ? "Success" : "Failure"); return result ? 0 : -1; } diff --git a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java index e509d2d87bf7d..fd20f4a1fa77d 100644 --- a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java +++ b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java @@ -154,6 +154,8 @@ public final class BackgroundDexOptServiceIntegrationTests { stdout.append(new String(buf, 0, bytesRead)); } fis.close(); + Log.i(TAG, "stdout"); + Log.i(TAG, stdout.toString()); return stdout.toString(); } @@ -202,7 +204,10 @@ public final class BackgroundDexOptServiceIntegrationTests { // TODO(aeubanks): figure out how to get scheduled bg-dexopt to run private static void runBackgroundDexOpt() throws IOException { - runShellCommand("cmd package bg-dexopt-job " + PACKAGE_NAME); + String result = runShellCommand("cmd package bg-dexopt-job " + PACKAGE_NAME); + if (!result.trim().equals("Success")) { + throw new IllegalStateException("Expected command success, received >" + result + "<"); + } } // Set the time ahead of the last use time of the test app in days.