diff options
6 files changed, 57 insertions, 5 deletions
diff --git a/cmds/sm/src/com/android/commands/sm/Sm.java b/cmds/sm/src/com/android/commands/sm/Sm.java index 09343f174587..c6d717a55f34 100644 --- a/cmds/sm/src/com/android/commands/sm/Sm.java +++ b/cmds/sm/src/com/android/commands/sm/Sm.java @@ -101,6 +101,8 @@ public final class Sm { runFstrim(); } else if ("set-virtual-disk".equals(op)) { runSetVirtualDisk(); + } else if ("set-isolated-storage".equals(op)) { + runIsolatedStorage(); } else { throw new IllegalArgumentException(); } @@ -278,6 +280,20 @@ public final class Sm { StorageManager.DEBUG_VIRTUAL_DISK); } + public void runIsolatedStorage() throws RemoteException { + final boolean enableIsolatedStorage = Boolean.parseBoolean(nextArg()); + // 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(enableIsolatedStorage ? StorageManager.DEBUG_ISOLATED_STORAGE : 0, + StorageManager.DEBUG_ISOLATED_STORAGE); + } catch (RemoteException e) { + Log.e(TAG, "Encountered an error!", e); + } + }).start(); + } + public void runIdleMaint() throws RemoteException { final boolean im_run = "run".equals(nextArg()); if (im_run) { @@ -316,6 +332,8 @@ public final class Sm { System.err.println(""); System.err.println(" sm set-emulate-fbe [true|false]"); System.err.println(""); + System.err.println(" sm set-isolated-storage [true|false]"); + System.err.println(""); return 1; } } diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index 0c4a0b3e7cad..1bae3f74a5da 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -468,6 +468,14 @@ public class Environment { } /** + * Returns location of packages cache directory. + * {@hide} + */ + public static File getPackageCacheDirectory() { + return new File(getDataSystemDirectory(), "package_cache"); + } + + /** * Return the primary shared/external storage directory. This directory may * not currently be accessible if it has been mounted by the user on their * computer, has been removed from the device, or some other problem has diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java index 0b90f5437826..1f47f933cde9 100644 --- a/core/java/android/os/FileUtils.java +++ b/core/java/android/os/FileUtils.java @@ -1156,11 +1156,16 @@ public class FileUtils { public static @Nullable File createDir(File baseDir, String name) { final File dir = new File(baseDir, name); + return createDir(dir) ? dir : null; + } + + /** @hide */ + public static boolean createDir(File dir) { if (dir.exists()) { - return dir.isDirectory() ? dir : null; + return dir.isDirectory(); } - return dir.mkdir() ? dir : null; + return dir.mkdir(); } /** diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index c91cda689703..a61d8cbfe579 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -225,6 +225,8 @@ public class StorageManager { public static final int DEBUG_SDCARDFS_FORCE_OFF = 1 << 4; /** {@hide} */ public static final int DEBUG_VIRTUAL_DISK = 1 << 5; + /** {@hide} */ + public static final int DEBUG_ISOLATED_STORAGE = 1 << 6; /** {@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 54c7d17d70a7..86048f03b770 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -2097,6 +2097,26 @@ class StorageManagerService extends IStorageManager.Stub Binder.restoreCallingIdentity(token); } } + + if ((mask & StorageManager.DEBUG_ISOLATED_STORAGE) != 0) { + final boolean enabled = (flags & StorageManager.DEBUG_ISOLATED_STORAGE) != 0; + + final long token = Binder.clearCallingIdentity(); + try { + SystemProperties.set(StorageManager.PROP_ISOLATED_STORAGE, + Boolean.toString(enabled)); + + // Some of the storage related permissions get fiddled with during + // package scanning. So, delete the package cache to force PackageManagerService + // to do package scanning. + FileUtils.deleteContents(Environment.getPackageCacheDirectory()); + + // Perform hard reboot to kick policy into place + mContext.getSystemService(PowerManager.class).reboot(null); + } finally { + Binder.restoreCallingIdentity(token); + } + } } @Override diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index ed3e8577a5b4..becf26309903 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3257,9 +3257,8 @@ public class PackageManagerService extends IPackageManager.Stub } // The base directory for the package parser cache lives under /data/system/. - final File cacheBaseDir = FileUtils.createDir(Environment.getDataSystemDirectory(), - "package_cache"); - if (cacheBaseDir == null) { + final File cacheBaseDir = Environment.getPackageCacheDirectory(); + if (!FileUtils.createDir(cacheBaseDir)) { return null; } |