diff options
| -rwxr-xr-x | core/tests/coretests/src/android/content/pm/PackageManagerTests.java | 43 | ||||
| -rw-r--r-- | services/java/com/android/server/PackageManagerService.java | 9 |
2 files changed, 49 insertions, 3 deletions
diff --git a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java index 82834b6..5571341 100755 --- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java +++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java @@ -2346,6 +2346,49 @@ public class PackageManagerTests extends AndroidTestCase { } } + + /* This test installs an application on sdcard and unmounts media. + * The app is then re-installed on internal storage. The sdcard is mounted + * and verified that the re-installation on internal storage takes precedence. + */ + @MediumTest + public void testInstallSdcardStaleContainerReinstall() { + boolean origMediaState = getMediaState(); + try { + // Mount media first + mountMedia(); + String outFileName = "install.apk"; + int rawResId = R.raw.install; + PackageManager pm = mContext.getPackageManager(); + File filesDir = mContext.getFilesDir(); + File outFile = new File(filesDir, outFileName); + Uri packageURI = getInstallablePackage(rawResId, outFile); + PackageParser.Package pkg = parsePackage(packageURI); + assertNotNull(pkg); + // Install an app on sdcard. + installFromRawResource(outFileName, rawResId, + PackageManager.INSTALL_EXTERNAL, false, + false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); + // Unmount sdcard + unmountMedia(); + // Reinstall the app and make sure it gets installed on internal storage. + installFromRawResource(outFileName, rawResId, + PackageManager.INSTALL_REPLACE_EXISTING, false, + false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); + mountMedia(); + // Verify that the app installed is on internal storage. + assertInstall(pkg, 0, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); + } catch (Exception e) { + failStr(e.getMessage()); + } finally { + if (origMediaState) { + mountMedia(); + } else { + unmountMedia(); + } + + } + } /* * The following series of tests are related to upgrading apps with * different certificates. diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index b9204c7..ee725cc 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -5315,13 +5315,13 @@ class PackageManagerService extends IPackageManager.Stub { } SdInstallArgs(String cid) { - super(null, null, PackageManager.INSTALL_EXTERNAL, null); - this.cid = cid; + this((Uri)null, cid); } SdInstallArgs(Uri packageURI, String cid) { super(packageURI, null, PackageManager.INSTALL_EXTERNAL, null); this.cid = cid; + cachePath = PackageHelper.getSdDir(cid); } void createCopyFile() { @@ -9565,7 +9565,10 @@ class PackageManagerService extends IPackageManager.Stub { } if (DEBUG_SD_INSTALL) Log.i(TAG, "Looking for pkg : " + pkgName); PackageSetting ps = mSettings.mPackages.get(pkgName); - if (ps != null && ps.codePathString != null) { + // The package status is changed only if the code path + // matches between settings and the container id. + if (ps != null && ps.codePathString != null && + ps.codePathString.equals(args.getCodePath())) { if (DEBUG_SD_INSTALL) Log.i(TAG, "Container : " + cid + " corresponds to pkg : " + pkgName + " at code path: " + ps.codePathString); |
