From 88670d816ba48076bf89afe57b78b09d1e4288bb Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Wed, 9 May 2012 15:47:35 -0700 Subject: [PATCH] Use the right flag types when creating InstallArgs Need to use PackageManager.INSTALL_{EXTERNAL,FORWARD_LOCKED} for createInstallArgs instead of ApplicationInfo.FLAG_etc for the install args to be created correctly. If certain flags conflict, there will be a failure to delete the package. Change-Id: Ibd8705943371596b2f2d6c24bd071b737ca74ef4 --- .../server/pm/PackageManagerService.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 7c14d496a210f..d41cd5a353f47 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -3118,8 +3118,9 @@ public class PackageManagerService extends IPackageManager.Stub { + "reverting from " + ps.codePathString + ": new version " + pkg.mVersionCode + " better than installed " + ps.versionCode); - InstallArgs args = createInstallArgs(ps.pkgFlags, ps.codePathString, - ps.resourcePathString, ps.nativeLibraryPathString); + + InstallArgs args = createInstallArgs(packageFlagsToInstallFlags(ps), + ps.codePathString, ps.resourcePathString, ps.nativeLibraryPathString); synchronized (mInstaller) { args.cleanUpResourcesLI(); } @@ -3174,8 +3175,8 @@ public class PackageManagerService extends IPackageManager.Stub { Slog.w(TAG, "Package " + ps.name + " at " + scanFile + "reverting from " + ps.codePathString + ": new version " + pkg.mVersionCode + " better than installed " + ps.versionCode); - InstallArgs args = createInstallArgs(ps.pkgFlags, ps.codePathString, - ps.resourcePathString, ps.nativeLibraryPathString); + InstallArgs args = createInstallArgs(packageFlagsToInstallFlags(ps), + ps.codePathString, ps.resourcePathString, ps.nativeLibraryPathString); synchronized (mInstaller) { args.cleanUpResourcesLI(); } @@ -7252,6 +7253,11 @@ public class PackageManagerService extends IPackageManager.Stub { return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0; } + + private boolean isForwardLocked(PackageSetting ps) { + return (ps.pkgFlags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0; + } + private static boolean isExternal(PackageParser.Package pkg) { return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0; } @@ -7276,6 +7282,17 @@ public class PackageManagerService extends IPackageManager.Stub { return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; } + private int packageFlagsToInstallFlags(PackageSetting ps) { + int installFlags = 0; + if (isExternal(ps)) { + installFlags |= PackageManager.INSTALL_EXTERNAL; + } + if (isForwardLocked(ps)) { + installFlags |= PackageManager.INSTALL_FORWARD_LOCK; + } + return installFlags; + } + private void deleteTempPackageFiles() { FilenameFilter filter = new FilenameFilter() { public boolean accept(File dir, String name) {