diff --git a/core/java/android/os/storage/StorageManagerInternal.java b/core/java/android/os/storage/StorageManagerInternal.java index d102b194f86df..d850e27e913f0 100644 --- a/core/java/android/os/storage/StorageManagerInternal.java +++ b/core/java/android/os/storage/StorageManagerInternal.java @@ -79,4 +79,18 @@ public abstract class StorageManagerInternal { * @return The mount mode. */ public abstract int getExternalStorageMountMode(int uid, String packageName); + + /** + * Mount external storage for the given package. + * + *

This will involve calling into vold to setup appropriate bind mounts. + * + * @param packageName The package for which external storage will be mounted. + * @param appId The appId for the given package. + * @param sharedUserId The sharedUserId for given package if it specified + * {@code android:sharedUserId} in the manifest, otherwise {@code null} + * @param userId + */ + public abstract void mountExternalStorageForApp(String packageName, int appId, + String sharedUserId, int userId); } diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 42157cc562b94..b169f73ea13e3 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -3803,5 +3803,29 @@ class StorageManagerService extends IStorageManager.Stub } return true; } + + @Override + public void mountExternalStorageForApp(String packageName, int appId, String sharedUserId, + int userId) { + final String sandboxId; + synchronized (mPackagesLock) { + final ArraySet userPackages = getPackagesForUserPL(userId); + // If userPackages is empty, it means the user is not started yet, so no need to + // do anything now. + if (userPackages.isEmpty() || userPackages.contains(packageName)) { + return; + } + userPackages.add(packageName); + mAppIds.put(packageName, appId); + sandboxId = getSandboxId(packageName, sharedUserId); + mSandboxIds.put(appId, sandboxId); + } + + try { + mVold.mountExternalStorageForApp(packageName, appId, sandboxId, userId); + } catch (Exception e) { + Slog.wtf(TAG, e); + } + } } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 3b67663697ec1..fe94878ff5e56 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -21358,9 +21358,9 @@ public class PackageManagerService extends IPackageManager.Stub mDexManager.systemReady(); mPackageDexOptimizer.systemReady(); - StorageManagerInternal StorageManagerInternal = LocalServices.getService( + StorageManagerInternal storageManagerInternal = LocalServices.getService( StorageManagerInternal.class); - StorageManagerInternal.addExternalStoragePolicy( + storageManagerInternal.addExternalStoragePolicy( new StorageManagerInternal.ExternalStorageMountPolicy() { @Override public int getMountMode(int uid, String packageName) { @@ -22798,6 +22798,12 @@ public class PackageManagerService extends IPackageManager.Stub } prepareAppDataContentsLeafLIF(pkg, userId, flags); + final StorageManagerInternal storageManagerInternal + = LocalServices.getService(StorageManagerInternal.class); + if (storageManagerInternal != null) { + storageManagerInternal.mountExternalStorageForApp( + pkg.packageName, appId, pkg.mSharedUserId, userId); + } } private void prepareAppDataContentsLIF(PackageParser.Package pkg, int userId, int flags) {