diff options
author | Jeff Sharkey <jsharkey@android.com> | 2019-02-27 12:09:57 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2019-02-27 12:09:59 -0700 |
commit | 36274999fea6843d2e93591f35e42a79d5553d28 (patch) | |
tree | bf5cd4f1f536b482dd48a11e432cac6aed515169 | |
parent | ab864c6dd358cb2b54f85ed31603871251e0086e (diff) |
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
-rw-r--r-- | cmds/sm/src/com/android/commands/sm/Sm.java | 19 | ||||
-rw-r--r-- | core/java/android/os/storage/StorageManager.java | 4 | ||||
-rw-r--r-- | services/core/java/com/android/server/StorageManagerService.java | 43 |
3 files changed, 46 insertions, 20 deletions
diff --git a/cmds/sm/src/com/android/commands/sm/Sm.java b/cmds/sm/src/com/android/commands/sm/Sm.java index be5a5bf6c35a..4a6f87f09d29 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 @@ public final class Sm { 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 @@ public final class Sm { 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 @@ public final class Sm { 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 90a5f7660e0d..27e391423d21 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -136,6 +136,8 @@ public class StorageManager { 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 class StorageManager { 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 ada3947477de..8fea3a4d150d 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -205,6 +205,9 @@ class StorageManagerService extends IStorageManager.Stub 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 @@ class StorageManagerService extends IStorageManager.Stub 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 @@ class StorageManagerService extends IStorageManager.Stub } 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 |