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
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -89,6 +89,7 @@ import static android.content.pm.PackageParser.isApkFile;
|
||||
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 class PackageManagerService extends IPackageManager.Stub
|
||||
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 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
}
|
||||
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 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
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 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
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 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
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 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
}
|
||||
|
||||
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 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
}
|
||||
|
||||
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 class PackageManagerService extends IPackageManager.Stub
|
||||
}
|
||||
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 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,6 +120,7 @@ public class StorageStatsService extends IStorageStatsManager.Stub {
|
||||
@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) {
|
||||
|
||||
Reference in New Issue
Block a user