summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmds/sm/src/com/android/commands/sm/Sm.java11
-rw-r--r--core/java/android/os/storage/IStorageManager.aidl1
-rw-r--r--services/core/java/com/android/server/StorageManagerService.java22
3 files changed, 33 insertions, 1 deletions
diff --git a/cmds/sm/src/com/android/commands/sm/Sm.java b/cmds/sm/src/com/android/commands/sm/Sm.java
index c2ee6dcd13b2..405d6f6f5f63 100644
--- a/cmds/sm/src/com/android/commands/sm/Sm.java
+++ b/cmds/sm/src/com/android/commands/sm/Sm.java
@@ -107,6 +107,8 @@ public final class Sm {
runStartCheckpoint();
} else if ("supports-checkpoint".equals(op)) {
runSupportsCheckpoint();
+ } else if ("unmount-app-data-dirs".equals(op)) {
+ runDisableAppDataIsolation();
} else {
throw new IllegalArgumentException();
}
@@ -253,6 +255,13 @@ public final class Sm {
System.out.println(result.get());
}
+ public void runDisableAppDataIsolation() throws RemoteException {
+ final String pkgName = nextArg();
+ final int pid = Integer.parseInt(nextArg());
+ final int userId = Integer.parseInt(nextArg());
+ mSm.disableAppDataIsolation(pkgName, pid, userId);
+ }
+
public void runForget() throws RemoteException {
final String fsUuid = nextArg();
if ("all".equals(fsUuid)) {
@@ -373,6 +382,8 @@ public final class Sm {
System.err.println("");
System.err.println(" sm supports-checkpoint");
System.err.println("");
+ System.err.println(" sm unmount-app-data-dirs PACKAGE_NAME PID USER_ID");
+ System.err.println("");
return 1;
}
}
diff --git a/core/java/android/os/storage/IStorageManager.aidl b/core/java/android/os/storage/IStorageManager.aidl
index 99bdfd1fc103..4669b208b163 100644
--- a/core/java/android/os/storage/IStorageManager.aidl
+++ b/core/java/android/os/storage/IStorageManager.aidl
@@ -195,4 +195,5 @@ interface IStorageManager {
void abortChanges(in String message, boolean retry) = 87;
void clearUserKeyAuth(int userId, int serialNumber, in byte[] token, in byte[] secret) = 88;
void fixupAppDir(in String path) = 89;
+ void disableAppDataIsolation(in String pkgName, int pid, int userId) = 90;
}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index a48415158bc6..5c34584d0adf 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -1609,7 +1609,6 @@ class StorageManagerService extends IStorageManager.Stub
}
}
-
private void onVolumeStateChangedAsync(VolumeInfo vol, int oldState, int newState) {
synchronized (mLock) {
// Remember that we saw this volume so we're ready to accept user
@@ -3430,6 +3429,27 @@ class StorageManagerService extends IStorageManager.Stub
}
}
+ /*
+ * Disable storage's app data isolation for testing.
+ */
+ @Override
+ public void disableAppDataIsolation(String pkgName, int pid, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ if (callingUid != Process.ROOT_UID && callingUid != Process.SHELL_UID) {
+ throw new SecurityException("no permission to enable app visibility");
+ }
+ final String[] sharedPackages =
+ mPmInternal.getSharedUserPackagesForPackage(pkgName, userId);
+ final int uid = mPmInternal.getPackageUid(pkgName, 0, userId);
+ final String[] packages =
+ sharedPackages.length != 0 ? sharedPackages : new String[]{pkgName};
+ try {
+ mVold.unmountAppStorageDirs(uid, pid, packages);
+ } catch (RemoteException e) {
+ throw e.rethrowAsRuntimeException();
+ }
+ }
+
/** Not thread safe */
class AppFuseMountScope extends AppFuseBridge.MountScope {
private boolean mMounted = false;