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

Commit 0df08188 authored by Song Chun Fan's avatar Song Chun Fan Committed by Android (Google) Code Review
Browse files

Merge "[pm] correctly lock/unlock mInstallLock" into main

parents 5cbc7d06 e55490cb
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -345,7 +345,7 @@ public class AppDataHelper {
        final StorageManager storage = mInjector.getSystemService(StorageManager.class);
        final StorageManager storage = mInjector.getSystemService(StorageManager.class);
        for (VolumeInfo vol : storage.getWritablePrivateVolumes()) {
        for (VolumeInfo vol : storage.getWritablePrivateVolumes()) {
            final String volumeUuid = vol.getFsUuid();
            final String volumeUuid = vol.getFsUuid();
            synchronized (mPm.mInstallLock) {
            try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
                reconcileAppsDataLI(volumeUuid, userId, flags, migrateAppsData);
                reconcileAppsDataLI(volumeUuid, userId, flags, migrateAppsData);
            }
            }
        }
        }
@@ -505,7 +505,7 @@ public class AppDataHelper {
            storageFlags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;
            storageFlags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;
        }
        }
        final List<String> deferPackages;
        final List<String> deferPackages;
        synchronized (mPm.mInstallLock) {
        try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
            deferPackages = reconcileAppsDataLI(StorageManager.UUID_PRIVATE_INTERNAL,
            deferPackages = reconcileAppsDataLI(StorageManager.UUID_PRIVATE_INTERNAL,
                    UserHandle.USER_SYSTEM, storageFlags, true /* migrateAppData */,
                    UserHandle.USER_SYSTEM, storageFlags, true /* migrateAppData */,
                    true /* onlyCoreApps */);
                    true /* onlyCoreApps */);
@@ -541,7 +541,7 @@ public class AppDataHelper {
                    count++;
                    count++;
                }
                }
            }
            }
            synchronized (mPm.mInstallLock) {
            try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
                executeBatchLI(batch);
                executeBatchLI(batch);
            }
            }
            traceLog.traceEnd();
            traceLog.traceEnd();
+4 −4
Original line number Original line Diff line number Diff line
@@ -241,7 +241,7 @@ final class DeletePackageHelper {
            isInstallerPackage = mPm.mSettings.isInstallerPackage(packageName);
            isInstallerPackage = mPm.mSettings.isInstallerPackage(packageName);
        }
        }


        synchronized (mPm.mInstallLock) {
        try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
            if (DEBUG_REMOVE) Slog.d(TAG, "deletePackageX: pkg=" + packageName + " user=" + userId);
            if (DEBUG_REMOVE) Slog.d(TAG, "deletePackageX: pkg=" + packageName + " user=" + userId);
            try (PackageFreezer freezer = mPm.freezePackageForDelete(packageName, freezeUser,
            try (PackageFreezer freezer = mPm.freezePackageForDelete(packageName, freezeUser,
                    deleteFlags, "deletePackageX", ApplicationExitInfo.REASON_OTHER)) {
                    deleteFlags, "deletePackageX", ApplicationExitInfo.REASON_OTHER)) {
@@ -280,7 +280,7 @@ final class DeletePackageHelper {


        // Delete the resources here after sending the broadcast to let
        // Delete the resources here after sending the broadcast to let
        // other processes clean up before deleting resources.
        // other processes clean up before deleting resources.
        synchronized (mPm.mInstallLock) {
        try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
            if (info.mArgs != null) {
            if (info.mArgs != null) {
                mRemovePackageHelper.cleanUpResources(info.mArgs.getPackageName(),
                mRemovePackageHelper.cleanUpResources(info.mArgs.getPackageName(),
                        info.mArgs.getCodeFile(), info.mArgs.getInstructionSets());
                        info.mArgs.getCodeFile(), info.mArgs.getInstructionSets());
@@ -435,7 +435,7 @@ final class DeletePackageHelper {
    public void executeDeletePackage(DeletePackageAction action, String packageName,
    public void executeDeletePackage(DeletePackageAction action, String packageName,
            boolean deleteCodeAndResources, @NonNull int[] allUserHandles, boolean writeSettings)
            boolean deleteCodeAndResources, @NonNull int[] allUserHandles, boolean writeSettings)
            throws SystemDeleteException {
            throws SystemDeleteException {
        synchronized (mPm.mInstallLock) {
        try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
            executeDeletePackageLIF(action, packageName, deleteCodeAndResources, allUserHandles,
            executeDeletePackageLIF(action, packageName, deleteCodeAndResources, allUserHandles,
                    writeSettings);
                    writeSettings);
        }
        }
@@ -681,7 +681,7 @@ final class DeletePackageHelper {
            // Preserve data by setting flag
            // Preserve data by setting flag
            flags |= PackageManager.DELETE_KEEP_DATA;
            flags |= PackageManager.DELETE_KEEP_DATA;
        }
        }
        synchronized (mPm.mInstallLock) {
        try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
            deleteInstalledPackageLIF(deletedPs, UserHandle.USER_ALL, true, flags, allUserHandles,
            deleteInstalledPackageLIF(deletedPs, UserHandle.USER_ALL, true, flags, allUserHandles,
                    outInfo, writeSettings);
                    outInfo, writeSettings);
        }
        }
+23 −31
Original line number Original line Diff line number Diff line
@@ -107,12 +107,10 @@ final class FreeStorageHelper {
            }
            }


            // 4. Consider cached app data (above quotas)
            // 4. Consider cached app data (above quotas)
            synchronized (mPm.mInstallLock) {
            try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
                try {
                mPm.mInstaller.freeCache(volumeUuid, bytes, Installer.FLAG_FREE_CACHE_V2);
                mPm.mInstaller.freeCache(volumeUuid, bytes, Installer.FLAG_FREE_CACHE_V2);
            } catch (Installer.InstallerException ignored) {
            } catch (Installer.InstallerException ignored) {
            }
            }
            }
            if (file.getUsableSpace() >= bytes) return;
            if (file.getUsableSpace() >= bytes) return;


            final Computer computer = mPm.snapshotComputer();
            final Computer computer = mPm.snapshotComputer();
@@ -141,13 +139,11 @@ final class FreeStorageHelper {
            }
            }


            // 8. Consider cached app data (below quotas)
            // 8. Consider cached app data (below quotas)
            synchronized (mPm.mInstallLock) {
            try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
                try {
                mPm.mInstaller.freeCache(volumeUuid, bytes,
                mPm.mInstaller.freeCache(volumeUuid, bytes,
                        Installer.FLAG_FREE_CACHE_V2 | Installer.FLAG_FREE_CACHE_V2_DEFY_QUOTA);
                        Installer.FLAG_FREE_CACHE_V2 | Installer.FLAG_FREE_CACHE_V2_DEFY_QUOTA);
            } catch (Installer.InstallerException ignored) {
            } catch (Installer.InstallerException ignored) {
            }
            }
            }
            if (file.getUsableSpace() >= bytes) return;
            if (file.getUsableSpace() >= bytes) return;


            // 9. Consider DropBox entries
            // 9. Consider DropBox entries
@@ -176,13 +172,11 @@ final class FreeStorageHelper {
            // 12. Clear temp install session files
            // 12. Clear temp install session files
            mPm.mInstallerService.freeStageDirs(volumeUuid);
            mPm.mInstallerService.freeStageDirs(volumeUuid);
        } else {
        } else {
            synchronized (mPm.mInstallLock) {
            try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
                try {
                mPm.mInstaller.freeCache(volumeUuid, bytes, 0);
                mPm.mInstaller.freeCache(volumeUuid, bytes, 0);
            } catch (Installer.InstallerException ignored) {
            } catch (Installer.InstallerException ignored) {
            }
            }
        }
        }
        }
        if (file.getUsableSpace() >= bytes) return;
        if (file.getUsableSpace() >= bytes) return;


        throw new IOException("Failed to free " + bytes + " on storage device at " + file);
        throw new IOException("Failed to free " + bytes + " on storage device at " + file);
@@ -197,8 +191,7 @@ final class FreeStorageHelper {
        final long sizeBytes = PackageManagerServiceUtils.calculateInstalledSize(resolvedPath,
        final long sizeBytes = PackageManagerServiceUtils.calculateInstalledSize(resolvedPath,
                mPackageAbiOverride);
                mPackageAbiOverride);
        if (sizeBytes >= 0) {
        if (sizeBytes >= 0) {
            synchronized (mPm.mInstallLock) {
            try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
                try {
                mPm.mInstaller.freeCache(null, sizeBytes + lowThreshold, 0);
                mPm.mInstaller.freeCache(null, sizeBytes + lowThreshold, 0);
                PackageInfoLite pkgInfoLite = PackageManagerServiceUtils.getMinimalPackageInfo(
                PackageInfoLite pkgInfoLite = PackageManagerServiceUtils.getMinimalPackageInfo(
                        mContext, pkgLite, resolvedPath, installFlags,
                        mContext, pkgLite, resolvedPath, installFlags,
@@ -214,7 +207,6 @@ final class FreeStorageHelper {
                Slog.w(TAG, "Failed to free cache", e);
                Slog.w(TAG, "Failed to free cache", e);
            }
            }
        }
        }
        }
        return recommendedInstallLocation;
        return recommendedInstallLocation;
    }
    }


+20 −28
Original line number Original line Diff line number Diff line
@@ -756,7 +756,7 @@ final class InstallPackageHelper {
                            Process.INVALID_UID /* previousAppId */,
                            Process.INVALID_UID /* previousAppId */,
                            permissionParamsBuilder.build(), userId);
                            permissionParamsBuilder.build(), userId);


                    synchronized (mPm.mInstallLock) {
                    try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
                        // We don't need to freeze for a brand new install
                        // We don't need to freeze for a brand new install
                        mAppDataHelper.prepareAppDataPostCommitLIF(
                        mAppDataHelper.prepareAppDataPostCommitLIF(
                                pkgSetting, /* previousAppId= */0, new int[] { userId });
                                pkgSetting, /* previousAppId= */0, new int[] { userId });
@@ -985,13 +985,11 @@ final class InstallPackageHelper {
    }
    }


    void installPackagesTraced(List<InstallRequest> requests) {
    void installPackagesTraced(List<InstallRequest> requests) {
        mPm.mInstallLock.lock();
        try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
        try {
            Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "installPackages");
            Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "installPackages");
            installPackagesLI(requests);
            installPackagesLI(requests);
        } finally {
        } finally {
            Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
            Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
            mPm.mInstallLock.unlock();
        }
        }
    }
    }


@@ -2592,7 +2590,8 @@ final class InstallPackageHelper {
            if (performDexopt) {
            if (performDexopt) {
                // dexopt can take long, and ArtService doesn't require installd, so we release
                // dexopt can take long, and ArtService doesn't require installd, so we release
                // the lock here and re-acquire the lock after dexopt is finished.
                // the lock here and re-acquire the lock after dexopt is finished.
                mPm.mInstallLock.unlock();
                PackageManagerTracedLock.RawLock installLock = mPm.mInstallLock.getRawLock();
                installLock.unlock();
                try {
                try {
                    Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
                    Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");


@@ -2612,7 +2611,7 @@ final class InstallPackageHelper {
                    installRequest.onDexoptFinished(dexOptResult);
                    installRequest.onDexoptFinished(dexOptResult);
                    Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
                    Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
                } finally {
                } finally {
                    mPm.mInstallLock.lock();
                    installLock.lock();
                }
                }
            }
            }
        }
        }
@@ -2921,7 +2920,7 @@ final class InstallPackageHelper {
                    // propagated to all application threads.
                    // propagated to all application threads.
                    mPm.scheduleDeferredNoKillPostDelete(args);
                    mPm.scheduleDeferredNoKillPostDelete(args);
                    if (Flags.improveInstallDontKill()) {
                    if (Flags.improveInstallDontKill()) {
                        synchronized (mPm.mInstallLock) {
                        try (var installLock = mPm.mInstallLock.acquireLock()) {
                            PackageManagerServiceUtils.linkFilesToOldDirs(mPm.mInstaller,
                            PackageManagerServiceUtils.linkFilesToOldDirs(mPm.mInstaller,
                                    packageName, pkgSetting.getPath(), pkgSetting.getOldPaths());
                                    packageName, pkgSetting.getPath(), pkgSetting.getOldPaths());
                        }
                        }
@@ -3068,7 +3067,7 @@ final class InstallPackageHelper {
            @NonNull PackageSetting stubPkgSetting) {
            @NonNull PackageSetting stubPkgSetting) {
        final int parseFlags = mPm.getDefParseFlags() | ParsingPackageUtils.PARSE_CHATTY
        final int parseFlags = mPm.getDefParseFlags() | ParsingPackageUtils.PARSE_CHATTY
                | ParsingPackageUtils.PARSE_ENFORCE_CODE;
                | ParsingPackageUtils.PARSE_ENFORCE_CODE;
        synchronized (mPm.mInstallLock) {
        try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
            final AndroidPackage pkg;
            final AndroidPackage pkg;
            try (PackageFreezer freezer =
            try (PackageFreezer freezer =
                         mPm.freezePackage(stubPkg.getPackageName(), UserHandle.USER_ALL,
                         mPm.freezePackage(stubPkg.getPackageName(), UserHandle.USER_ALL,
@@ -3231,12 +3230,10 @@ final class InstallPackageHelper {
        }
        }
        // Install the system package
        // Install the system package
        if (DEBUG_REMOVE) Slog.d(TAG, "Re-installing system package: " + disabledPs);
        if (DEBUG_REMOVE) Slog.d(TAG, "Re-installing system package: " + disabledPs);
        try {
        try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
            synchronized (mPm.mInstallLock) {
            final int[] origUsers = outInfo == null ? null : outInfo.mOrigUsers;
            final int[] origUsers = outInfo == null ? null : outInfo.mOrigUsers;
            installPackageFromSystemLIF(disabledPs.getPathString(), allUserHandles,
            installPackageFromSystemLIF(disabledPs.getPathString(), allUserHandles,
                    origUsers, writeSettings);
                    origUsers, writeSettings);
            }
        } catch (PackageManagerException e) {
        } catch (PackageManagerException e) {
            Slog.w(TAG, "Failed to restore system package:" + deletedPs.getPackageName() + ": "
            Slog.w(TAG, "Failed to restore system package:" + deletedPs.getPackageName() + ": "
                    + e.getMessage());
                    + e.getMessage());
@@ -3466,12 +3463,9 @@ final class InstallPackageHelper {
                if (ps != null) {
                if (ps != null) {
                    ps.getPkgState().setUpdatedSystemApp(false);
                    ps.getPkgState().setUpdatedSystemApp(false);
                }
                }

                try {
                final File codePath = new File(pkg.getPath());
                final File codePath = new File(pkg.getPath());
                    synchronized (mPm.mInstallLock) {
                try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
                    initPackageTracedLI(codePath, 0, scanFlags);
                    initPackageTracedLI(codePath, 0, scanFlags);
                    }
                } catch (PackageManagerException e) {
                } catch (PackageManagerException e) {
                    Slog.e(TAG, "Failed to parse updated, ex-system package: "
                    Slog.e(TAG, "Failed to parse updated, ex-system package: "
                            + e.getMessage());
                            + e.getMessage());
@@ -3679,15 +3673,13 @@ final class InstallPackageHelper {
            }
            }
            mPm.mSettings.enableSystemPackageLPw(packageName);
            mPm.mSettings.enableSystemPackageLPw(packageName);


            try {
            try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
                synchronized (mPm.mInstallLock) {
                final AndroidPackage newPkg = initPackageTracedLI(
                final AndroidPackage newPkg = initPackageTracedLI(
                         scanFile, reparseFlags, rescanFlags);
                         scanFile, reparseFlags, rescanFlags);
                 // We rescanned a stub, add it to the list of stubbed system packages
                 // We rescanned a stub, add it to the list of stubbed system packages
                if (newPkg.isStub()) {
                if (newPkg.isStub()) {
                    stubSystemApps.add(packageName);
                    stubSystemApps.add(packageName);
                }
                }
                }
            } catch (PackageManagerException e) {
            } catch (PackageManagerException e) {
                Slog.e(TAG, "Failed to parse original system package: "
                Slog.e(TAG, "Failed to parse original system package: "
                        + e.getMessage());
                        + e.getMessage());
+10 −12
Original line number Original line Diff line number Diff line
@@ -370,8 +370,7 @@ class InstallingSession {
            Slog.d(TAG, "Moving " + mMoveInfo.mPackageName + " from "
            Slog.d(TAG, "Moving " + mMoveInfo.mPackageName + " from "
                    + mMoveInfo.mFromUuid + " to " + mMoveInfo.mToUuid);
                    + mMoveInfo.mFromUuid + " to " + mMoveInfo.mToUuid);
        }
        }
        synchronized (mPm.mInstallLock) {
        try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) {
            try {
            mPm.mInstaller.moveCompleteApp(mMoveInfo.mFromUuid, mMoveInfo.mToUuid,
            mPm.mInstaller.moveCompleteApp(mMoveInfo.mFromUuid, mMoveInfo.mToUuid,
                    mMoveInfo.mPackageName, mMoveInfo.mAppId, mMoveInfo.mSeInfo,
                    mMoveInfo.mPackageName, mMoveInfo.mAppId, mMoveInfo.mSeInfo,
                    mMoveInfo.mTargetSdkVersion, mMoveInfo.mFromCodePath);
                    mMoveInfo.mTargetSdkVersion, mMoveInfo.mFromCodePath);
@@ -382,7 +381,6 @@ class InstallingSession {
            Slog.w(TAG, errorMessage, e);
            Slog.w(TAG, errorMessage, e);
            return PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
            return PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
        }
        }
        }


        final String toPathName = new File(mMoveInfo.mFromCodePath).getName();
        final String toPathName = new File(mMoveInfo.mFromCodePath).getName();
        request.setCodeFile(
        request.setCodeFile(
Loading