From 3f704637b47bb7bc1f8d0004213fa3e803c21c58 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Tue, 14 May 2019 14:55:13 -0600 Subject: [PATCH] Explicitly request clearing of external storage. Similar to how we target DE and CE storage areas, callers need to specifically ask to work with EXTERNAL storage. This is because external storage often lives on a separate device from where internal DE and CE data lives. As one specific example, if we're moving an app between two "internal" storage devices, we don't want to clean up the data for that package on external storage, since it's not being moved. This change also expands to all mounted external storage devices, not just the storage backed by the incoming UUID. Bug: 113277754 Test: atest android.appsecurity.cts.StorageHostTest Test: atest android.appsecurity.cts.ExternalStorageHostTest Test: atest --test-mapping frameworks/base/services/core/java/com/android/server/pm/ Change-Id: Ie125303726dd757ee45bd373f53addb35569c2f7 --- .../android/os/storage/StorageManager.java | 2 ++ .../java/com/android/server/pm/Installer.java | 1 + .../server/pm/PackageManagerService.java | 28 ++++++++++--------- .../server/usage/StorageStatsService.java | 1 + 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index ee62af57b9a09..69c1295df4f9f 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -248,6 +248,8 @@ public class StorageManager { public static final int FLAG_STORAGE_DE = IInstalld.FLAG_STORAGE_DE; /** {@hide} */ public static final int FLAG_STORAGE_CE = IInstalld.FLAG_STORAGE_CE; + /** {@hide} */ + public static final int FLAG_STORAGE_EXTERNAL = IInstalld.FLAG_STORAGE_EXTERNAL; /** {@hide} */ public static final int FLAG_FOR_WRITE = 1 << 8; diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index bab612d3c092e..9d115963423d1 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -73,6 +73,7 @@ public class Installer extends SystemService { public static final int FLAG_STORAGE_DE = IInstalld.FLAG_STORAGE_DE; public static final int FLAG_STORAGE_CE = IInstalld.FLAG_STORAGE_CE; + public static final int FLAG_STORAGE_EXTERNAL = IInstalld.FLAG_STORAGE_EXTERNAL; public static final int FLAG_CLEAR_CACHE_ONLY = IInstalld.FLAG_CLEAR_CACHE_ONLY; public static final int FLAG_CLEAR_CODE_CACHE_ONLY = IInstalld.FLAG_CLEAR_CODE_CACHE_ONLY; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 9d702093120e1..23aa8f0f13ca1 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -89,6 +89,7 @@ import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; import static android.os.storage.StorageManager.FLAG_STORAGE_CE; import static android.os.storage.StorageManager.FLAG_STORAGE_DE; +import static android.os.storage.StorageManager.FLAG_STORAGE_EXTERNAL; import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_MANAGED_PROFILE; import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_PARENT; @@ -3249,7 +3250,7 @@ public void onDefaultRuntimePermissionsGranted(int userId) { if (Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, ps.volumeUuid)) { // No apps are running this early, so no need to freeze clearAppDataLIF(ps.pkg, UserHandle.USER_ALL, - StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE + FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); } } @@ -3502,8 +3503,8 @@ private boolean enableCompressedPackage(PackageParser.Package stubPkg) { } return false; } - clearAppDataLIF(pkg, UserHandle.USER_ALL, FLAG_STORAGE_DE - | FLAG_STORAGE_CE | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); + clearAppDataLIF(pkg, UserHandle.USER_ALL, FLAG_STORAGE_DE | FLAG_STORAGE_CE + | FLAG_STORAGE_EXTERNAL | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); mDexManager.notifyPackageUpdated(pkg.packageName, pkg.baseCodePath, pkg.splitCodePaths); } @@ -15975,6 +15976,9 @@ private boolean cleanUp(String volumeUuid) { synchronized (mInstallLock) { // Clean up both app data and code // All package moves are frozen until finished + + // We purposefully exclude FLAG_STORAGE_EXTERNAL here, since + // this task was only focused on moving data on internal storage. for (int userId : userIds) { try { mInstaller.destroyAppData(volumeUuid, move.packageName, userId, @@ -17075,8 +17079,8 @@ private void executePostCommitSteps(CommitRequest commitRequest) { final String packageName = pkg.packageName; prepareAppDataAfterInstallLIF(pkg); if (reconciledPkg.prepareResult.clearCodeCache) { - clearAppDataLIF(pkg, UserHandle.USER_ALL, StorageManager.FLAG_STORAGE_DE - | StorageManager.FLAG_STORAGE_CE | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); + clearAppDataLIF(pkg, UserHandle.USER_ALL, FLAG_STORAGE_DE | FLAG_STORAGE_CE + | FLAG_STORAGE_EXTERNAL | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); } if (reconciledPkg.prepareResult.replace) { mDexManager.notifyPackageUpdated(pkg.packageName, @@ -18848,7 +18852,7 @@ private void removePackageDataLIF(final PackageSetting deletedPs, int[] allUserH resolvedPkg.setVolumeUuid(deletedPs.volumeUuid); } destroyAppDataLIF(resolvedPkg, UserHandle.USER_ALL, - StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE); + FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL); destroyAppProfilesLIF(resolvedPkg); if (outInfo != null) { outInfo.dataRemoved = true; @@ -19600,7 +19604,7 @@ private void clearPackageStateForUserLIF(PackageSetting ps, int userId, } destroyAppDataLIF(pkg, nextUserId, - StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE); + FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL); clearDefaultBrowserIfNeededForUser(ps.name, nextUserId); removeKeystoreDataIfNeeded(nextUserId, ps.appId); final SparseBooleanArray changedUsers = new SparseBooleanArray(); @@ -19736,7 +19740,7 @@ private boolean clearApplicationUserDataLIF(String packageName, int userId) { } clearAppDataLIF(pkg, userId, - StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE); + FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL); final int appId = UserHandle.getAppId(pkg.applicationInfo.uid); removeKeystoreDataIfNeeded(userId, appId); @@ -19967,8 +19971,7 @@ public void deleteApplicationCacheFilesAsUser(final String packageName, final in } if (doClearData) { synchronized (mInstallLock) { - final int flags = StorageManager.FLAG_STORAGE_DE - | StorageManager.FLAG_STORAGE_CE; + final int flags = FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL; // We're only clearing cache files, so we don't care if the // app is unfrozen and still able to run clearAppDataLIF(pkg, userId, flags | Installer.FLAG_CLEAR_CACHE_ONLY); @@ -22516,9 +22519,8 @@ private void loadPrivatePackagesInner(VolumeInfo vol) { } if (!Build.FINGERPRINT.equals(ver.fingerprint)) { - clearAppDataLIF(ps.pkg, UserHandle.USER_ALL, - StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE - | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); + clearAppDataLIF(ps.pkg, UserHandle.USER_ALL, FLAG_STORAGE_DE | FLAG_STORAGE_CE + | FLAG_STORAGE_EXTERNAL | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); } } } diff --git a/services/usage/java/com/android/server/usage/StorageStatsService.java b/services/usage/java/com/android/server/usage/StorageStatsService.java index faf6ee23e2081..0f3050f9e3d37 100644 --- a/services/usage/java/com/android/server/usage/StorageStatsService.java +++ b/services/usage/java/com/android/server/usage/StorageStatsService.java @@ -120,6 +120,7 @@ public StorageStatsService(Context context) { @Override public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState) { switch (vol.type) { + case VolumeInfo.TYPE_PUBLIC: case VolumeInfo.TYPE_PRIVATE: case VolumeInfo.TYPE_EMULATED: if (newState == VolumeInfo.STATE_MOUNTED) {