diff options
author | Andreas Gampe <agampe@google.com> | 2018-08-31 15:47:01 -0700 |
---|---|---|
committer | Andreas Gampe <agampe@google.com> | 2018-08-31 18:05:18 -0700 |
commit | fa8b57d4f50c1673947d0d9cf2c490e96d6e877a (patch) | |
tree | 08d11b0c57785704fdb0775e8b4578fa2a9d9ba9 | |
parent | f5121c964b5cc7ca4c71313b7a25abdd81377e36 (diff) |
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
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 182901ac0ba6..9b097bfe0bc3 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 f2c0395f9f0e..361416adc4ef 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 e509d2d87bf7..fd20f4a1fa77 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. |