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

Commit 24a03083 authored by David 'Digit' Turner's avatar David 'Digit' Turner Committed by android-build SharedAccount
Browse files

PackageManagerService: always install native binaries from .apk

The previous implementation fails to work properly when the .apk
and installed versions of the binaries have the same size and date.

Change-Id: I063817a935da9ad459858d7eec8bb3d940607850
parent 3b70e159
Loading
Loading
Loading
Loading
+28 −22
Original line number Original line Diff line number Diff line
@@ -3623,12 +3623,11 @@ class PackageManagerService extends IPackageManager.Stub {


            installedNativeLibraries = true;
            installedNativeLibraries = true;


            // Always extract the shared library
            String sharedLibraryFilePath = sharedLibraryDir.getPath() +
            String sharedLibraryFilePath = sharedLibraryDir.getPath() +
                File.separator + libFileName;
                File.separator + libFileName;
            File sharedLibraryFile = new File(sharedLibraryFilePath);
            File sharedLibraryFile = new File(sharedLibraryFilePath);
            if (! sharedLibraryFile.exists() ||

                sharedLibraryFile.length() != entry.getSize() ||
                sharedLibraryFile.lastModified() != entry.getTime()) {
            if (Config.LOGD) {
            if (Config.LOGD) {
                Log.d(TAG, "Caching shared lib " + entry.getName());
                Log.d(TAG, "Caching shared lib " + entry.getName());
            }
            }
@@ -3638,7 +3637,6 @@ class PackageManagerService extends IPackageManager.Stub {
            cacheNativeBinaryLI(pkg, zipFile, entry, sharedLibraryDir,
            cacheNativeBinaryLI(pkg, zipFile, entry, sharedLibraryDir,
                    sharedLibraryFile);
                    sharedLibraryFile);
        }
        }
        }
        if (!hasNativeLibraries)
        if (!hasNativeLibraries)
            return PACKAGE_INSTALL_NATIVE_NO_LIBRARIES;
            return PACKAGE_INSTALL_NATIVE_NO_LIBRARIES;


@@ -3679,9 +3677,7 @@ class PackageManagerService extends IPackageManager.Stub {
            String installGdbServerPath = installGdbServerDir.getPath() +
            String installGdbServerPath = installGdbServerDir.getPath() +
                "/" + GDBSERVER;
                "/" + GDBSERVER;
            File installGdbServerFile = new File(installGdbServerPath);
            File installGdbServerFile = new File(installGdbServerPath);
            if (! installGdbServerFile.exists() ||

                installGdbServerFile.length() != entry.getSize() ||
                installGdbServerFile.lastModified() != entry.getTime()) {
            if (Config.LOGD) {
            if (Config.LOGD) {
                Log.d(TAG, "Caching gdbserver " + entry.getName());
                Log.d(TAG, "Caching gdbserver " + entry.getName());
            }
            }
@@ -3690,7 +3686,7 @@ class PackageManagerService extends IPackageManager.Stub {
            }
            }
            cacheNativeBinaryLI(pkg, zipFile, entry, installGdbServerDir,
            cacheNativeBinaryLI(pkg, zipFile, entry, installGdbServerDir,
                    installGdbServerFile);
                    installGdbServerFile);
            }

            return PACKAGE_INSTALL_NATIVE_FOUND_LIBRARIES;
            return PACKAGE_INSTALL_NATIVE_FOUND_LIBRARIES;
        }
        }
        return PACKAGE_INSTALL_NATIVE_NO_LIBRARIES;
        return PACKAGE_INSTALL_NATIVE_NO_LIBRARIES;
@@ -3704,6 +3700,16 @@ class PackageManagerService extends IPackageManager.Stub {
    // one if ro.product.cpu.abi2 is defined.
    // one if ro.product.cpu.abi2 is defined.
    //
    //
    private int cachePackageSharedLibsLI(PackageParser.Package pkg, File scanFile) {
    private int cachePackageSharedLibsLI(PackageParser.Package pkg, File scanFile) {
        // Remove all native binaries from a directory. This is used when upgrading
        // a package: in case the new .apk doesn't contain a native binary that was
        // in the old one (and thus installed), we need to remove it from
        // /data/data/<appname>/lib
        //
        // The simplest way to do that is to remove all files in this directory,
        // since it is owned by "system", applications are not supposed to write
        // anything there.
        removeNativeBinariesLI(pkg);

        String cpuAbi = Build.CPU_ABI;
        String cpuAbi = Build.CPU_ABI;
        try {
        try {
            int result = cachePackageSharedLibsForAbiLI(pkg, scanFile, cpuAbi);
            int result = cachePackageSharedLibsForAbiLI(pkg, scanFile, cpuAbi);