diff options
author | Jeff Sharkey <jsharkey@android.com> | 2015-04-18 20:23:13 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2015-04-18 21:11:58 -0700 |
commit | 529f91fc8e7e884ef19bef8eb3e4e3a1d69336f4 (patch) | |
tree | 463b7b5d9175e98402939a2bbfebd4f30899feac | |
parent | 355df8f16ae4c428997d88ba86f1ce07e5eca35e (diff) | |
download | frameworks_base-529f91fc8e7e884ef19bef8eb3e4e3a1d69336f4.zip frameworks_base-529f91fc8e7e884ef19bef8eb3e4e3a1d69336f4.tar.gz frameworks_base-529f91fc8e7e884ef19bef8eb3e4e3a1d69336f4.tar.bz2 |
Always send volume UUID with installd commands.
Since packages can be moved to other volumes, all relevant commands
to installd now require an explicit volume UUID parameter.
Bug: 20275577
Change-Id: Ie84f5bc43c7aada5800b8d71692c7928b42b965e
11 files changed, 97 insertions, 65 deletions
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index b43c462..d5cc8cc 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -1691,9 +1691,13 @@ public final class Pm { showUsage(); return 1; } + String volumeUuid = nextArg(); + if ("internal".equals(volumeUuid)) { + volumeUuid = null; + } ClearDataObserver obs = new ClearDataObserver(); try { - mPm.freeStorageAndNotify(sizeVal, obs); + mPm.freeStorageAndNotify(volumeUuid, sizeVal, obs); synchronized (obs) { while (!obs.finished) { try { @@ -1884,7 +1888,7 @@ public final class Pm { System.err.println(" pm set-install-location [0/auto] [1/internal] [2/external]"); System.err.println(" pm get-install-location"); System.err.println(" pm set-permission-enforced PERMISSION [true|false]"); - System.err.println(" pm trim-caches DESIRED_FREE_SPACE"); + System.err.println(" pm trim-caches DESIRED_FREE_SPACE [internal|UUID]"); System.err.println(" pm create-user [--profileOf USER_ID] [--managed] USER_NAME"); System.err.println(" pm remove-user USER_ID"); System.err.println(" pm get-max-users"); diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index b9ddff0..dfe7e18 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -1520,19 +1520,21 @@ final class ApplicationPackageManager extends PackageManager { // Should never happen! } } + @Override - public void freeStorageAndNotify(long idealStorageSize, IPackageDataObserver observer) { + public void freeStorageAndNotify(String volumeUuid, long idealStorageSize, + IPackageDataObserver observer) { try { - mPM.freeStorageAndNotify(idealStorageSize, observer); + mPM.freeStorageAndNotify(volumeUuid, idealStorageSize, observer); } catch (RemoteException e) { // Should never happen! } } @Override - public void freeStorage(long freeStorageSize, IntentSender pi) { + public void freeStorage(String volumeUuid, long freeStorageSize, IntentSender pi) { try { - mPM.freeStorage(freeStorageSize, pi); + mPM.freeStorage(volumeUuid, freeStorageSize, pi); } catch (RemoteException e) { // Should never happen! } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index c2580c0..447c668 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -328,7 +328,7 @@ interface IPackageManager { * @param observer call back used to notify when * the operation is completed */ - void freeStorageAndNotify(in long freeStorageSize, + void freeStorageAndNotify(in String volumeUuid, in long freeStorageSize, IPackageDataObserver observer); /** @@ -352,7 +352,7 @@ interface IPackageManager { * notify when the operation is completed.May be null * to indicate that no call back is desired. */ - void freeStorage(in long freeStorageSize, + void freeStorage(in String volumeUuid, in long freeStorageSize, in IntentSender pi); /** diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index a128872..a0cec50 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -3798,7 +3798,13 @@ public abstract class PackageManager { * @hide */ // @SystemApi - public abstract void freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer); + public void freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer) { + freeStorageAndNotify(null, freeStorageSize, observer); + } + + /** {@hide} */ + public abstract void freeStorageAndNotify(String volumeUuid, long freeStorageSize, + IPackageDataObserver observer); /** * Free storage by deleting LRU sorted list of cache files across @@ -3823,7 +3829,12 @@ public abstract class PackageManager { * * @hide */ - public abstract void freeStorage(long freeStorageSize, IntentSender pi); + public void freeStorage(long freeStorageSize, IntentSender pi) { + freeStorage(null, freeStorageSize, pi); + } + + /** {@hide} */ + public abstract void freeStorage(String volumeUuid, long freeStorageSize, IntentSender pi); /** * Retrieve the size information for a package. diff --git a/core/tests/coretests/src/android/content/pm/AppCacheTest.java b/core/tests/coretests/src/android/content/pm/AppCacheTest.java index aae55e8..54316d5 100644 --- a/core/tests/coretests/src/android/content/pm/AppCacheTest.java +++ b/core/tests/coretests/src/android/content/pm/AppCacheTest.java @@ -490,7 +490,7 @@ public class AppCacheTest extends AndroidTestCase { PackageDataObserver observer = new PackageDataObserver(); //wait on observer synchronized(observer) { - getPm().freeStorageAndNotify(idealStorageSize, observer); + getPm().freeStorageAndNotify(null, idealStorageSize, observer); long waitTime = 0; while(!observer.isDone() || (waitTime > MAX_WAIT_TIME)) { observer.wait(WAIT_TIME_INCR); @@ -515,7 +515,7 @@ public class AppCacheTest extends AndroidTestCase { try { // Spin lock waiting for call back synchronized(r) { - getPm().freeStorage(idealStorageSize, pi.getIntentSender()); + getPm().freeStorage(null, idealStorageSize, pi.getIntentSender()); long waitTime = 0; while(!r.isDone() && (waitTime < MAX_WAIT_TIME)) { r.wait(WAIT_TIME_INCR); diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index a32363d..0f3b4e6 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -48,6 +48,9 @@ public final class Installer extends SystemService { if (TextUtils.isEmpty(arg)) { return "!"; } else { + if (arg.indexOf('\0') != -1 || arg.indexOf(' ') != -1) { + throw new IllegalArgumentException(arg); + } return arg; } } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 46db2d8..89ca00e 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -371,7 +371,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { final long deltaBytes = lengthBytes - stat.st_size; // Only need to free up space when writing to internal stage if (stageDir != null && deltaBytes > 0) { - mPm.freeStorage(deltaBytes); + mPm.freeStorage(params.volumeUuid, deltaBytes); } Libcore.os.posix_fallocate(targetFd, 0, lengthBytes); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 331683b..24cc909 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1533,6 +1533,8 @@ public class PackageManagerService extends IPackageManager.Stub { public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState) { if (vol.type == VolumeInfo.TYPE_PRIVATE) { if (vol.state == VolumeInfo.STATE_MOUNTED) { + // TODO: ensure that private directories exist for all active users + // TODO: remove user data whose serial number doesn't match loadPrivatePackages(vol); } else if (vol.state == VolumeInfo.STATE_EJECTING) { unloadPrivatePackages(vol); @@ -1967,7 +1969,7 @@ public class PackageManagerService extends IPackageManager.Stub { psit.remove(); logCriticalInfo(Log.WARN, "System package " + ps.name + " no longer exists; wiping its data"); - removeDataDirsLI(ps.name); + removeDataDirsLI(null, ps.name); } else { final PackageSetting disabledPs = mSettings.getDisabledSystemPkgLPr(ps.name); if (disabledPs.codePath == null || !disabledPs.codePath.exists()) { @@ -2012,7 +2014,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (deletedPkg == null) { msg = "Updated system package " + deletedAppName + " no longer exists; wiping its data"; - removeDataDirsLI(deletedAppName); + removeDataDirsLI(null, deletedAppName); } else { msg = "Updated system app + " + deletedAppName + " no longer present; removing system privileges for " @@ -2128,8 +2130,9 @@ public class PackageManagerService extends IPackageManager.Stub { mIsUpgrade = !Build.FINGERPRINT.equals(mSettings.mFingerprint); if (mIsUpgrade && !onlyCore) { Slog.i(TAG, "Build fingerprint changed; clearing code caches"); - for (String pkgName : mSettings.mPackages.keySet()) { - deleteCodeCacheDirsLI(pkgName); + for (int i = 0; i < mSettings.mPackages.size(); i++) { + final PackageSetting ps = mSettings.mPackages.valueAt(i); + deleteCodeCacheDirsLI(ps.volumeUuid, ps.name); } mSettings.mFingerprint = Build.FINGERPRINT; } @@ -2309,7 +2312,7 @@ public class PackageManagerService extends IPackageManager.Stub { void cleanupInstallFailedPackage(PackageSetting ps) { logCriticalInfo(Log.WARN, "Cleaning up incompletely installed app: " + ps.name); - removeDataDirsLI(ps.name); + removeDataDirsLI(ps.volumeUuid, ps.name); if (ps.codePath != null) { if (ps.codePath.isDirectory()) { mInstaller.rmPackageDir(ps.codePath.getAbsolutePath()); @@ -2604,9 +2607,9 @@ public class PackageManagerService extends IPackageManager.Stub { return null; } - @Override - public void freeStorageAndNotify(final long freeStorageSize, final IPackageDataObserver observer) { + public void freeStorageAndNotify(final String volumeUuid, final long freeStorageSize, + final IPackageDataObserver observer) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.CLEAR_APP_CACHE, null); // Queue up an async operation since clearing cache may take a little while. @@ -2615,7 +2618,7 @@ public class PackageManagerService extends IPackageManager.Stub { mHandler.removeCallbacks(this); int retCode = -1; synchronized (mInstallLock) { - retCode = mInstaller.freeCache(freeStorageSize); + retCode = mInstaller.freeCache(volumeUuid, freeStorageSize); if (retCode < 0) { Slog.w(TAG, "Couldn't clear application caches"); } @@ -2632,7 +2635,8 @@ public class PackageManagerService extends IPackageManager.Stub { } @Override - public void freeStorage(final long freeStorageSize, final IntentSender pi) { + public void freeStorage(final String volumeUuid, final long freeStorageSize, + final IntentSender pi) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.CLEAR_APP_CACHE, null); // Queue up an async operation since clearing cache may take a little while. @@ -2641,7 +2645,7 @@ public class PackageManagerService extends IPackageManager.Stub { mHandler.removeCallbacks(this); int retCode = -1; synchronized (mInstallLock) { - retCode = mInstaller.freeCache(freeStorageSize); + retCode = mInstaller.freeCache(volumeUuid, freeStorageSize); if (retCode < 0) { Slog.w(TAG, "Couldn't clear application caches"); } @@ -2660,9 +2664,9 @@ public class PackageManagerService extends IPackageManager.Stub { }); } - void freeStorage(long freeStorageSize) throws IOException { + void freeStorage(String volumeUuid, long freeStorageSize) throws IOException { synchronized (mInstallLock) { - if (mInstaller.freeCache(freeStorageSize) < 0) { + if (mInstaller.freeCache(volumeUuid, freeStorageSize) < 0) { throw new IOException("Failed to free enough space"); } } @@ -5481,15 +5485,15 @@ public class PackageManagerService extends IPackageManager.Stub { return true; } - private int createDataDirsLI(String packageName, int uid, String seinfo) { + private int createDataDirsLI(String volumeUuid, String packageName, int uid, String seinfo) { int[] users = sUserManager.getUserIds(); - int res = mInstaller.install(packageName, uid, uid, seinfo); + int res = mInstaller.install(volumeUuid, packageName, uid, uid, seinfo); if (res < 0) { return res; } for (int user : users) { if (user != 0) { - res = mInstaller.createUserData(packageName, + res = mInstaller.createUserData(volumeUuid, packageName, UserHandle.getUid(user, uid), user, seinfo); if (res < 0) { return res; @@ -5499,11 +5503,11 @@ public class PackageManagerService extends IPackageManager.Stub { return res; } - private int removeDataDirsLI(String packageName) { + private int removeDataDirsLI(String volumeUuid, String packageName) { int[] users = sUserManager.getUserIds(); int res = 0; for (int user : users) { - int resInner = mInstaller.remove(packageName, user); + int resInner = mInstaller.remove(volumeUuid, packageName, user); if (resInner < 0) { res = resInner; } @@ -5512,11 +5516,11 @@ public class PackageManagerService extends IPackageManager.Stub { return res; } - private int deleteCodeCacheDirsLI(String packageName) { + private int deleteCodeCacheDirsLI(String volumeUuid, String packageName) { int[] users = sUserManager.getUserIds(); int res = 0; for (int user : users) { - int resInner = mInstaller.deleteCodeCacheFiles(packageName, user); + int resInner = mInstaller.deleteCodeCacheFiles(volumeUuid, packageName, user); if (resInner < 0) { res = resInner; } @@ -5651,7 +5655,7 @@ public class PackageManagerService extends IPackageManager.Stub { return res; } finally { if (!success && (scanFlags & SCAN_DELETE_DATA_ON_FAILURES) != 0) { - removeDataDirsLI(pkg.packageName); + removeDataDirsLI(pkg.volumeUuid, pkg.packageName); } } } @@ -6021,8 +6025,8 @@ public class PackageManagerService extends IPackageManager.Stub { // This is probably because the system was stopped while // installd was in the middle of messing with its libs // directory. Ask installd to fix that. - int ret = mInstaller.fixUid(pkgName, pkg.applicationInfo.uid, - pkg.applicationInfo.uid); + int ret = mInstaller.fixUid(pkg.volumeUuid, pkgName, + pkg.applicationInfo.uid, pkg.applicationInfo.uid); if (ret >= 0) { recovered = true; String msg = "Package " + pkg.packageName @@ -6035,7 +6039,7 @@ public class PackageManagerService extends IPackageManager.Stub { || (scanFlags&SCAN_BOOTING) != 0)) { // If this is a system app, we can at least delete its // current data so the application will still work. - int ret = removeDataDirsLI(pkgName); + int ret = removeDataDirsLI(pkg.volumeUuid, pkgName); if (ret >= 0) { // TODO: Kill the processes first // Old data gone! @@ -6049,8 +6053,8 @@ public class PackageManagerService extends IPackageManager.Stub { recovered = true; // And now re-install the app. - ret = createDataDirsLI(pkgName, pkg.applicationInfo.uid, - pkg.applicationInfo.seinfo); + ret = createDataDirsLI(pkg.volumeUuid, pkgName, pkg.applicationInfo.uid, + pkg.applicationInfo.seinfo); if (ret == -1) { // Ack should not happen! msg = prefix + pkg.packageName @@ -6093,8 +6097,8 @@ public class PackageManagerService extends IPackageManager.Stub { pkg.applicationInfo.dataDir = dataPath.getPath(); if (mShouldRestoreconData) { Slog.i(TAG, "SELinux relabeling of " + pkg.packageName + " issued."); - mInstaller.restoreconData(pkg.packageName, pkg.applicationInfo.seinfo, - pkg.applicationInfo.uid); + mInstaller.restoreconData(pkg.volumeUuid, pkg.packageName, + pkg.applicationInfo.seinfo, pkg.applicationInfo.uid); } } else { if (DEBUG_PACKAGE_SCANNING) { @@ -6102,8 +6106,8 @@ public class PackageManagerService extends IPackageManager.Stub { Log.v(TAG, "Want this data dir: " + dataPath); } //invoke installer to do the actual installation - int ret = createDataDirsLI(pkgName, pkg.applicationInfo.uid, - pkg.applicationInfo.seinfo); + int ret = createDataDirsLI(pkg.volumeUuid, pkgName, pkg.applicationInfo.uid, + pkg.applicationInfo.seinfo); if (ret < 0) { // Error from installer throw new PackageManagerException(INSTALL_FAILED_INSUFFICIENT_STORAGE, @@ -9590,7 +9594,7 @@ public class PackageManagerService extends IPackageManager.Stub { final long sizeBytes = mContainerService.calculateInstalledSize( origin.resolvedPath, isForwardLocked(), packageAbiOverride); - if (mInstaller.freeCache(sizeBytes + lowThreshold) >= 0) { + if (mInstaller.freeCache(null, sizeBytes + lowThreshold) >= 0) { pkgLite = mContainerService.getMinimalPackageInfo(origin.resolvedPath, installFlags, packageAbiOverride); } @@ -10818,7 +10822,7 @@ public class PackageManagerService extends IPackageManager.Stub { sendResourcesChangedBroadcast(false, true, pkgList, uidArray, null); } - deleteCodeCacheDirsLI(pkgName); + deleteCodeCacheDirsLI(pkg.volumeUuid, pkgName); try { final PackageParser.Package newPackage = scanPackageLI(pkg, parseFlags, scanFlags | SCAN_UPDATE_TIME, System.currentTimeMillis(), user); @@ -10930,7 +10934,7 @@ public class PackageManagerService extends IPackageManager.Stub { } // Successfully disabled the old package. Now proceed with re-installation - deleteCodeCacheDirsLI(packageName); + deleteCodeCacheDirsLI(pkg.volumeUuid, packageName); res.returnCode = PackageManager.INSTALL_SUCCEEDED; pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; @@ -11661,7 +11665,7 @@ public class PackageManagerService extends IPackageManager.Stub { } } if ((flags&PackageManager.DELETE_KEEP_DATA) == 0) { - removeDataDirsLI(packageName); + removeDataDirsLI(ps.volumeUuid, packageName); schedulePackageCleaning(packageName, UserHandle.USER_ALL, true); } // writer @@ -11966,7 +11970,7 @@ public class PackageManagerService extends IPackageManager.Stub { outInfo.removedAppId = appId; outInfo.removedUsers = new int[] {removeUser}; } - mInstaller.clearUserData(packageName, removeUser); + mInstaller.clearUserData(ps.volumeUuid, packageName, removeUser); removeKeystoreDataIfNeeded(removeUser, appId); schedulePackageCleaning(packageName, removeUser, false); synchronized (mPackages) { @@ -12135,7 +12139,7 @@ public class PackageManagerService extends IPackageManager.Stub { // Always delete data directories for package, even if we found no other // record of app. This helps users recover from UID mismatches without // resorting to a full data wipe. - int retCode = mInstaller.clearUserData(packageName, userId); + int retCode = mInstaller.clearUserData(pkg.volumeUuid, packageName, userId); if (retCode < 0) { Slog.w(TAG, "Couldn't remove cache files for package: " + packageName); return false; @@ -12156,7 +12160,8 @@ public class PackageManagerService extends IPackageManager.Stub { if (pkg != null && pkg.applicationInfo.primaryCpuAbi != null && !VMRuntime.is64BitAbi(pkg.applicationInfo.primaryCpuAbi)) { final String nativeLibPath = pkg.applicationInfo.nativeLibraryDir; - if (mInstaller.linkNativeLibraryDirectory(pkg.packageName, nativeLibPath, userId) < 0) { + if (mInstaller.linkNativeLibraryDirectory(pkg.volumeUuid, pkg.packageName, + nativeLibPath, userId) < 0) { Slog.w(TAG, "Failed linking native library dir"); return false; } @@ -12232,7 +12237,7 @@ public class PackageManagerService extends IPackageManager.Stub { Slog.w(TAG, "Package " + packageName + " has no applicationInfo."); return false; } - int retCode = mInstaller.deleteCacheFiles(packageName, userId); + int retCode = mInstaller.deleteCacheFiles(p.volumeUuid, packageName, userId); if (retCode < 0) { Slog.w(TAG, "Couldn't remove cache files for package: " + packageName + " u" + userId); @@ -12310,8 +12315,8 @@ public class PackageManagerService extends IPackageManager.Stub { // TODO(multiArch): Extend getSizeInfo to look at *all* instruction sets, not // just the primary. String[] dexCodeInstructionSets = getDexCodeInstructionSets(getAppDexInstructionSets(ps)); - int res = mInstaller.getSizeInfo(packageName, userHandle, p.baseCodePath, libDirRoot, - publicSrcDir, asecPath, dexCodeInstructionSets, pStats); + int res = mInstaller.getSizeInfo(p.volumeUuid, packageName, userHandle, p.baseCodePath, + libDirRoot, publicSrcDir, asecPath, dexCodeInstructionSets, pStats); if (res < 0) { return false; } @@ -14305,7 +14310,15 @@ public class PackageManagerService extends IPackageManager.Stub { // Technically, we shouldn't be doing this with the package lock // held. However, this is very rare, and there is already so much // other disk I/O going on, that we'll let it slide for now. - mInstaller.removeUserDataDirs(userHandle); + final StorageManager storage = StorageManager.from(mContext); + final List<VolumeInfo> vols = storage.getVolumes(); + for (VolumeInfo vol : vols) { + if (vol.getType() == VolumeInfo.TYPE_PRIVATE && vol.isMountedWritable()) { + final String volumeUuid = vol.getFsUuid(); + Slog.d(TAG, "Removing user data on volume " + volumeUuid); + mInstaller.removeUserDataDirs(volumeUuid, userHandle); + } + } } mUserNeedsBadging.delete(userHandle); removeUnusedPackagesLILPw(userManager, userHandle); diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index d2964bb..f3fdb0d 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -207,6 +207,8 @@ final class Settings { private static int mFirstAvailableUid = 0; + // TODO: store SDK versions and fingerprint for each volume UUID + // These are the last platform API version we were using for // the apps installed on internal and external storage. It is // used to grant newer permissions one time during a system upgrade. @@ -3437,7 +3439,7 @@ final class Settings { // Only system apps are initially installed. ps.setInstalled((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0, userHandle); // Need to create a data directory for all apps under this user. - installer.createUserData(ps.name, + installer.createUserData(ps.volumeUuid, ps.name, UserHandle.getUid(userHandle, ps.appId), userHandle, ps.pkg.applicationInfo.seinfo); } diff --git a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java index 2673557..cbbcb0e 100644 --- a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java +++ b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java @@ -74,6 +74,8 @@ import dalvik.system.VMRuntime; public class DeviceStorageMonitorService extends SystemService { static final String TAG = "DeviceStorageMonitorService"; + // TODO: extend to watch and manage caches on all private volumes + static final boolean DEBUG = false; static final boolean localLOGV = false; @@ -220,7 +222,7 @@ public class DeviceStorageMonitorService extends SystemService { try { if (localLOGV) Slog.i(TAG, "Clearing cache"); IPackageManager.Stub.asInterface(ServiceManager.getService("package")). - freeStorageAndNotify(mMemCacheTrimToThreshold, mClearCacheObserver); + freeStorageAndNotify(null, mMemCacheTrimToThreshold, mClearCacheObserver); } catch (RemoteException e) { Slog.w(TAG, "Failed to get handle for PackageManger Exception: "+e); mClearingCache = false; diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 5a8c7ff..276b713 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -535,21 +535,16 @@ public class MockPackageManager extends PackageManager { throw new UnsupportedOperationException(); } - /** - * @hide - to match hiding in superclass - */ + /** {@hide} */ @Override - public void freeStorageAndNotify( - long idealStorageSize, IPackageDataObserver observer) { + public void freeStorageAndNotify(String volumeUuid, long idealStorageSize, + IPackageDataObserver observer) { throw new UnsupportedOperationException(); } - /** - * @hide - to match hiding in superclass - */ + /** {@hide} */ @Override - public void freeStorage( - long idealStorageSize, IntentSender pi) { + public void freeStorage(String volumeUuid, long idealStorageSize, IntentSender pi) { throw new UnsupportedOperationException(); } |