Developer option to disable legacy greylist.
The app developers on the legacy greylist need an option to disable
the greylist so they can debug.
Bug: 124818022
Test: manual
Change-Id: I84785a235830761794dee5c603c1ea43f8ace73e
diff --git a/cmds/sm/src/com/android/commands/sm/Sm.java b/cmds/sm/src/com/android/commands/sm/Sm.java
index be5a5bf..4a6f87f 100644
--- a/cmds/sm/src/com/android/commands/sm/Sm.java
+++ b/cmds/sm/src/com/android/commands/sm/Sm.java
@@ -103,6 +103,8 @@
runSetVirtualDisk();
} else if ("set-isolated-storage".equals(op)) {
runIsolatedStorage();
+ } else if ("set-legacy-greylist".equals(op)) {
+ runLegacyGreylist();
} else {
throw new IllegalArgumentException();
}
@@ -282,7 +284,7 @@
StorageManager.DEBUG_VIRTUAL_DISK);
}
- public void runIsolatedStorage() {
+ public void runIsolatedStorage() throws RemoteException {
final int value;
final int mask = StorageManager.DEBUG_ISOLATED_STORAGE_FORCE_ON
| StorageManager.DEBUG_ISOLATED_STORAGE_FORCE_OFF;
@@ -301,16 +303,13 @@
default:
return;
}
+ mSm.setDebugFlags(value, mask);
+ }
- // Toggling isolated-storage state will result in a device reboot. So to avoid this command
- // from erroring out (DeadSystemException), call setDebugFlags() in a separate thread.
- new Thread(() -> {
- try {
- mSm.setDebugFlags(value, mask);
- } catch (RemoteException e) {
- Log.e(TAG, "Encountered an error!", e);
- }
- }).start();
+ public void runLegacyGreylist() throws RemoteException {
+ final boolean legacyGreylist = Boolean.parseBoolean(nextArg());
+ mSm.setDebugFlags(legacyGreylist ? StorageManager.DEBUG_LEGACY_GREYLIST : 0,
+ StorageManager.DEBUG_LEGACY_GREYLIST);
}
public void runIdleMaint() throws RemoteException {
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 90a5f76..27e3914 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -136,6 +136,8 @@
public static final String PROP_ISOLATED_STORAGE = "persist.sys.isolated_storage";
/** {@hide} */
public static final String PROP_ISOLATED_STORAGE_SNAPSHOT = "sys.isolated_storage_snapshot";
+ /** {@hide} */
+ public static final String PROP_LEGACY_GREYLIST = "persist.sys.legacy_greylist";
/** {@hide} */
public static final String PROP_FORCE_AUDIO = "persist.fw.force_audio";
@@ -233,6 +235,8 @@
public static final int DEBUG_ISOLATED_STORAGE_FORCE_ON = 1 << 6;
/** {@hide} */
public static final int DEBUG_ISOLATED_STORAGE_FORCE_OFF = 1 << 7;
+ /** {@hide} */
+ public static final int DEBUG_LEGACY_GREYLIST = 1 << 8;
/** {@hide} */
public static final int FLAG_STORAGE_DE = IInstalld.FLAG_STORAGE_DE;
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index ada3947..8fea3a4 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -205,6 +205,9 @@
private static final boolean ENABLE_ISOLATED_STORAGE = StorageManager.hasIsolatedStorage();
+ private static final boolean ENABLE_LEGACY_GREYLIST = SystemProperties
+ .getBoolean(StorageManager.PROP_LEGACY_GREYLIST, true);
+
public static class Lifecycle extends SystemService {
private StorageManagerService mStorageManagerService;
@@ -2289,7 +2292,26 @@
refreshIsolatedStorageSettings();
// Perform hard reboot to kick policy into place
- mContext.getSystemService(PowerManager.class).reboot(null);
+ mHandler.post(() -> {
+ mContext.getSystemService(PowerManager.class).reboot(null);
+ });
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ if ((mask & StorageManager.DEBUG_LEGACY_GREYLIST) != 0) {
+ final boolean enabled = (flags & StorageManager.DEBUG_LEGACY_GREYLIST) != 0;
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ SystemProperties.set(StorageManager.PROP_LEGACY_GREYLIST,
+ Boolean.toString(enabled));
+
+ // Perform hard reboot to kick policy into place
+ mHandler.post(() -> {
+ mContext.getSystemService(PowerManager.class).reboot(null);
+ });
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -3675,16 +3697,17 @@
} else if (mPmInternal.isInstantApp(packageName, UserHandle.getUserId(uid))) {
return Zygote.MOUNT_EXTERNAL_NONE;
} else {
- // STOPSHIP: remove this temporary workaround once developers
- // fix bugs where they're opening _data paths in native code
- switch (packageName) {
- case "com.facebook.katana": // b/123996076
- case "jp.naver.line.android": // b/124767356
- case "com.mxtech.videoplayer.ad": // b/124531483
- return Zygote.MOUNT_EXTERNAL_LEGACY;
- default:
- return Zygote.MOUNT_EXTERNAL_WRITE;
+ if (ENABLE_LEGACY_GREYLIST) {
+ // STOPSHIP: remove this temporary workaround once developers
+ // fix bugs where they're opening _data paths in native code
+ switch (packageName) {
+ case "com.facebook.katana": // b/123996076
+ case "jp.naver.line.android": // b/124767356
+ case "com.mxtech.videoplayer.ad": // b/124531483
+ return Zygote.MOUNT_EXTERNAL_LEGACY;
+ }
}
+ return Zygote.MOUNT_EXTERNAL_WRITE;
}
} catch (RemoteException e) {
// Should not happen