Get correct native library path on reinstall

If an application moved between internal and external storage during a
reinstall, we were getting the wrong path. This change fixes going from
internal to external and external to internal which need different
fixes.

Bug: 3019708
Change-Id: If5859aeab7505cbbb35ae5724de1224a8733f2e8
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index dbf92ba..58ea4db 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -3241,8 +3241,6 @@
                 }
             }
 
-            pkg.applicationInfo.nativeLibraryDir = pkgSetting.nativeLibraryPathString;
-
             /*
              * Set the data dir to the default "/data/data/<package name>/lib"
              * if we got here without anyone telling us different (e.g., apps
@@ -3252,10 +3250,14 @@
              * This happens during an upgrade from a package settings file that
              * doesn't have a native library path attribute at all.
              */
-            if (pkgSetting.nativeLibraryPathString == null && pkg.applicationInfo.dataDir != null) {
-                final String nativeLibraryPath = new File(dataPath, LIB_DIR_NAME).getPath();
-                pkg.applicationInfo.nativeLibraryDir = nativeLibraryPath;
-                pkgSetting.nativeLibraryPathString = nativeLibraryPath;
+            if (pkg.applicationInfo.nativeLibraryDir == null && pkg.applicationInfo.dataDir != null) {
+                if (pkgSetting.nativeLibraryPathString == null) {
+                    final String nativeLibraryPath = new File(dataPath, LIB_DIR_NAME).getPath();
+                    pkg.applicationInfo.nativeLibraryDir = nativeLibraryPath;
+                    pkgSetting.nativeLibraryPathString = nativeLibraryPath;
+                } else {
+                    pkg.applicationInfo.nativeLibraryDir = pkgSetting.nativeLibraryPathString;
+                }
             }
 
             pkgSetting.uidError = uidError;
@@ -8051,7 +8053,7 @@
             if (p != null) {
                 if (!p.codePath.equals(codePath)) {
                     // Check to see if its a disabled system app
-                    if((p != null) && ((p.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0)) {
+                    if ((p.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                         // This is an updated system app with versions in both system
                         // and data partition. Just let the most recent version
                         // take precedence.
@@ -8062,6 +8064,13 @@
                         // let's log a message about it.
                         Slog.i(TAG, "Package " + name + " codePath changed from " + p.codePath
                                 + " to " + codePath + "; Retaining data and using new");
+                        /*
+                         * Since we've changed paths, we need to prefer the new
+                         * native library path over the one stored in the
+                         * package settings since we might have moved from
+                         * internal to external storage or vice versa.
+                         */
+                        p.nativeLibraryPathString = nativeLibraryPathString;
                     }
                 }
                 if (p.sharedUser != sharedUser) {