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
This commit is contained in:
Andreas Gampe
2018-08-31 15:47:01 -07:00
parent f5121c964b
commit fa8b57d4f5
3 changed files with 12 additions and 6 deletions

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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.