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

Commit 2e5a4333 authored by TYM Tsai's avatar TYM Tsai Committed by Android (Google) Code Review
Browse files

Merge "Code refactoring: Move doRename out of preparePackageLI" into main

parents 0fe2c8ae 0d206610
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3025,6 +3025,7 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
    @Override
    public PackageImpl setSplitCodePaths(@Nullable String[] splitCodePaths) {
        this.splitCodePaths = splitCodePaths;
        this.mSplits = null; // reset for paths changed
        if (splitCodePaths != null) {
            int size = splitCodePaths.length;
            for (int index = 0; index < size; index++) {
+58 −29
Original line number Diff line number Diff line
@@ -1019,7 +1019,9 @@ final class InstallPackageHelper {
                    && scanInstallPackages(requests, createdAppId, versionInfos)) {
                List<ReconciledPackage> reconciledPackages =
                        reconcileInstallPackages(requests, versionInfos);
                if (reconciledPackages != null && commitInstallPackages(reconciledPackages)) {
                if (reconciledPackages != null
                        && renameAndUpdatePaths(requests)
                        && commitInstallPackages(reconciledPackages)) {
                    success = true;
                }
            }
@@ -1029,14 +1031,40 @@ final class InstallPackageHelper {
        }
    }

    private boolean prepareInstallPackages(List<InstallRequest> requests) {
        // TODO: will remove the locking after doRename is moved out of prepare
    private boolean renameAndUpdatePaths(List<InstallRequest> requests) {
        try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
            for (InstallRequest request : requests) {
                ParsedPackage parsedPackage = request.getParsedPackage();
                final boolean isApex = (request.getScanFlags() & SCAN_AS_APEX) != 0;
                if (isApex) {
                    continue;
                }
                try {
                    doRenameLI(request, parsedPackage);
                    setUpFsVerity(parsedPackage);
                } catch (Installer.InstallerException | IOException | DigestException
                         | NoSuchAlgorithmException | PrepareFailure e) {
                    request.setError(PackageManagerException.INTERNAL_ERROR_VERITY_SETUP,
                            "Failed to set up verity: " + e);
                    return false;
                }

                // update paths that are set before renaming
                PackageSetting scannedPackageSetting = request.getScannedPackageSetting();
                scannedPackageSetting.setPath(new File(parsedPackage.getPath()));
                scannedPackageSetting.setLegacyNativeLibraryPath(
                        parsedPackage.getNativeLibraryRootDir());
            }
            return true;
        }
    }

    private boolean prepareInstallPackages(List<InstallRequest> requests) {
        for (InstallRequest request : requests) {
            try {
                Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "preparePackage");
                request.onPrepareStarted();
                    preparePackageLI(request);
                preparePackage(request);
            } catch (PrepareFailure prepareFailure) {
                request.setError(prepareFailure.error,
                        prepareFailure.getMessage());
@@ -1048,7 +1076,6 @@ final class InstallPackageHelper {
                Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
            }
        }
        }
        return true;
    }

@@ -1231,8 +1258,7 @@ final class InstallPackageHelper {
        return newProp != null && newProp.getBoolean();
    }

    @GuardedBy("mPm.mInstallLock")
    private void preparePackageLI(InstallRequest request) throws PrepareFailure {
    private void preparePackage(InstallRequest request) throws PrepareFailure {
        final int[] allUsers =  mPm.mUserManager.getUserIds();
        final int installFlags = request.getInstallFlags();
        final boolean onExternal = request.getVolumeUuid() != null;
@@ -1739,18 +1765,7 @@ final class InstallPackageHelper {
            }
        }

        if (!isApex) {
            doRenameLI(request, parsedPackage);

            try {
                setUpFsVerity(parsedPackage);
            } catch (Installer.InstallerException | IOException | DigestException
                    | NoSuchAlgorithmException e) {
                throw PrepareFailure.ofInternalError(
                        "Failed to set up verity: " + e,
                        PackageManagerException.INTERNAL_ERROR_VERITY_SETUP);
            }
        } else {
        if (isApex) {
            // Use the path returned by apexd
            parsedPackage.setPath(request.getApexInfo().modulePath);
            parsedPackage.setBaseApkPath(request.getApexInfo().modulePath);
@@ -2086,7 +2101,21 @@ final class InstallPackageHelper {

        // Reflect the rename in scanned details
        try {
            parsedPackage.setPath(afterCodeFile.getCanonicalPath());
            String afterCanonicalPath = afterCodeFile.getCanonicalPath();
            String beforeCanonicalPath = beforeCodeFile.getCanonicalPath();
            parsedPackage.setPath(afterCanonicalPath);

            parsedPackage.setNativeLibraryDir(
                    parsedPackage.getNativeLibraryDir()
                            .replace(beforeCanonicalPath, afterCanonicalPath));
            parsedPackage.setNativeLibraryRootDir(
                    parsedPackage.getNativeLibraryRootDir()
                            .replace(beforeCanonicalPath, afterCanonicalPath));
            String secondaryNativeLibraryDir = parsedPackage.getSecondaryNativeLibraryDir();
            if (secondaryNativeLibraryDir != null) {
                parsedPackage.setSecondaryNativeLibraryDir(
                        secondaryNativeLibraryDir.replace(beforeCanonicalPath, afterCanonicalPath));
            }
        } catch (IOException e) {
            Slog.e(TAG, "Failed to get path: " + afterCodeFile, e);
            throw new PrepareFailure(PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE,