Fix persisting flags for apps with data only
Force gc's before deleting containers.:
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index 664f028..9e11546 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -540,6 +540,7 @@
                     if (DEBUG_INSTALL) Log.v(TAG, "Handling post-install for " + msg.arg1);
                     PostInstallData data = mRunningInstalls.get(msg.arg1);
                     mRunningInstalls.delete(msg.arg1);
+                    boolean deleteOld = false;
 
                     if (data != null) {
                         InstallArgs args = data.args;
@@ -563,13 +564,17 @@
                             }
                             if (res.removedInfo.args != null) {
                                 // Remove the replaced package's older resources safely now
-                                synchronized (mInstallLock) {
-                                    res.removedInfo.args.doPostDeleteLI(true);
-                                }
+                                deleteOld = true;
                             }
                         }
+                        // Force a gc to clear up things
                         Runtime.getRuntime().gc();
-
+                        // We delete after a gc for applications  on sdcard.
+                        if (deleteOld) {
+                            synchronized (mInstallLock) {
+                                res.removedInfo.args.doPostDeleteLI(true);
+                            }
+                        }
                         if (args.observer != null) {
                             try {
                                 args.observer.packageInstalled(res.name, res.returnCode);
@@ -1350,6 +1355,10 @@
             if(ps.pkg == null) {
                 ps.pkg = new PackageParser.Package(packageName);
                 ps.pkg.applicationInfo.packageName = packageName;
+                ps.pkg.applicationInfo.flags = ps.pkgFlags;
+                ps.pkg.applicationInfo.publicSourceDir = ps.resourcePathString;
+                ps.pkg.applicationInfo.sourceDir = ps.codePathString;
+                ps.pkg.applicationInfo.dataDir = getDataPathForPackage(ps.pkg).getPath();
             }
             return generatePackageInfo(ps.pkg, flags);
         }
@@ -2567,6 +2576,17 @@
         }
         return true;
     }
+
+    private File getDataPathForPackage(PackageParser.Package pkg) {
+        boolean useEncryptedFSDir = useEncryptedFilesystemForPackage(pkg);
+        File dataPath;
+        if (useEncryptedFSDir) {
+            dataPath = new File(mSecureAppDataDir, pkg.packageName);
+        } else {
+            dataPath = new File(mAppDataDir, pkg.packageName);
+        }
+        return dataPath;
+    }
     
     private PackageParser.Package scanPackageLI(PackageParser.Package pkg,
             int parseFlags, int scanMode) {
@@ -2932,11 +2952,7 @@
         } else {
             // This is a normal package, need to make its data directory.
             boolean useEncryptedFSDir = useEncryptedFilesystemForPackage(pkg);
-            if (useEncryptedFSDir) {
-                dataPath = new File(mSecureAppDataDir, pkgName);
-            } else {
-                dataPath = new File(mAppDataDir, pkgName);
-            }
+            dataPath = getDataPathForPackage(pkg);
             
             boolean uidError = false;
             
@@ -5159,14 +5175,9 @@
             int scanMode,
             String installerPackageName, PackageInstalledInfo res) {
         // Remember this for later, in case we need to rollback this install
-        boolean dataDirExists;
         String pkgName = pkg.packageName;
 
-        if (useEncryptedFilesystemForPackage(pkg)) {
-            dataDirExists = (new File(mSecureAppDataDir, pkgName)).exists();
-        } else {
-            dataDirExists = (new File(mAppDataDir, pkgName)).exists();
-        }
+        boolean dataDirExists = getDataPathForPackage(pkg).exists();
         res.name = pkgName;
         synchronized(mPackages) {
             if (mPackages.containsKey(pkgName) || mAppDirs.containsKey(pkg.mPath)) {
@@ -5741,6 +5752,8 @@
                 sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED, packageName, extras);
             }
         }
+        // Force a gc here.
+        Runtime.getRuntime().gc();
         // Delete the resources here after sending the broadcast to let
         // other processes clean up before deleting resources.
         if (info.args != null) {
@@ -7136,7 +7149,8 @@
         void setFlags(int pkgFlags) {
             this.pkgFlags = (pkgFlags & ApplicationInfo.FLAG_SYSTEM) |
             (pkgFlags & ApplicationInfo.FLAG_FORWARD_LOCK) |
-            (pkgFlags & ApplicationInfo.FLAG_ON_SDCARD);
+            (pkgFlags & ApplicationInfo.FLAG_ON_SDCARD) |
+            (pkgFlags & ApplicationInfo.FLAG_NEVER_ENCRYPT);
         }
     }