Merge "Allow ExternalStorageProvider to access all Android/ dirs" into rvc-dev am: 51f5e20ec1 am: 6a557f65cd am: 77f7ceae07 am: 40f740c760
Change-Id: I1cd41288623e0e09d55cbe413f4d5dfd786254be
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index d137e68..a39b6d9 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -121,6 +121,7 @@
import android.os.storage.VolumeInfo;
import android.os.storage.VolumeRecord;
import android.provider.DeviceConfig;
+import android.provider.DocumentsContract;
import android.provider.Downloads;
import android.provider.MediaStore;
import android.provider.Settings;
@@ -432,6 +433,8 @@
private volatile int mDownloadsAuthorityAppId = -1;
+ private volatile int mExternalStorageAuthorityAppId = -1;
+
private volatile int mCurrentUserId = UserHandle.USER_SYSTEM;
private final Installer mInstaller;
@@ -1924,24 +1927,22 @@
mIAppOpsService = IAppOpsService.Stub.asInterface(
ServiceManager.getService(Context.APP_OPS_SERVICE));
- ProviderInfo provider = mPmInternal.resolveContentProvider(
- MediaStore.AUTHORITY, PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
- UserHandle.getUserId(UserHandle.USER_SYSTEM));
+ ProviderInfo provider = getProviderInfo(MediaStore.AUTHORITY);
if (provider != null) {
mMediaStoreAuthorityAppId = UserHandle.getAppId(provider.applicationInfo.uid);
sMediaStoreAuthorityProcessName = provider.applicationInfo.processName;
}
- provider = mPmInternal.resolveContentProvider(
- Downloads.Impl.AUTHORITY, PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
- UserHandle.getUserId(UserHandle.USER_SYSTEM));
-
+ provider = getProviderInfo(Downloads.Impl.AUTHORITY);
if (provider != null) {
mDownloadsAuthorityAppId = UserHandle.getAppId(provider.applicationInfo.uid);
}
+ provider = getProviderInfo(DocumentsContract.EXTERNAL_STORAGE_PROVIDER_AUTHORITY);
+ if (provider != null) {
+ mExternalStorageAuthorityAppId = UserHandle.getAppId(provider.applicationInfo.uid);
+ }
+
if (!mIsFuseEnabled) {
try {
mIAppOpsService.startWatchingMode(OP_REQUEST_INSTALL_PACKAGES, null,
@@ -1952,6 +1953,13 @@
}
}
+ private ProviderInfo getProviderInfo(String authority) {
+ return mPmInternal.resolveContentProvider(
+ authority, PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
+ UserHandle.getUserId(UserHandle.USER_SYSTEM));
+ }
+
private void updateLegacyStorageApps(String packageName, int uid, boolean hasLegacy) {
synchronized (mLock) {
if (hasLegacy) {
@@ -4192,9 +4200,11 @@
return Zygote.MOUNT_EXTERNAL_PASS_THROUGH;
}
- if (mIsFuseEnabled && mDownloadsAuthorityAppId == UserHandle.getAppId(uid)) {
+ if (mIsFuseEnabled && (mDownloadsAuthorityAppId == UserHandle.getAppId(uid)
+ || mExternalStorageAuthorityAppId == UserHandle.getAppId(uid))) {
// DownloadManager can write in app-private directories on behalf of apps;
// give it write access to Android/
+ // ExternalStorageProvider can access Android/{data,obb} dirs in managed mode
return Zygote.MOUNT_EXTERNAL_ANDROID_WRITABLE;
}