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

Commit 806cc13a authored by Kenny Root's avatar Kenny Root
Browse files

Initialize native library path in PackageSetting

During boot-up we weren't paying attention to the nativeLibraryPath that
was read from the package settings XML file which reset the path to the
default /data/data/<package>/lib directory.

This adds nativeLibraryPath as an argument to the PackageSettings
constructor and related functions that will pull that value in from the
settings file.

It also removes the call to nativeLibraryDir.mkdir() which installd does
by itself.

Change-Id: I53db73c3b1bc90997a4a73f7f2fbaee125e6f67e
parent 9a3ce10c
Loading
Loading
Loading
Loading
+44 −31
Original line number Diff line number Diff line
@@ -3026,7 +3026,8 @@ class PackageManagerService extends IPackageManager.Stub {
            // Just create the setting, don't add it yet. For already existing packages
            // the PkgSetting exists already and doesn't have to be created.
            pkgSetting = mSettings.getPackageLP(pkg, origPackage, realName, suid, destCodeFile,
                            destResourceFile, pkg.applicationInfo.flags, true, false);
                    destResourceFile, pkg.applicationInfo.nativeLibraryDir,
                    pkg.applicationInfo.flags, true, false);
            if (pkgSetting == null) {
                Slog.w(TAG, "Creating application package " + pkg.packageName + " failed");
                mLastScanError = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
@@ -3244,14 +3245,21 @@ class PackageManagerService extends IPackageManager.Stub {
                }
            }

            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
             * stored on SD card have their native libraries stored in the ASEC
             * container with the APK).
             *
             * This happens during an upgrade from a package settings file that
             * doesn't have a native library path attribute at all.
             */
            if (pkg.applicationInfo.nativeLibraryDir == null && pkg.applicationInfo.dataDir != null) {
                pkg.applicationInfo.nativeLibraryDir = new File(dataPath, LIB_DIR_NAME).getPath();
            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;
            }

            pkgSetting.uidError = uidError;
@@ -3273,7 +3281,6 @@ class PackageManagerService extends IPackageManager.Stub {
            if ((!isSystemApp(pkg) || isUpdatedSystemApp(pkg)) && !isExternal(pkg)) {
                Log.i(TAG, path + " changed; unpacking");
                File sharedLibraryDir = new File(pkg.applicationInfo.nativeLibraryDir);
                sharedLibraryDir.mkdir();
                NativeLibraryHelper.copyNativeBinariesLI(scanFile, sharedLibraryDir);
            }
            pkg.mScanPath = path;
@@ -7583,18 +7590,20 @@ class PackageManagerService extends IPackageManager.Stub {
        String installerPackageName;

        PackageSettingBase(String name, String realName, File codePath, File resourcePath,
                int pVersionCode, int pkgFlags) {
                String nativeLibraryPathString, int pVersionCode, int pkgFlags) {
            super(pkgFlags);
            this.name = name;
            this.realName = realName;
            init(codePath, resourcePath, pVersionCode);
            init(codePath, resourcePath, nativeLibraryPathString, pVersionCode);
        }

        void init(File codePath, File resourcePath, int pVersionCode) {
        void init(File codePath, File resourcePath, String nativeLibraryPathString,
                int pVersionCode) {
            this.codePath = codePath;
            this.codePathString = codePath.toString();
            this.resourcePath = resourcePath;
            this.resourcePathString = resourcePath.toString();
            this.nativeLibraryPathString = nativeLibraryPathString;
            this.versionCode = pVersionCode;
        }

@@ -7687,8 +7696,9 @@ class PackageManagerService extends IPackageManager.Stub {
        SharedUserSetting sharedUser;

        PackageSetting(String name, String realName, File codePath, File resourcePath,
                int pVersionCode, int pkgFlags) {
            super(name, realName, codePath, resourcePath, pVersionCode, pkgFlags);
                String nativeLibraryPathString, int pVersionCode, int pkgFlags) {
            super(name, realName, codePath, resourcePath, nativeLibraryPathString, pVersionCode,
                    pkgFlags);
        }

        @Override
@@ -7800,8 +7810,9 @@ class PackageManagerService extends IPackageManager.Stub {
            final int sharedId;

            PendingPackage(String name, String realName, File codePath, File resourcePath,
                    int sharedId, int pVersionCode, int pkgFlags) {
                super(name, realName, codePath, resourcePath, pVersionCode, pkgFlags);
                    String nativeLibraryPathString, int sharedId, int pVersionCode, int pkgFlags) {
                super(name, realName, codePath, resourcePath, nativeLibraryPathString,
                        pVersionCode, pkgFlags);
                this.sharedId = sharedId;
            }
        }
@@ -7830,10 +7841,10 @@ class PackageManagerService extends IPackageManager.Stub {

        PackageSetting getPackageLP(PackageParser.Package pkg, PackageSetting origPackage,
                String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
                int pkgFlags, boolean create, boolean add) {
                String nativeLibraryPathString, int pkgFlags, boolean create, boolean add) {
            final String name = pkg.packageName;
            PackageSetting p = getPackageLP(name, origPackage, realName, sharedUser, codePath,
                    resourcePath, pkg.mVersionCode, pkgFlags, create, add);
                    resourcePath, nativeLibraryPathString, pkg.mVersionCode, pkgFlags, create, add);
            return p;
        }

@@ -7929,14 +7940,14 @@ class PackageManagerService extends IPackageManager.Stub {
            if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
                p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
            }
            PackageSetting ret = addPackageLP(name, p.realName, p.codePath,
                    p.resourcePath, p.userId, p.versionCode, p.pkgFlags);
            PackageSetting ret = addPackageLP(name, p.realName, p.codePath, p.resourcePath,
                    p.nativeLibraryPathString, p.userId, p.versionCode, p.pkgFlags);
            mDisabledSysPackages.remove(name);
            return ret;
        }

        PackageSetting addPackageLP(String name, String realName, File codePath,
                File resourcePath, int uid, int vc, int pkgFlags) {
        PackageSetting addPackageLP(String name, String realName, File codePath, File resourcePath,
                String nativeLibraryPathString, int uid, int vc, int pkgFlags) {
            PackageSetting p = mPackages.get(name);
            if (p != null) {
                if (p.userId == uid) {
@@ -7946,7 +7957,8 @@ class PackageManagerService extends IPackageManager.Stub {
                        "Adding duplicate package, keeping first: " + name);
                return null;
            }
            p = new PackageSetting(name, realName, codePath, resourcePath, vc, pkgFlags);
            p = new PackageSetting(name, realName, codePath, resourcePath, nativeLibraryPathString,
                    vc, pkgFlags);
            p.userId = uid;
            if (addUserIdLP(uid, p, name)) {
                mPackages.put(name, p);
@@ -8001,7 +8013,7 @@ class PackageManagerService extends IPackageManager.Stub {
        
        private PackageSetting getPackageLP(String name, PackageSetting origPackage,
                String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
                int vc, int pkgFlags, boolean create, boolean add) {
                String nativeLibraryPathString, int vc, int pkgFlags, boolean create, boolean add) {
            PackageSetting p = mPackages.get(name);
            if (p != null) {
                if (!p.codePath.equals(codePath)) {
@@ -8044,8 +8056,8 @@ class PackageManagerService extends IPackageManager.Stub {
                }
                if (origPackage != null) {
                    // We are consuming the data from an existing package.
                    p = new PackageSetting(origPackage.name, name, codePath,
                            resourcePath, vc, pkgFlags);
                    p = new PackageSetting(origPackage.name, name, codePath, resourcePath,
                            nativeLibraryPathString, vc, pkgFlags);
                    if (DEBUG_UPGRADE) Log.v(TAG, "Package " + name
                            + " is adopting original package " + origPackage.name);
                    // Note that we will retain the new package's signature so
@@ -8061,7 +8073,8 @@ class PackageManagerService extends IPackageManager.Stub {
                    // Update new package state.
                    p.setTimeStamp(codePath.lastModified());
                } else {
                    p = new PackageSetting(name, realName, codePath, resourcePath, vc, pkgFlags);
                    p = new PackageSetting(name, realName, codePath, resourcePath,
                            nativeLibraryPathString, vc, pkgFlags);
                    p.setTimeStamp(codePath.lastModified());
                    p.sharedUser = sharedUser;
                    if (sharedUser != null) {
@@ -8783,7 +8796,7 @@ class PackageManagerService extends IPackageManager.Stub {
                if (idObj != null && idObj instanceof SharedUserSetting) {
                    PackageSetting p = getPackageLP(pp.name, null, pp.realName,
                            (SharedUserSetting) idObj, pp.codePath, pp.resourcePath,
                            pp.versionCode, pp.pkgFlags, true, true);
                            pp.nativeLibraryPathString, pp.versionCode, pp.pkgFlags, true, true);
                    if (p == null) {
                        Slog.w(TAG, "Unable to create application package for "
                                + pp.name);
@@ -8888,6 +8901,7 @@ class PackageManagerService extends IPackageManager.Stub {
            String realName = parser.getAttributeValue(null, "realName");
            String codePathStr = parser.getAttributeValue(null, "codePath");
            String resourcePathStr = parser.getAttributeValue(null, "resourcePath");
            String nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
            if (resourcePathStr == null) {
                resourcePathStr = codePathStr;
            }
@@ -8902,9 +8916,8 @@ class PackageManagerService extends IPackageManager.Stub {

            int pkgFlags = 0;
            pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
            PackageSetting ps = new PackageSetting(name, realName,
                    new File(codePathStr),
                    new File(resourcePathStr), versionCode, pkgFlags);
            PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr),
                    new File(resourcePathStr), nativeLibraryPathStr, versionCode, pkgFlags);
            String timeStampStr = parser.getAttributeValue(null, "ts");
            if (timeStampStr != null) {
                try {
@@ -9023,9 +9036,9 @@ class PackageManagerService extends IPackageManager.Stub {
                            "Error in package manager settings: <package> has no codePath at "
                            + parser.getPositionDescription());
                } else if (userId > 0) {
                    packageSetting = addPackageLP(name.intern(), realName,
                            new File(codePathStr), new File(resourcePathStr),
                            userId, versionCode, pkgFlags);
                    packageSetting = addPackageLP(name.intern(), realName, new File(codePathStr),
                            new File(resourcePathStr), nativeLibraryPathStr, userId, versionCode,
                            pkgFlags);
                    if (DEBUG_SETTINGS) Log.i(TAG, "Reading package " + name
                            + ": userId=" + userId + " pkg=" + packageSetting);
                    if (packageSetting == null) {
@@ -9042,7 +9055,7 @@ class PackageManagerService extends IPackageManager.Stub {
                    if (userId > 0) {
                        packageSetting = new PendingPackage(name.intern(), realName,
                                new File(codePathStr), new File(resourcePathStr),
                                userId, versionCode, pkgFlags);
                                nativeLibraryPathStr, userId, versionCode, pkgFlags);
                        packageSetting.setTimeStamp(timeStamp, timeStampStr);
                        mPendingPackages.add((PendingPackage) packageSetting);
                        if (DEBUG_SETTINGS) Log.i(TAG, "Reading package " + name