Add adb command for overriding platform compat config

New adb command supports has the format:
adb shell am compat enable|disable|reset <CHANGE_ID|CHANGE_NAME> <PACKAGE_NAME>

Bug: 136051618
Test: adb shell am compat enable 42 foo.bar.baz
Test: adb shell am compat disable 42 foo.bar.baz
Test: adb shell am compat reset 42 foo.bar.baz
Test: adb shell am compat enable fooChange foo.bar.baz
Change-Id: I981067477f6f4aa435459c0bc9a52099e6f5d445
Merged-In: I981067477f6f4aa435459c0bc9a52099e6f5d445
Exempted-From-Owner-Approval: cherry-pick of an already approved CL
(cherry picked from commit a2055011db)
This commit is contained in:
Andrei Onea
2019-06-28 18:42:22 +01:00
committed by Andrei-Valentin Onea
parent 2968a449bc
commit c014fb5ca9
2 changed files with 60 additions and 3 deletions

View File

@@ -88,6 +88,7 @@ import android.view.Display;
import com.android.internal.util.HexDump;
import com.android.internal.util.MemInfoReader;
import com.android.internal.util.Preconditions;
import com.android.server.compat.CompatConfig;
import java.io.BufferedReader;
import java.io.File;
@@ -288,6 +289,8 @@ final class ActivityManagerShellCommand extends ShellCommand {
return runNoHomeScreen(pw);
case "wait-for-broadcast-idle":
return runWaitForBroadcastIdle(pw);
case "compat":
return runCompat(pw);
default:
return handleDefaultCommands(cmd);
}
@@ -2865,6 +2868,50 @@ final class ActivityManagerShellCommand extends ShellCommand {
return 0;
}
private int runCompat(PrintWriter pw) {
final CompatConfig config = CompatConfig.get();
String toggleValue = getNextArgRequired();
long changeId;
String changeIdString = getNextArgRequired();
try {
changeId = Long.parseLong(changeIdString);
} catch (NumberFormatException e) {
changeId = config.lookupChangeId(changeIdString);
}
if (changeId == -1) {
pw.println("Unknown or invalid change: '" + changeIdString + "'.");
}
String packageName = getNextArgRequired();
switch(toggleValue) {
case "enable":
if (!config.addOverride(changeId, packageName, true)) {
pw.println("Warning! Change " + changeId + " is not known yet. Enabling it"
+ " could have no effect.");
}
pw.println("Enabled change " + changeId + " for " + packageName + ".");
return 0;
case "disable":
if (!config.addOverride(changeId, packageName, false)) {
pw.println("Warning! Change " + changeId + " is not known yet. Disabling it"
+ " could have no effect.");
}
pw.println("Disabled change " + changeId + " for " + packageName + ".");
return 0;
case "reset":
if (config.removeOverride(changeId, packageName)) {
pw.println("Reset change " + changeId + " for " + packageName
+ " to default value.");
} else {
pw.println("No override exists for changeId " + changeId + ".");
}
return 0;
default:
pw.println("Invalid toggle value: '" + toggleValue + "'.");
}
return -1;
}
private Resources getResources(PrintWriter pw) throws RemoteException {
// system resources does not contain all the device configuration, construct it manually.
Configuration config = mInterface.getConfiguration();
@@ -3170,6 +3217,8 @@ final class ActivityManagerShellCommand extends ShellCommand {
pw.println(" without restarting any processes.");
pw.println(" write");
pw.println(" Write all pending state to storage.");
pw.println(" compat enable|disable|reset <CHANGE_ID|CHANGE_NAME> <PACKAGE_NAME>");
pw.println(" Toggles a change either by id or by name for <PACKAGE_NAME>.");
pw.println();
Intent.printIntentArgsHelp(pw, "");
}

View File

@@ -128,20 +128,24 @@ public final class CompatConfig {
* <p>Note, package overrides are not persistent and will be lost on system or runtime restart.
*
* @param changeId The ID of the change to be overridden. Note, this call will succeed even if
* this change is not known; it will only have any affect if any code in the
* this change is not known; it will only have any effect if any code in the
* platform is gated on the ID given.
* @param packageName The app package name to override the change for.
* @param enabled If the change should be enabled or disabled.
* @return {@code true} if the change existed before adding the override.
*/
public void addOverride(long changeId, String packageName, boolean enabled) {
public boolean addOverride(long changeId, String packageName, boolean enabled) {
boolean alreadyKnown = true;
synchronized (mChanges) {
CompatChange c = mChanges.get(changeId);
if (c == null) {
alreadyKnown = false;
c = new CompatChange(changeId);
addChange(c);
}
c.addPackageOverride(packageName, enabled);
}
return alreadyKnown;
}
/**
@@ -151,14 +155,18 @@ public final class CompatConfig {
*
* @param changeId The ID of the change that was overridden.
* @param packageName The app package name that was overridden.
* @return {@code true} if an override existed;
*/
public void removeOverride(long changeId, String packageName) {
public boolean removeOverride(long changeId, String packageName) {
boolean overrideExists = false;
synchronized (mChanges) {
CompatChange c = mChanges.get(changeId);
if (c != null) {
overrideExists = true;
c.removePackageOverride(packageName);
}
}
return overrideExists;
}
}