Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c38a807b authored by Christopher Tate's avatar Christopher Tate Committed by Narayan Kamath
Browse files

Fix native-lib dir assignment & updating

The per-package /system/lib/* feature introduced bugs in the
native library path handling during app upgrade installs.  The
crux of the fix is that when recalulating the desired native
library directory, the basis for the calculation needs to be
the scanned APK's location rather than the extant package
settings entry -- because that entry refers to the pre-upgrade
state of the application, not the new state.

Bug 14233983

(cherry picked from commit 353e39a9)

Change-Id: I26f17a596ca2cd7f963955c0642548c15138ae26
parent fde59428
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -4669,7 +4669,6 @@ public class PackageManagerService extends IPackageManager.Stub {
                    pkg.applicationInfo.nativeLibraryDir = pkgSetting.nativeLibraryPathString;
                }
            }

            pkgSetting.uidError = uidError;
        }

@@ -5241,7 +5240,8 @@ public class PackageManagerService extends IPackageManager.Stub {
        }
    }

    private String calculateApkRoot(final File codePath) {
    private String calculateApkRoot(final String codePathString) {
        final File codePath = new File(codePathString);
        final File codeRoot;
        if (FileUtils.contains(Environment.getRootDirectory(), codePath)) {
            codeRoot = Environment.getRootDirectory();
@@ -5278,12 +5278,12 @@ public class PackageManagerService extends IPackageManager.Stub {
            PackageSetting pkgSetting) {
        // "bundled" here means system-installed with no overriding update
        final boolean bundledApk = isSystemApp(pkg) && !isUpdatedSystemApp(pkg);
        final String apkName = getApkName(pkgSetting.codePathString);
        final String apkName = getApkName(pkg.applicationInfo.sourceDir);
        final File libDir;
        if (bundledApk) {
            // If "/system/lib64/apkname" exists, assume that is the per-package
            // native library directory to use; otherwise use "/system/lib/apkname".
            String apkRoot = calculateApkRoot(pkgSetting.codePath);
            String apkRoot = calculateApkRoot(pkg.applicationInfo.sourceDir);
            File lib64 = new File(apkRoot, LIB64_DIR_NAME);
            File packLib64 = new File(lib64, apkName);
            libDir = (packLib64.exists()) ? lib64 : new File(apkRoot, LIB_DIR_NAME);