From 4cccd5ad6d771eb8b458192e4ba2f7e896387be7 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Mon, 16 May 2022 23:44:39 +0000 Subject: [PATCH] [pm] replaces some read-only mLock usages with snapshot BUG: 215749969 Test: presubmit Change-Id: I6c097576417cb0b08949b10e8967b06a235022f3 --- .../com/android/server/pm/AppDataHelper.java | 35 +++++++++---------- .../com/android/server/pm/DexOptHelper.java | 14 ++++---- .../com/android/server/pm/InstallParams.java | 16 ++++----- .../android/server/pm/MovePackageHelper.java | 32 ++++++++--------- .../server/pm/PackageManagerServiceUtils.java | 4 +-- .../android/server/pm/VerificationParams.java | 5 ++- 6 files changed, 49 insertions(+), 57 deletions(-) diff --git a/services/core/java/com/android/server/pm/AppDataHelper.java b/services/core/java/com/android/server/pm/AppDataHelper.java index 66f71a37e0a35..ce323fc4d883b 100644 --- a/services/core/java/com/android/server/pm/AppDataHelper.java +++ b/services/core/java/com/android/server/pm/AppDataHelper.java @@ -520,14 +520,13 @@ final class AppDataHelper { int count = 0; final Installer.Batch batch = new Installer.Batch(); for (String pkgName : deferPackages) { - AndroidPackage pkg = null; - synchronized (mPm.mLock) { - PackageSetting ps = mPm.mSettings.getPackageLPr(pkgName); - if (ps != null && ps.getInstalled(UserHandle.USER_SYSTEM)) { - pkg = ps.getPkg(); - } - } - if (pkg != null) { + final Computer snapshot = mPm.snapshotComputer(); + final PackageStateInternal packageStateInternal = snapshot.getPackageStateInternal( + pkgName); + if (packageStateInternal != null + && packageStateInternal.getUserStateOrDefault( + UserHandle.USER_SYSTEM).isInstalled()) { + AndroidPackage pkg = packageStateInternal.getPkg(); prepareAppDataAndMigrate(batch, pkg, UserHandle.USER_SYSTEM, storageFlags, true /* maybeMigrateAppData */); count++; @@ -554,12 +553,12 @@ final class AppDataHelper { } private void clearAppDataLeafLIF(AndroidPackage pkg, int userId, int flags) { - final PackageSetting ps; - synchronized (mPm.mLock) { - ps = mPm.mSettings.getPackageLPr(pkg.getPackageName()); - } + final Computer snapshot = mPm.snapshotComputer(); + final PackageStateInternal packageStateInternal = + snapshot.getPackageStateInternal(pkg.getPackageName()); for (int realUserId : mPm.resolveUserIds(userId)) { - final long ceDataInode = (ps != null) ? ps.getCeDataInode(realUserId) : 0; + final long ceDataInode = (packageStateInternal != null) + ? packageStateInternal.getUserStateOrDefault(realUserId).getCeDataInode() : 0; try { mInstaller.clearAppData(pkg.getVolumeUuid(), pkg.getPackageName(), realUserId, flags, ceDataInode); @@ -586,12 +585,12 @@ final class AppDataHelper { } public void destroyAppDataLeafLIF(AndroidPackage pkg, int userId, int flags) { - final PackageSetting ps; - synchronized (mPm.mLock) { - ps = mPm.mSettings.getPackageLPr(pkg.getPackageName()); - } + final Computer snapshot = mPm.snapshotComputer(); + final PackageStateInternal packageStateInternal = + snapshot.getPackageStateInternal(pkg.getPackageName()); for (int realUserId : mPm.resolveUserIds(userId)) { - final long ceDataInode = (ps != null) ? ps.getCeDataInode(realUserId) : 0; + final long ceDataInode = (packageStateInternal != null) + ? packageStateInternal.getUserStateOrDefault(realUserId).getCeDataInode() : 0; try { mInstaller.destroyAppData(pkg.getVolumeUuid(), pkg.getPackageName(), realUserId, flags, ceDataInode); diff --git a/services/core/java/com/android/server/pm/DexOptHelper.java b/services/core/java/com/android/server/pm/DexOptHelper.java index aabe8a163df73..93c40bb5b2c5f 100644 --- a/services/core/java/com/android/server/pm/DexOptHelper.java +++ b/services/core/java/com/android/server/pm/DexOptHelper.java @@ -469,15 +469,13 @@ final class DexOptHelper { options.getSplitName(), options.getFlags() | DexoptOptions.DEXOPT_AS_SHARED_LIBRARY); for (SharedLibraryInfo info : deps) { - AndroidPackage depPackage = null; - PackageSetting depPackageSetting = null; - synchronized (mPm.mLock) { - depPackage = mPm.mPackages.get(info.getPackageName()); - depPackageSetting = mPm.mSettings.getPackageLPr(info.getPackageName()); - } - if (depPackage != null && depPackageSetting != null) { + Computer snapshot = mPm.snapshotComputer(); + AndroidPackage depPackage = snapshot.getPackage(info.getPackageName()); + PackageStateInternal depPackageStateInternal = + snapshot.getPackageStateInternal(info.getPackageName()); + if (depPackage != null && depPackageStateInternal != null) { // TODO: Analyze and investigate if we (should) profile libraries. - pdo.performDexOpt(depPackage, depPackageSetting, instructionSets, + pdo.performDexOpt(depPackage, depPackageStateInternal, instructionSets, mPm.getOrCreateCompilerPackageStats(depPackage), mPm.getDexManager().getPackageUseInfoOrDefault( depPackage.getPackageName()), libraryOptions); diff --git a/services/core/java/com/android/server/pm/InstallParams.java b/services/core/java/com/android/server/pm/InstallParams.java index 18d2b0c23320f..fb189fb6d02cb 100644 --- a/services/core/java/com/android/server/pm/InstallParams.java +++ b/services/core/java/com/android/server/pm/InstallParams.java @@ -158,15 +158,13 @@ final class InstallParams extends HandlerParams { return InstallLocationUtils.getInstallationErrorCode(recommendedInstallLocation); } // Override with defaults if needed. - synchronized (mPm.mLock) { - // reader - AndroidPackage installedPkg = mPm.mPackages.get(packageName); - if (installedPkg != null) { - // Currently installed package which the new package is attempting to replace - recommendedInstallLocation = InstallLocationUtils.installLocationPolicy( - installLocation, recommendedInstallLocation, mInstallFlags, - installedPkg.isSystem(), installedPkg.isExternalStorage()); - } + Computer snapshot = mPm.snapshotComputer(); + AndroidPackage installedPkg = snapshot.getPackage(packageName); + if (installedPkg != null) { + // Currently installed package which the new package is attempting to replace + recommendedInstallLocation = InstallLocationUtils.installLocationPolicy( + installLocation, recommendedInstallLocation, mInstallFlags, + installedPkg.isSystem(), installedPkg.isExternalStorage()); } final boolean onInt = (mInstallFlags & PackageManager.INSTALL_INTERNAL) != 0; diff --git a/services/core/java/com/android/server/pm/MovePackageHelper.java b/services/core/java/com/android/server/pm/MovePackageHelper.java index c5ca06cc7b84d..75526f86be719 100644 --- a/services/core/java/com/android/server/pm/MovePackageHelper.java +++ b/services/core/java/com/android/server/pm/MovePackageHelper.java @@ -303,10 +303,8 @@ public final class MovePackageHelper { * @param packageName The package that was moved. */ private void logAppMovedStorage(String packageName, boolean isPreviousLocationExternal) { - final AndroidPackage pkg; - synchronized (mPm.mLock) { - pkg = mPm.mPackages.get(packageName); - } + final Computer snapshot = mPm.snapshotComputer(); + final AndroidPackage pkg = snapshot.getPackage(packageName); if (pkg == null) { return; } @@ -334,26 +332,26 @@ public final class MovePackageHelper { @GuardedBy("mPm.mInstallLock") private boolean getPackageSizeInfoLI(String packageName, int userId, PackageStats stats) { - final PackageSetting ps; - synchronized (mPm.mLock) { - ps = mPm.mSettings.getPackageLPr(packageName); - if (ps == null) { - Slog.w(TAG, "Failed to find settings for " + packageName); - return false; - } + final Computer snapshot = mPm.snapshotComputer(); + final PackageStateInternal packageStateInternal = + snapshot.getPackageStateInternal(packageName); + if (packageStateInternal == null) { + Slog.w(TAG, "Failed to find settings for " + packageName); + return false; } final String[] packageNames = { packageName }; - final long[] ceDataInodes = { ps.getCeDataInode(userId) }; - final String[] codePaths = { ps.getPathString() }; + final long[] ceDataInodes = { + packageStateInternal.getUserStateOrDefault(userId).getCeDataInode() }; + final String[] codePaths = { packageStateInternal.getPathString() }; try { - mPm.mInstaller.getAppSize(ps.getVolumeUuid(), packageNames, userId, 0, - ps.getAppId(), ceDataInodes, codePaths, stats); + mPm.mInstaller.getAppSize(packageStateInternal.getVolumeUuid(), packageNames, userId, + 0, packageStateInternal.getAppId(), ceDataInodes, codePaths, stats); // For now, ignore code size of packages on system partition - if (PackageManagerServiceUtils.isSystemApp(ps) - && !PackageManagerServiceUtils.isUpdatedSystemApp(ps)) { + if (PackageManagerServiceUtils.isSystemApp(packageStateInternal) + && !PackageManagerServiceUtils.isUpdatedSystemApp(packageStateInternal)) { stats.codeSize = 0; } diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index 703be169f14cb..532bfc3494ebc 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -1076,11 +1076,11 @@ public class PackageManagerServiceUtils { return null; } - public static boolean isSystemApp(PackageSetting ps) { + public static boolean isSystemApp(PackageStateInternal ps) { return (ps.getFlags() & ApplicationInfo.FLAG_SYSTEM) != 0; } - public static boolean isUpdatedSystemApp(PackageSetting ps) { + public static boolean isUpdatedSystemApp(PackageStateInternal ps) { return (ps.getFlags() & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; } diff --git a/services/core/java/com/android/server/pm/VerificationParams.java b/services/core/java/com/android/server/pm/VerificationParams.java index a3335609caf14..0e8b3997da2c7 100644 --- a/services/core/java/com/android/server/pm/VerificationParams.java +++ b/services/core/java/com/android/server/pm/VerificationParams.java @@ -583,9 +583,8 @@ final class VerificationParams extends HandlerParams { } private boolean packageExists(String packageName) { - synchronized (mPm.mLock) { - return mPm.mSettings.getPackageLPr(packageName) != null; - } + Computer snapshot = mPm.snapshotComputer(); + return snapshot.getPackageStateInternal(packageName) != null; } private boolean isAdbVerificationEnabled(PackageInfoLite pkgInfoLite, int userId,