From 2fd993fd6cab961e524e858274cdc55789d9ed72 Mon Sep 17 00:00:00 2001 From: Winson Date: Thu, 10 Feb 2022 21:37:58 -0800 Subject: [PATCH] Remove ComputerTracker and fix consistency in PackageManagerService Effectively removes the lock and trampoline Computer wrappers as we enforce that snapshots are always available now. Also isolates IPackageManager and PackageManagerInternal from PackageManagerService to prevent misuse of the APIs. The separated base classes have access to a snapshot method which is then proxied to, or used to call into PMS. This makes it impossible for a caller using PMS directly to accidentally call into one of these other API surfaces that won't use the caller's provided snapshot, causing inconsistency problems. Also removes live locking annotations and the related infrastructure since we just assume that doesn't matter anymore. Also migrates some _Helper logic to take/pass snapshots to match the PMS methods, but not all of the helper logic migated to consistent snapshots. That will be done in a follow up. With this, all known extra overhead has been removed and metrics should return to normal. Bug: 215403184 Test: presubmit Change-Id: I7e977f600f49b070c3a539901cc06d523fb7517a --- .../content/pm/PackageManagerInternal.java | 3 - .../com/android/server/pm/ApkChecksums.java | 2 + .../com/android/server/pm/AppsFilter.java | 9 +- .../server/pm/BackgroundDexOptService.java | 29 +- .../java/com/android/server/pm/Computer.java | 240 +- .../com/android/server/pm/ComputerEngine.java | 34 +- .../com/android/server/pm/ComputerLocked.java | 853 +---- .../android/server/pm/ComputerTracker.java | 1327 -------- .../server/pm/DeletePackageHelper.java | 49 +- .../com/android/server/pm/DexOptHelper.java | 38 +- .../pm/DomainVerificationConnection.java | 12 +- .../com/android/server/pm/DumpHelper.java | 27 +- .../server/pm/IPackageManagerBase.java | 1189 +++++++ .../pm/IncrementalProgressListener.java | 3 +- .../server/pm/InitAndSystemPackageHelper.java | 2 +- .../server/pm/InstallPackageHelper.java | 33 +- .../android/server/pm/ModuleInfoProvider.java | 21 +- .../android/server/pm/MovePackageHelper.java | 137 +- .../android/server/pm/OtaDexoptService.java | 5 +- .../server/pm/PackageInstallerService.java | 54 +- .../server/pm/PackageInstallerSession.java | 6 +- .../server/pm/PackageManagerInternalBase.java | 751 +++++ .../server/pm/PackageManagerService.java | 2849 ++++------------- .../com/android/server/pm/PackageSender.java | 7 +- .../server/pm/PreferredActivityHelper.java | 157 +- .../android/server/pm/PreferredComponent.java | 11 +- .../server/pm/RemovePackageHelper.java | 10 +- .../server/pm/ResolveIntentHelper.java | 12 +- .../server/pm/SharedLibrariesImpl.java | 4 +- .../android/server/pm/StorageEventHelper.java | 13 +- .../server/pm/SuspendPackageHelper.java | 106 +- .../android/server/pm/UserManagerService.java | 4 +- .../server/pm/WatchedIntentFilter.java | 2 +- .../server/pm/dex/ArtManagerService.java | 21 +- .../com/android/server/pm/dex/DexManager.java | 32 +- .../server/pm/dex/DynamicCodeLogger.java | 32 +- .../pm/BackgroundDexOptServiceUnitTest.java | 4 +- .../PackageManagerServiceHibernationTests.kt | 2 +- .../server/pm/SharedLibrariesImplTest.kt | 22 +- .../server/pm/SuspendPackageHelperTest.kt | 57 +- .../server/pm/dex/DexManagerTests.java | 4 +- .../server/pm/PackageManagerServiceTest.java | 147 +- 42 files changed, 3113 insertions(+), 5207 deletions(-) delete mode 100644 services/core/java/com/android/server/pm/ComputerTracker.java create mode 100644 services/core/java/com/android/server/pm/IPackageManagerBase.java create mode 100644 services/core/java/com/android/server/pm/PackageManagerInternalBase.java diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 2068e6d380b7..68cd28809fd0 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -48,7 +48,6 @@ import com.android.server.pm.PackageSetting; import com.android.server.pm.dex.DynamicCodeLogger; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.pkg.AndroidPackageApi; -import com.android.server.pm.pkg.PackageState; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.SharedUserApi; import com.android.server.pm.pkg.component.ParsedMainComponent; @@ -690,8 +689,6 @@ public abstract class PackageManagerInternal { @Nullable public abstract PackageStateInternal getPackageStateInternal(@NonNull String packageName); - public abstract @Nullable PackageState getPackageState(@NonNull String packageName); - @NonNull public abstract ArrayMap getPackageStates(); diff --git a/services/core/java/com/android/server/pm/ApkChecksums.java b/services/core/java/com/android/server/pm/ApkChecksums.java index aa467e782e84..2824585bf5aa 100644 --- a/services/core/java/com/android/server/pm/ApkChecksums.java +++ b/services/core/java/com/android/server/pm/ApkChecksums.java @@ -34,6 +34,7 @@ import android.content.Context; import android.content.pm.ApkChecksum; import android.content.pm.Checksum; import android.content.pm.IOnChecksumsReadyListener; +import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.Signature; import android.content.pm.SigningDetails.SignatureSchemeVersion; @@ -62,6 +63,7 @@ import android.util.apk.VerityBuilder; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.security.VerityUtils; +import com.android.server.LocalServices; import com.android.server.pm.parsing.pkg.AndroidPackage; import java.io.ByteArrayOutputStream; diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java index d117967954d3..7b2dc28a396f 100644 --- a/services/core/java/com/android/server/pm/AppsFilter.java +++ b/services/core/java/com/android/server/pm/AppsFilter.java @@ -52,6 +52,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.function.QuadFunction; import com.android.server.FgThread; +import com.android.server.LocalServices; import com.android.server.compat.CompatChange; import com.android.server.om.OverlayReferenceMapper; import com.android.server.pm.parsing.pkg.AndroidPackage; @@ -486,12 +487,12 @@ public class AppsFilter implements Watchable, Snappable { } /** Builder method for an AppsFilter */ - public static AppsFilter create( - PackageManagerInternal pms, PackageManagerServiceInjector injector) { + public static AppsFilter create(@NonNull PackageManagerServiceInjector injector, + @NonNull PackageManagerInternal pmInt) { final boolean forceSystemAppsQueryable = injector.getContext().getResources() .getBoolean(R.bool.config_forceSystemPackagesQueryable); - final FeatureConfigImpl featureConfig = new FeatureConfigImpl(pms, injector); + final FeatureConfigImpl featureConfig = new FeatureConfigImpl(pmInt, injector); final String[] forcedQueryablePackageNames; if (forceSystemAppsQueryable) { // all system apps already queryable, no need to read and parse individual exceptions @@ -512,7 +513,7 @@ public class AppsFilter implements Watchable, Snappable { }; AppsFilter appsFilter = new AppsFilter(stateProvider, featureConfig, forcedQueryablePackageNames, forceSystemAppsQueryable, null, - injector.getBackgroundExecutor(), pms); + injector.getBackgroundExecutor(), pmInt); featureConfig.setAppsFilter(appsFilter); return appsFilter; } diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java index ecbb4a9d45a1..9ff4aab83cff 100644 --- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java +++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java @@ -19,6 +19,7 @@ package com.android.server.pm; import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; import android.annotation.IntDef; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.job.JobInfo; import android.app.job.JobParameters; @@ -269,7 +270,7 @@ public final class BackgroundDexOptService { PackageManagerService pm = mInjector.getPackageManagerService(); ArraySet packagesToOptimize; if (packageNames == null) { - packagesToOptimize = mDexOptHelper.getOptimizablePackages(); + packagesToOptimize = mDexOptHelper.getOptimizablePackages(pm.snapshotComputer()); } else { packagesToOptimize = new ArraySet<>(packageNames); } @@ -334,7 +335,7 @@ public final class BackgroundDexOptService { return false; } - ArraySet pkgs = mDexOptHelper.getOptimizablePackages(); + ArraySet pkgs = mDexOptHelper.getOptimizablePackages(pm.snapshotComputer()); if (pkgs.isEmpty()) { Slog.i(TAG, "No packages to optimize"); markPostBootUpdateCompleted(params); @@ -556,8 +557,8 @@ public final class BackgroundDexOptService { } /** Gets the size of a package. */ - private long getPackageSize(PackageManagerService pm, String pkg) { - PackageInfo info = pm.snapshotComputer().getPackageInfo(pkg, 0, UserHandle.USER_SYSTEM); + private long getPackageSize(@NonNull Computer snapshot, String pkg) { + PackageInfo info = snapshot.getPackageInfo(pkg, 0, UserHandle.USER_SYSTEM); long size = 0; if (info != null && info.applicationInfo != null) { File path = Paths.get(info.applicationInfo.sourceDir).toFile(); @@ -605,8 +606,9 @@ public final class BackgroundDexOptService { Slog.d(TAG, "Should Downgrade " + shouldDowngrade); } if (shouldDowngrade) { + final Computer snapshot = pm.snapshotComputer(); Set unusedPackages = - pm.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis); + snapshot.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis); if (DEBUG) { Slog.d(TAG, "Unsused Packages " + String.join(",", unusedPackages)); } @@ -618,7 +620,7 @@ public final class BackgroundDexOptService { // Should be aborted by the scheduler. return abortCode; } - @DexOptResult int downgradeResult = downgradePackage(pm, pkg, + @DexOptResult int downgradeResult = downgradePackage(snapshot, pm, pkg, /* isForPrimaryDex= */ true, isPostBootUpdate); if (downgradeResult == PackageDexOptimizer.DEX_OPT_PERFORMED) { updatedPackages.add(pkg); @@ -629,7 +631,7 @@ public final class BackgroundDexOptService { return status; } if (supportSecondaryDex) { - downgradeResult = downgradePackage(pm, pkg, + downgradeResult = downgradePackage(snapshot, pm, pkg, /* isForPrimaryDex= */false, isPostBootUpdate); status = convertPackageDexOptimizerStatusToInternal(downgradeResult); if (status != STATUS_OK) { @@ -696,8 +698,8 @@ public final class BackgroundDexOptService { * @return PackageDexOptimizer.DEX_* */ @DexOptResult - private int downgradePackage(PackageManagerService pm, String pkg, boolean isForPrimaryDex, - boolean isPostBootUpdate) { + private int downgradePackage(@NonNull Computer snapshot, PackageManagerService pm, String pkg, + boolean isForPrimaryDex, boolean isPostBootUpdate) { if (DEBUG) { Slog.d(TAG, "Downgrading " + pkg); } @@ -709,15 +711,15 @@ public final class BackgroundDexOptService { if (!isPostBootUpdate) { dexoptFlags |= DexoptOptions.DEXOPT_IDLE_BACKGROUND_JOB; } - long package_size_before = getPackageSize(pm, pkg); + long package_size_before = getPackageSize(snapshot, pkg); int result = PackageDexOptimizer.DEX_OPT_SKIPPED; if (isForPrimaryDex || PLATFORM_PACKAGE_NAME.equals(pkg)) { // This applies for system apps or if packages location is not a directory, i.e. // monolithic install. - if (!pm.canHaveOatDir(pkg)) { + if (!pm.canHaveOatDir(snapshot, pkg)) { // For apps that don't have the oat directory, instead of downgrading, // remove their compiler artifacts from dalvik cache. - pm.deleteOatArtifactsOfPackage(pkg); + pm.deleteOatArtifactsOfPackage(snapshot, pkg); } else { result = performDexOptPrimary(pkg, reason, dexoptFlags); } @@ -726,8 +728,9 @@ public final class BackgroundDexOptService { } if (result == PackageDexOptimizer.DEX_OPT_PERFORMED) { + final Computer newSnapshot = pm.snapshotComputer(); FrameworkStatsLog.write(FrameworkStatsLog.APP_DOWNGRADED, pkg, package_size_before, - getPackageSize(pm, pkg), /*aggressive=*/ false); + getPackageSize(newSnapshot, pkg), /*aggressive=*/ false); } return result; } diff --git a/services/core/java/com/android/server/pm/Computer.java b/services/core/java/com/android/server/pm/Computer.java index 6103d688e2b1..8e853019de90 100644 --- a/services/core/java/com/android/server/pm/Computer.java +++ b/services/core/java/com/android/server/pm/Computer.java @@ -58,10 +58,6 @@ import com.android.server.utils.WatchedLongSparseArray; import java.io.FileDescriptor; import java.io.PrintWriter; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; import java.util.List; import java.util.Set; @@ -92,92 +88,69 @@ import java.util.Set; * and other managers (like PermissionManager) mean deadlock is possible. On the * other hand, not overriding in {@link ComputerLocked} may leave a function walking * unstable data. - * - * To coax developers to consider such issues carefully, all methods in - * {@link Computer} must be annotated with @LiveImplementation(override = - * MANDATORY) or LiveImplementation(locked = NOT_ALLOWED). A unit - * test verifies the annotation and that the annotation corresponds to the code in - * {@link ComputerEngine} and {@link ComputerLocked}. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public interface Computer extends PackageDataSnapshot { - /** - * Every method must be annotated. - */ - @Target({ ElementType.METHOD }) - @Retention(RetentionPolicy.RUNTIME) - @interface LiveImplementation { - // A Computer method must be annotated with one of the following values: - // MANDATORY - the method must be overridden in ComputerEngineLive. The - // format of the override is a call to the super method, wrapped in a - // synchronization block. - // NOT_ALLOWED - the method may not appear in the live computer. It must - // be final in the ComputerEngine. - int MANDATORY = 1; - int NOT_ALLOWED = 2; - int override() default MANDATORY; - String rationale() default ""; - } - /** * Administrative statistics: record that the snapshot has been used. Every call * to use() increments the usage counter. */ - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) default void use() { } /** * Fetch the snapshot usage counter. * @return The number of times this snapshot was used. */ - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) default int getUsed() { return 0; } - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) @NonNull List queryIntentActivitiesInternal(Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags, int filterCallingUid, int userId, boolean resolveForStart, boolean allowDynamicSplits); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) @NonNull List queryIntentActivitiesInternal(Intent intent, String resolvedType, long flags, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) @NonNull List queryIntentServicesInternal(Intent intent, String resolvedType, long flags, int userId, int callingUid, boolean includeInstantApps); - @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) @NonNull QueryIntentActivitiesResult queryIntentActivitiesInternalBody(Intent intent, String resolvedType, long flags, int filterCallingUid, int userId, boolean resolveForStart, boolean allowDynamicSplits, String pkgName, String instantAppPkgName); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ActivityInfo getActivityInfo(ComponentName component, long flags, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) + + /** + * Important: The provided filterCallingUid is used exclusively to filter out activities + * that can be seen based on user state. It's typically the original caller uid prior + * to clearing. Because it can only be provided by trusted code, its value can be + * trusted and will be used as-is; unlike userId which will be validated by this method. + */ ActivityInfo getActivityInfoInternal(ComponentName component, long flags, int filterCallingUid, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) AndroidPackage getPackage(String packageName); - @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) AndroidPackage getPackage(int uid); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ApplicationInfo generateApplicationInfoFromSettings(String packageName, long flags, int filterCallingUid, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ApplicationInfo getApplicationInfo(String packageName, long flags, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) + + /** + * Important: The provided filterCallingUid is used exclusively to filter out applications + * that can be seen based on user state. It's typically the original caller uid prior + * to clearing. Because it can only be provided by trusted code, its value can be + * trusted and will be used as-is; unlike userId which will be validated by this method. + */ ApplicationInfo getApplicationInfoInternal(String packageName, long flags, int filterCallingUid, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) + + /** + * Report the 'Home' activity which is currently set as "always use this one". If non is set + * then reports the most likely home activity or null if there are more than one. + */ ComponentName getDefaultHomeActivity(int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ComponentName getHomeActivitiesAsUser(List allHomeCandidates, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) CrossProfileDomainInfo getCrossProfileDomainPreferredLpr(Intent intent, String resolvedType, long flags, int sourceUserId, int parentUserId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) Intent getHomeIntent(); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) List getMatchingCrossProfileIntentFilters(Intent intent, String resolvedType, int userId); @@ -192,15 +165,11 @@ public interface Computer extends PackageDataSnapshot { * @param intent * @return A filtered list of resolved activities. */ - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) List applyPostResolutionFilter(@NonNull List resolveInfos, String ephemeralPkgName, boolean allowDynamicSplits, int filterCallingUid, boolean resolveForStart, int userId, Intent intent); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) PackageInfo generatePackageInfo(PackageStateInternal ps, long flags, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) PackageInfo getPackageInfo(String packageName, long flags, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) PackageInfo getPackageInfoInternal(String packageName, long versionCode, long flags, int filterCallingUid, int userId); @@ -209,79 +178,69 @@ public interface Computer extends PackageDataSnapshot { * known {@link PackageState} instances without a {@link PackageState#getAndroidPackage()} * will not be represented. */ - @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) String[] getAllAvailablePackageNames(); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) PackageStateInternal getPackageStateInternal(String packageName); - @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) PackageStateInternal getPackageStateInternal(String packageName, int callingUid); - @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) - @Nullable PackageState getPackageStateCopied(@NonNull String packageName); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ParceledListSlice getInstalledPackages(long flags, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ResolveInfo createForwardingResolveInfoUnchecked(WatchedIntentFilter filter, int sourceUserId, int targetUserId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ServiceInfo getServiceInfo(ComponentName component, long flags, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) SharedLibraryInfo getSharedLibraryInfo(String name, long version); - @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) String getInstantAppPackageName(int callingUid); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) String resolveExternalPackageName(AndroidPackage pkg); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) String resolveInternalPackageName(String packageName, long versionCode); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) String[] getPackagesForUid(int uid); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) UserInfo getProfileParent(int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean canViewInstantApps(int callingUid, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean filterSharedLibPackage(@Nullable PackageStateInternal ps, int uid, int userId, long flags); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean isCallerSameApp(String packageName, int uid); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean isComponentVisibleToInstantApp(@Nullable ComponentName component); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean isComponentVisibleToInstantApp(@Nullable ComponentName component, @PackageManager.ComponentType int type); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) - boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent, int userId, + + /** + * From Android R, camera intents have to match system apps. The only exception to this is if + * the DPC has set the camera persistent preferred activity. This case was introduced + * because it is important that the DPC has the ability to set both system and non-system + * camera persistent preferred activities. + * + * @return {@code true} if the intent is a camera intent and the persistent preferred + * activity was not set by the DPC. + */ + boolean isImplicitImageCaptureIntentAndNotSetByDpc(Intent intent, int userId, String resolvedType, long flags); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean isInstantApp(String packageName, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean isInstantAppInternal(String packageName, @UserIdInt int userId, int callingUid); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean isSameProfileGroup(@UserIdInt int callerUserId, @UserIdInt int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean shouldFilterApplication(@Nullable PackageStateInternal ps, int callingUid, @Nullable ComponentName component, @PackageManager.ComponentType int componentType, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean shouldFilterApplication(@Nullable PackageStateInternal ps, int callingUid, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean shouldFilterApplication(@NonNull SharedUserSetting sus, int callingUid, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) int checkUidPermission(String permName, int uid); - @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) int getPackageUidInternal(String packageName, long flags, int userId, int callingUid); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) long updateFlagsForApplication(long flags, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) long updateFlagsForComponent(long flags, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) long updateFlagsForPackage(long flags, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) + + /** + * Update given flags when being used to request {@link ResolveInfo}. + *

Instant apps are resolved specially, depending upon context. Minimally, + * {@code}flags{@code} must have the {@link PackageManager#MATCH_INSTANT} + * flag set. However, this flag is only honoured in three circumstances: + *

    + *
  • when called from a system process
  • + *
  • when the caller holds the permission {@code android.permission.ACCESS_INSTANT_APPS}
  • + *
  • when resolution occurs to start an activity with a {@code android.intent.action.VIEW} + * action and a {@code android.intent.category.BROWSABLE} category
  • + *
+ */ long updateFlagsForResolve(long flags, int userId, int callingUid, boolean wantInstantApps, boolean isImplicitImageCaptureIntentAndNotSetByDpc); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) long updateFlagsForResolve(long flags, int userId, int callingUid, boolean wantInstantApps, boolean onlyExposedExplicitly, boolean isImplicitImageCaptureIntentAndNotSetByDpc); @@ -299,117 +258,99 @@ public interface Computer extends PackageDataSnapshot { * @param checkShell whether to prevent shell from access if there's a debugging restriction * @param message the message to log on security exception */ - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) void enforceCrossUserOrProfilePermission(int callingUid, @UserIdInt int userId, boolean requireFullPermission, boolean checkShell, String message); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) + + /** + * Enforces the request is from the system or an app that has INTERACT_ACROSS_USERS + * or INTERACT_ACROSS_USERS_FULL permissions, if the {@code userId} is not for the caller. + * + * @param checkShell whether to prevent shell from access if there's a debugging restriction + * @param message the message to log on security exception + */ void enforceCrossUserPermission(int callingUid, @UserIdInt int userId, boolean requireFullPermission, boolean checkShell, String message); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) void enforceCrossUserPermission(int callingUid, @UserIdInt int userId, boolean requireFullPermission, boolean checkShell, boolean requirePermissionWhenSameUser, String message); - @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) SigningDetails getSigningDetails(@NonNull String packageName); - @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) SigningDetails getSigningDetails(int uid); - @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) boolean filterAppAccess(String packageName, int callingUid, int userId); - @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) boolean filterAppAccess(int uid, int callingUid); - @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) PackageManagerService.FindPreferredActivityBodyResult findPreferredActivityInternal( Intent intent, String resolvedType, long flags, List query, boolean always, boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered); - @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) - ResolveInfo findPersistentPreferredActivityLP(Intent intent, String resolvedType, long flags, + ResolveInfo findPersistentPreferredActivity(Intent intent, String resolvedType, long flags, List query, boolean debug, int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) PreferredIntentResolver getPreferredActivities(@UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ArrayMap getPackageStates(); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable String getRenamedPackage(@NonNull String packageName); /** * @return set of packages to notify */ - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ArraySet getNotifyPackagesForReplacedReceived(@NonNull String[] packages); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @PackageManagerService.PackageStartability int getPackageStartability(boolean safeMode, @NonNull String packageName, int callingUid, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isPackageAvailable(String packageName, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull String[] currentToCanonicalPackageNames(@NonNull String[] names); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull String[] canonicalToCurrentPackageNames(@NonNull String[] names); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull int[] getPackageGids(@NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int getTargetSdkVersion(@NonNull String packageName); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean activitySupportsIntent(@NonNull ComponentName resolveComponentName, @NonNull ComponentName component, @NonNull Intent intent, String resolvedType); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ActivityInfo getReceiverInfo(@NonNull ComponentName component, @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ParceledListSlice getSharedLibraries(@NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean canRequestPackageInstalls(@NonNull String packageName, int callingUid, int userId, boolean throwIfPermNotDeclared); - @Computer.LiveImplementation(override = LiveImplementation.NOT_ALLOWED) + /** + * Returns true if the system or user is explicitly preventing an otherwise valid installer to + * complete an install. This includes checks like unknown sources and user restrictions. + */ boolean isInstallDisabledForPackage(@NonNull String packageName, int uid, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable List getPackagesUsingSharedLibrary(@NonNull SharedLibraryInfo libInfo, @PackageManager.PackageInfoFlagsBits long flags, int callingUid, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ParceledListSlice getDeclaredSharedLibraries( @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ProviderInfo getProviderInfo(@NonNull ComponentName component, @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable String[] getSystemSharedLibraryNames(); @@ -417,136 +358,103 @@ public interface Computer extends PackageDataSnapshot { * @return the state if the given package has a state and isn't filtered by visibility. * Provides no guarantee that the package is in any usable state. */ - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int checkSignatures(@NonNull String pkg1, @NonNull String pkg2); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int checkUidSignatures(int uid1, int uid2); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate, @PackageManager.CertificateInputType int type); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate, @PackageManager.CertificateInputType int type); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull List getAllPackages(); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable String getNameForUid(int uid); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable String[] getNamesForUids(@NonNull int[] uids); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int getUidForSharedUser(@NonNull String sharedUserName); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int getFlagsForUid(int uid); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int getPrivateFlagsForUid(int uid); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isUidPrivileged(int uid); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull String[] getAppOpPermissionPackages(@NonNull String permissionName); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ParceledListSlice getPackagesHoldingPermissions(@NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull List getInstalledApplications( @PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId, int callingUid); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ProviderInfo resolveContentProvider(@NonNull String name, @PackageManager.ResolveInfoFlagsBits long flags, @UserIdInt int userId, int callingUid); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ProviderInfo getGrantImplicitAccessProviderInfo(int recipientUid, @NonNull String visibleAuthority); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) void querySyncProviders(boolean safeMode, @NonNull List outNames, @NonNull List outInfo); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ParceledListSlice queryContentProviders(@Nullable String processName, int uid, @PackageManager.ComponentInfoFlagsBits long flags, @Nullable String metaDataKey); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ParceledListSlice queryInstrumentation( @NonNull String targetPackage, int flags); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull List findSharedNonSystemLibraries( @NonNull PackageStateInternal pkgSetting); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean getApplicationHiddenSettingAsUser(@NonNull String packageName, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isSuspendingAnyPackages(@NonNull String suspendingPackage, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ParceledListSlice getAllIntentFilters(@NonNull String packageName); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable SparseArray getBroadcastAllowList(@NonNull String packageName, @UserIdInt int[] userIds, boolean isInstantApp); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable String getInstallerPackageName(@NonNull String packageName); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable InstallSourceInfo getInstallSourceInfo(@NonNull String packageName); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @PackageManager.EnabledState int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @PackageManager.EnabledState int getComponentEnabledSetting(@NonNull ComponentName component, int callingUid, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @PackageManager.EnabledState int getComponentEnabledSettingInternal(@NonNull ComponentName component, int callingUid, @UserIdInt int userId); @@ -557,25 +465,19 @@ public interface Computer extends PackageDataSnapshot { * are all effectively enabled for the given component. Or if the component cannot be found, * returns false. */ - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable KeySet getSigningKeySet(@NonNull String packageName); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId); @@ -585,49 +487,37 @@ public interface Computer extends PackageDataSnapshot { * package visibility filtering is enabled on it. If the UID is part of a shared user ID, * return {@code true} if any one application belongs to the shared user ID meets the criteria. */ - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean canQueryPackage(int callingUid, @Nullable String targetPackageName); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int getPackageUid(@NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean canAccessComponent(int callingUid, @NonNull ComponentName component, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @PackageManager.InstallReason int getInstallReason(@NonNull String packageName, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean canPackageQuery(@NonNull String sourcePackageName, @NonNull String targetPackageName, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType, @UserIdInt int sourceUserId, @UserIdInt int targetUserId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull List getPersistentApplications(boolean safeMode, int flags); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull SparseArray getAppsWithSharedUserIds(); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull String[] getSharedUserPackagesForPackage(@NonNull String packageName, @UserIdInt int userId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull Set getUnusedPackages(long downgradeTimeThresholdMillis); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId); @@ -638,55 +528,49 @@ public interface Computer extends PackageDataSnapshot { * * @return The filtered packages */ - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull String[] filterOnlySystemPackages(@Nullable String... pkgNames); // The methods in this block should be removed once SettingBase is interface snapshotted - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull List getPackagesForAppId(int appId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int getUidTargetSdkVersion(int uid); /** * @see PackageManagerInternal#getProcessesForUid(int) */ - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ArrayMap getProcessesForUid(int uid); // End block - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull WatchedArrayMap> getSharedLibraries(); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable Pair getPackageOrSharedUser(int appId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable SharedUserApi getSharedUser(int sharedUserAppIde); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ArraySet getSharedUserPackages(int sharedUserAppId); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ComponentResolverApi getComponentResolver(); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable PackageStateInternal getDisabledSystemPackage(@NonNull String packageName); - @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ResolveInfo getInstantAppInstallerInfo(); + + @NonNull + WatchedArrayMap getFrozenPackages(); + + @Nullable + ComponentName getInstantAppInstallerComponent(); } diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index 0c9855b2385d..06e827a8897f 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -466,7 +466,7 @@ public class ComputerEngine implements Computer { flags = updateFlagsForResolve(flags, userId, filterCallingUid, resolveForStart, comp != null || pkgName != null /*onlyExposedExplicitly*/, - isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType, + isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, resolvedType, flags)); List list = Collections.emptyList(); boolean skipPostResolution = false; @@ -1722,15 +1722,6 @@ public class ComputerEngine implements Computer { return mSettings.getPackage(packageName); } - @Nullable - public PackageState getPackageStateCopied(@NonNull String packageName) { - int callingUid = Binder.getCallingUid(); - packageName = resolveInternalPackageNameInternalLocked( - packageName, PackageManager.VERSION_CODE_HIGHEST, callingUid); - PackageStateInternal pkgSetting = mSettings.getPackage(packageName); - return pkgSetting == null ? null : PackageStateImpl.copy(pkgSetting); - } - public final ParceledListSlice getInstalledPackages(long flags, int userId) { final int callingUid = Binder.getCallingUid(); if (getInstantAppPackageName(callingUid) != null) { @@ -2468,7 +2459,7 @@ public class ComputerEngine implements Computer { * @return {@code true} if the intent is a camera intent and the persistent preferred * activity was not set by the DPC. */ - public final boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent, + public final boolean isImplicitImageCaptureIntentAndNotSetByDpc(Intent intent, int userId, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags) { return intent.isImplicitImageCaptureIntent() && !isPersistentPreferredActivitySetByDpm( intent, userId, resolvedType, flags); @@ -3228,12 +3219,12 @@ public class ComputerEngine implements Computer { flags = updateFlagsForResolve( flags, userId, callingUid, false /*includeInstantApps*/, - isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, + isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, resolvedType, flags)); intent = PackageManagerServiceUtils.updateIntentForResolve(intent); // Try to find a matching persistent preferred activity. - result.mPreferredResolveInfo = findPersistentPreferredActivityLP(intent, + result.mPreferredResolveInfo = findPersistentPreferredActivity(intent, resolvedType, flags, query, debug, userId); // If a persistent preferred activity matched, use it. @@ -3444,7 +3435,7 @@ public class ComputerEngine implements Computer { userId, queryMayBeFiltered, callingUid, isDeviceProvisioned); } - public final ResolveInfo findPersistentPreferredActivityLP(Intent intent, + public final ResolveInfo findPersistentPreferredActivity(Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, List query, boolean debug, int userId) { final int n = query.size(); @@ -5418,7 +5409,7 @@ public class ComputerEngine implements Computer { } long flags = updateFlagsForResolve(0, parent.id, callingUid, false /*includeInstantApps*/, - isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, parent.id, + isImplicitImageCaptureIntentAndNotSetByDpc(intent, parent.id, resolvedType, 0)); flags |= PackageManager.MATCH_DEFAULT_ONLY; CrossProfileDomainInfo xpDomainInfo = getCrossProfileDomainPreferredLpr( @@ -5694,4 +5685,17 @@ public class ComputerEngine implements Computer { public ResolveInfo getInstantAppInstallerInfo() { return mInstantAppInstallerInfo; } + + @NonNull + @Override + public WatchedArrayMap getFrozenPackages() { + return mFrozenPackages; + } + + @Nullable + @Override + public ComponentName getInstantAppInstallerComponent() { + return mLocalInstantAppInstallerActivity == null + ? null : mLocalInstantAppInstallerActivity.getComponentName(); + } } diff --git a/services/core/java/com/android/server/pm/ComputerLocked.java b/services/core/java/com/android/server/pm/ComputerLocked.java index 5d89c7daeaf5..af196d51331f 100644 --- a/services/core/java/com/android/server/pm/ComputerLocked.java +++ b/services/core/java/com/android/server/pm/ComputerLocked.java @@ -16,62 +16,21 @@ package com.android.server.pm; -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.annotation.UserIdInt; import android.content.ComponentName; -import android.content.Intent; -import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; -import android.content.pm.ComponentInfo; -import android.content.pm.InstallSourceInfo; -import android.content.pm.InstrumentationInfo; -import android.content.pm.KeySet; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.ParceledListSlice; -import android.content.pm.ProcessInfo; -import android.content.pm.ProviderInfo; -import android.content.pm.ResolveInfo; -import android.content.pm.ServiceInfo; -import android.content.pm.SharedLibraryInfo; -import android.content.pm.SigningDetails; -import android.content.pm.VersionedPackage; -import android.util.ArrayMap; -import android.util.ArraySet; -import android.util.Pair; -import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; -import com.android.server.pm.parsing.pkg.AndroidPackage; -import com.android.server.pm.pkg.PackageState; -import com.android.server.pm.pkg.PackageStateInternal; -import com.android.server.pm.pkg.SharedUserApi; -import com.android.server.pm.resolution.ComponentResolverApi; -import com.android.server.utils.WatchedArrayMap; -import com.android.server.utils.WatchedLongSparseArray; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; /** * This subclass is the external interface to the live computer. Some internal helper - * methods are overridden to fetch live data instead of snapshot data. For each - * Computer interface that is overridden in this class, the override takes the PM lock - * and then delegates to the live computer engine. This is required because there are - * no locks taken in the engine itself. + * methods are overridden to fetch live data instead of snapshot data. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public final class ComputerLocked extends ComputerEngine { - private final Object mLock; ComputerLocked(PackageManagerService.Snapshot args) { super(args); - mLock = mService.mLock; } protected ComponentName resolveComponentName() { @@ -83,814 +42,4 @@ public final class ComputerLocked extends ComputerEngine { protected ApplicationInfo androidApplication() { return mService.getCoreAndroidApplication(); } - - public @NonNull List queryIntentServicesInternalBody(Intent intent, - String resolvedType, int flags, int userId, int callingUid, - String instantAppPkgName) { - synchronized (mLock) { - return super.queryIntentServicesInternalBody(intent, resolvedType, flags, userId, - callingUid, instantAppPkgName); - } - } - public @NonNull QueryIntentActivitiesResult queryIntentActivitiesInternalBody( - Intent intent, String resolvedType, long flags, int filterCallingUid, int userId, - boolean resolveForStart, boolean allowDynamicSplits, String pkgName, - String instantAppPkgName) { - synchronized (mLock) { - return super.queryIntentActivitiesInternalBody(intent, resolvedType, flags, - filterCallingUid, userId, resolveForStart, allowDynamicSplits, pkgName, - instantAppPkgName); - } - } - public ActivityInfo getActivityInfoInternalBody(ComponentName component, int flags, - int filterCallingUid, int userId) { - synchronized (mLock) { - return super.getActivityInfoInternalBody(component, flags, filterCallingUid, - userId); - } - } - public AndroidPackage getPackage(String packageName) { - synchronized (mLock) { - return super.getPackage(packageName); - } - } - public AndroidPackage getPackage(int uid) { - synchronized (mLock) { - return super.getPackage(uid); - } - } - public ApplicationInfo getApplicationInfoInternalBody(String packageName, int flags, - int filterCallingUid, int userId) { - synchronized (mLock) { - return super.getApplicationInfoInternalBody(packageName, flags, filterCallingUid, - userId); - } - } - public ArrayList filterCandidatesWithDomainPreferredActivitiesLPrBody( - Intent intent, int matchFlags, List candidates, - CrossProfileDomainInfo xpDomainInfo, int userId, boolean debug) { - synchronized (mLock) { - return super.filterCandidatesWithDomainPreferredActivitiesLPrBody(intent, - matchFlags, candidates, xpDomainInfo, userId, debug); - } - } - public PackageInfo getPackageInfoInternalBody(String packageName, long versionCode, - int flags, int filterCallingUid, int userId) { - synchronized (mLock) { - return super.getPackageInfoInternalBody(packageName, versionCode, flags, - filterCallingUid, userId); - } - } - - @Override - public String[] getAllAvailablePackageNames() { - synchronized (mLock) { - return super.getAllAvailablePackageNames(); - } - } - - public PackageStateInternal getPackageStateInternal(String packageName, int callingUid) { - synchronized (mLock) { - return super.getPackageStateInternal(packageName, callingUid); - } - } - - @Nullable - public PackageState getPackageStateCopied(@NonNull String packageName) { - synchronized (mLock) { - return super.getPackageStateCopied(packageName); - } - } - - public ParceledListSlice getInstalledPackagesBody(int flags, int userId, - int callingUid) { - synchronized (mLock) { - return super.getInstalledPackagesBody(flags, userId, callingUid); - } - } - public ServiceInfo getServiceInfoBody(ComponentName component, int flags, int userId, - int callingUid) { - synchronized (mLock) { - return super.getServiceInfoBody(component, flags, userId, callingUid); - } - } - public String getInstantAppPackageName(int callingUid) { - synchronized (mLock) { - return super.getInstantAppPackageName(callingUid); - } - } - public String[] getPackagesForUidInternalBody(int callingUid, int userId, int appId, - boolean isCallerInstantApp) { - synchronized (mLock) { - return super.getPackagesForUidInternalBody(callingUid, userId, appId, - isCallerInstantApp); - } - } - public boolean isInstantAppInternalBody(String packageName, @UserIdInt int userId, - int callingUid) { - synchronized (mLock) { - return super.isInstantAppInternalBody(packageName, userId, callingUid); - } - } - public boolean isInstantAppResolutionAllowedBody(Intent intent, - List resolvedActivities, int userId, boolean skipPackageCheck, - int flags) { - synchronized (mLock) { - return super.isInstantAppResolutionAllowedBody(intent, resolvedActivities, userId, - skipPackageCheck, flags); - } - } - public int getPackageUidInternal(String packageName, int flags, int userId, - int callingUid) { - synchronized (mLock) { - return super.getPackageUidInternal(packageName, flags, userId, callingUid); - } - } - public SigningDetails getSigningDetails(@NonNull String packageName) { - synchronized (mLock) { - return super.getSigningDetails(packageName); - } - } - public SigningDetails getSigningDetails(int uid) { - synchronized (mLock) { - return super.getSigningDetails(uid); - } - } - public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) { - synchronized (mLock) { - return super.filterAppAccess(pkg, callingUid, userId); - } - } - public boolean filterAppAccess(String packageName, int callingUid, int userId) { - synchronized (mLock) { - return super.filterAppAccess(packageName, callingUid, userId); - } - } - public boolean filterAppAccess(int uid, int callingUid) { - synchronized (mLock) { - return super.filterAppAccess(uid, callingUid); - } - } - public void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) { - synchronized (mLock) { - super.dump(type, fd, pw, dumpState); - } - } - public PackageManagerService.FindPreferredActivityBodyResult findPreferredActivityBody( - Intent intent, String resolvedType, int flags, List query, boolean always, - boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered, - int callingUid, boolean isDeviceProvisioned) { - synchronized (mLock) { - return super.findPreferredActivityBody(intent, resolvedType, flags, query, always, - removeMatches, debug, userId, queryMayBeFiltered, callingUid, - isDeviceProvisioned); - } - } - - @Override - public PreferredIntentResolver getPreferredActivities(int userId) { - synchronized (mLock) { - return super.getPreferredActivities(userId); - } - } - - @NonNull - @Override - public ArrayMap getPackageStates() { - synchronized (mLock) { - return super.getPackageStates(); - } - } - - @Nullable - @Override - public String getRenamedPackage(@NonNull String packageName) { - synchronized (mLock) { - return super.getRenamedPackage(packageName); - } - } - - @NonNull - @Override - public ArraySet getNotifyPackagesForReplacedReceived(@NonNull String[] packages) { - synchronized (mLock) { - return super.getNotifyPackagesForReplacedReceived(packages); - } - } - - @Override - public int getPackageStartability(boolean safeMode, @NonNull String packageName, int callingUid, - @UserIdInt int userId) { - synchronized (mLock) { - return super.getPackageStartability(safeMode, packageName, callingUid, userId); - } - } - - @Override - public boolean isPackageAvailable(String packageName, @UserIdInt int userId) { - synchronized (mLock) { - return super.isPackageAvailable(packageName, userId); - } - } - - @Override - public String[] currentToCanonicalPackageNames(String[] names) { - synchronized (mLock) { - return super.currentToCanonicalPackageNames(names); - } - } - - @Override - public String[] canonicalToCurrentPackageNames(String[] names) { - synchronized (mLock) { - return super.canonicalToCurrentPackageNames(names); - } - } - - @Override - public int[] getPackageGids(@NonNull String packageName, - @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { - synchronized (mLock) { - return super.getPackageGids(packageName, flags, userId); - } - } - - @Override - public int getTargetSdkVersion(@NonNull String packageName) { - synchronized (mLock) { - return super.getTargetSdkVersion(packageName); - } - } - - @Override - public boolean activitySupportsIntent(@NonNull ComponentName resolveComponentName, - @NonNull ComponentName component, @NonNull Intent intent, String resolvedType) { - synchronized (mLock) { - return super.activitySupportsIntent(resolveComponentName, component, intent, - resolvedType); - } - } - - @Nullable - @Override - public ActivityInfo getReceiverInfo(@NonNull ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { - synchronized (mLock) { - return super.getReceiverInfo(component, flags, userId); - } - } - - @Nullable - @Override - public ParceledListSlice getSharedLibraries(@NonNull String packageName, - @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { - synchronized (mLock) { - return super.getSharedLibraries(packageName, flags, userId); - } - } - - @Override - public boolean canRequestPackageInstalls(@NonNull String packageName, int callingUid, - @UserIdInt int userId, boolean throwIfPermNotDeclared) { - synchronized (mLock) { - return super.canRequestPackageInstalls(packageName, callingUid, userId, - throwIfPermNotDeclared); - } - } - - @Override - public List getPackagesUsingSharedLibrary(@NonNull SharedLibraryInfo libInfo, - @PackageManager.PackageInfoFlagsBits long flags, int callingUid, - @UserIdInt int userId) { - synchronized (mLock) { - return super.getPackagesUsingSharedLibrary(libInfo, flags, callingUid, userId); - } - } - - @Nullable - @Override - public ParceledListSlice getDeclaredSharedLibraries( - @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, - @UserIdInt int userId) { - synchronized (mLock) { - return super.getDeclaredSharedLibraries(packageName, flags, userId); - } - } - - @Nullable - @Override - public ProviderInfo getProviderInfo(@NonNull ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { - synchronized (mLock) { - return super.getProviderInfo(component, flags, userId); - } - } - - @Nullable - @Override - public String[] getSystemSharedLibraryNames() { - synchronized (mLock) { - return super.getSystemSharedLibraryNames(); - } - } - - @Override - public int checkSignatures(@NonNull String pkg1, - @NonNull String pkg2) { - synchronized (mLock) { - return super.checkSignatures(pkg1, pkg2); - } - } - - @Override - public int checkUidSignatures(int uid1, int uid2) { - synchronized (mLock) { - return super.checkUidSignatures(uid1, uid2); - } - } - - @Override - public boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate, - int type) { - synchronized (mLock) { - return super.hasSigningCertificate(packageName, certificate, type); - } - } - - @Override - public boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate, int type) { - synchronized (mLock) { - return super.hasUidSigningCertificate(uid, certificate, type); - } - } - - @Override - public List getAllPackages() { - synchronized (mLock) { - return super.getAllPackages(); - } - } - - @Nullable - @Override - public String getNameForUid(int uid) { - synchronized (mLock) { - return super.getNameForUid(uid); - } - } - - @Nullable - @Override - public String[] getNamesForUids(int[] uids) { - synchronized (mLock) { - return super.getNamesForUids(uids); - } - } - - @Override - public int getUidForSharedUser(@NonNull String sharedUserName) { - synchronized (mLock) { - return super.getUidForSharedUser(sharedUserName); - } - } - - @Override - public int getFlagsForUid(int uid) { - synchronized (mLock) { - return super.getFlagsForUid(uid); - } - } - - @Override - public int getPrivateFlagsForUid(int uid) { - synchronized (mLock) { - return super.getPrivateFlagsForUid(uid); - } - } - - @Override - public boolean isUidPrivileged(int uid) { - synchronized (mLock) { - return super.isUidPrivileged(uid); - } - } - - @NonNull - @Override - public String[] getAppOpPermissionPackages(@NonNull String permissionName) { - synchronized (mLock) { - return super.getAppOpPermissionPackages(permissionName); - } - } - - @NonNull - @Override - public ParceledListSlice getPackagesHoldingPermissions( - @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags, - @UserIdInt int userId) { - synchronized (mLock) { - return super.getPackagesHoldingPermissions(permissions, flags, userId); - } - } - - @NonNull - @Override - public List getInstalledApplications( - @PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId, - int callingUid) { - synchronized (mLock) { - return super.getInstalledApplications(flags, userId, callingUid); - } - } - - @Nullable - @Override - public ProviderInfo resolveContentProvider(@NonNull String name, - @PackageManager.ResolveInfoFlagsBits long flags, @UserIdInt int userId, - int callingUid) { - synchronized (mLock) { - return super.resolveContentProvider(name, flags, userId, callingUid); - } - } - - @Nullable - @Override - public ProviderInfo getGrantImplicitAccessProviderInfo(int recipientUid, - @NonNull String visibleAuthority) { - synchronized (mLock) { - return super.getGrantImplicitAccessProviderInfo(recipientUid, visibleAuthority); - } - } - - @Override - public void querySyncProviders(boolean safeMode, @NonNull List outNames, - @NonNull List outInfo) { - synchronized (mLock) { - super.querySyncProviders(safeMode, outNames, outInfo); - } - } - - @NonNull - @Override - public ParceledListSlice queryContentProviders(@Nullable String processName, - int uid, @PackageManager.ComponentInfoFlagsBits long flags, - @Nullable String metaDataKey) { - synchronized (mLock) { - return super.queryContentProviders(processName, uid, flags, metaDataKey); - } - } - - @Nullable - @Override - public InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags) { - synchronized (mLock) { - return super.getInstrumentationInfo(component, flags); - } - } - - @NonNull - @Override - public ParceledListSlice queryInstrumentation( - @NonNull String targetPackage, int flags) { - synchronized (mLock) { - return super.queryInstrumentation(targetPackage, flags); - } - } - - @NonNull - @Override - public List findSharedNonSystemLibraries( - @NonNull PackageStateInternal pkgSetting) { - synchronized (mLock) { - return super.findSharedNonSystemLibraries(pkgSetting); - } - } - - @Override - public boolean getApplicationHiddenSettingAsUser(@NonNull String packageName, - @UserIdInt int userId) { - synchronized (mLock) { - return super.getApplicationHiddenSettingAsUser(packageName, userId); - } - } - - @Override - public boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId) { - synchronized (mLock) { - return super.isPackageSuspendedForUser(packageName, userId); - } - } - - @Override - public boolean isSuspendingAnyPackages(@NonNull String suspendingPackage, - @UserIdInt int userId) { - synchronized (mLock) { - return super.isSuspendingAnyPackages(suspendingPackage, userId); - } - } - - @NonNull - @Override - public ParceledListSlice getAllIntentFilters(@NonNull String packageName) { - synchronized (mLock) { - return super.getAllIntentFilters(packageName); - } - } - - @Override - public boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId) { - synchronized (mLock) { - return super.getBlockUninstallForUser(packageName, userId); - } - } - - @Nullable - @Override - public SparseArray getBroadcastAllowList(@NonNull String packageName, - @UserIdInt int[] userIds, boolean isInstantApp) { - synchronized (mLock) { - return super.getBroadcastAllowList(packageName, userIds, isInstantApp); - } - } - - @Nullable - @Override - public String getInstallerPackageName(@NonNull String packageName) { - synchronized (mLock) { - return super.getInstallerPackageName(packageName); - } - } - - @Nullable - @Override - public InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) { - synchronized (mLock) { - return super.getInstallSourceInfo(packageName); - } - } - - @Override - public int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId) { - synchronized (mLock) { - return super.getApplicationEnabledSetting(packageName, userId); - } - } - - @Override - public int getComponentEnabledSetting(@NonNull ComponentName component, int callingUid, - @UserIdInt int userId) { - synchronized (mLock) { - return super.getComponentEnabledSetting(component, callingUid, userId); - } - } - - @Override - public int getComponentEnabledSettingInternal(@NonNull ComponentName component, int callingUid, - @UserIdInt int userId) { - synchronized (mLock) { - return super.getComponentEnabledSettingInternal(component, callingUid, userId); - } - } - - @Override - public boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo, - @UserIdInt int userId) { - synchronized (mLock) { - return super.isComponentEffectivelyEnabled(componentInfo, userId); - } - } - - @Nullable - @Override - public KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) { - synchronized (mLock) { - return super.getKeySetByAlias(packageName, alias); - } - } - - @Nullable - @Override - public KeySet getSigningKeySet(@NonNull String packageName) { - synchronized (mLock) { - return super.getSigningKeySet(packageName); - } - } - - @Override - public boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) { - synchronized (mLock) { - return super.isPackageSignedByKeySet(packageName, ks); - } - } - - @Override - public boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks) { - synchronized (mLock) { - return super.isPackageSignedByKeySetExactly(packageName, ks); - } - } - - @Nullable - @Override - public int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId) { - synchronized (mLock) { - return super.getVisibilityAllowList(packageName, userId); - } - } - - @Override - public boolean canQueryPackage(int callingUid, @Nullable String targetPackageName) { - synchronized (mLock) { - return super.canQueryPackage(callingUid, targetPackageName); - } - } - - @Override - public int getPackageUid(@NonNull String packageName, - @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { - synchronized (mLock) { - return super.getPackageUid(packageName, flags, userId); - } - } - - @Override - public boolean canAccessComponent(int callingUid, @NonNull ComponentName component, - @UserIdInt int userId) { - synchronized (mLock) { - return super.canAccessComponent(callingUid, component, userId); - } - } - - @Override - public boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) { - synchronized (mLock) { - return super.isCallerInstallerOfRecord(pkg, callingUid); - } - } - - @Override - public int getInstallReason(@NonNull String packageName, @UserIdInt int userId) { - synchronized (mLock) { - return super.getInstallReason(packageName, userId); - } - } - - @Override - public boolean canPackageQuery(@NonNull String sourcePackageName, - @NonNull String targetPackageName, @UserIdInt int userId) { - synchronized (mLock) { - return super.canPackageQuery(sourcePackageName, targetPackageName, userId); - } - } - - @Override - public boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType, - @UserIdInt int sourceUserId, @UserIdInt int targetUserId) { - synchronized (mLock) { - return super.canForwardTo(intent, resolvedType, sourceUserId, targetUserId); - } - } - - @NonNull - @Override - public List getPersistentApplications(boolean safeMode, int flags) { - synchronized (mLock) { - return super.getPersistentApplications(safeMode, flags); - } - } - - @NonNull - @Override - public SparseArray getAppsWithSharedUserIds() { - synchronized (mLock) { - return super.getAppsWithSharedUserIds(); - } - } - - @NonNull - @Override - public String[] getSharedUserPackagesForPackage(@NonNull String packageName, - @UserIdInt int userId) { - synchronized (mLock) { - return super.getSharedUserPackagesForPackage(packageName, userId); - } - } - - @NonNull - @Override - public Set getUnusedPackages(long downgradeTimeThresholdMillis) { - synchronized (mLock) { - return super.getUnusedPackages(downgradeTimeThresholdMillis); - } - } - - @Nullable - @Override - public CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId) { - synchronized (mLock) { - return super.getHarmfulAppWarning(packageName, userId); - } - } - - @NonNull - @Override - public String[] filterOnlySystemPackages(@Nullable String... pkgNames) { - synchronized (mLock) { - return super.filterOnlySystemPackages(pkgNames); - } - } - - @NonNull - @Override - public List getPackagesForAppId(int appId) { - synchronized (mLock) { - return super.getPackagesForAppId(appId); - } - } - - @Override - public int getUidTargetSdkVersion(int uid) { - synchronized (mLock) { - return super.getUidTargetSdkVersion(uid); - } - } - - @Nullable - @Override - public ArrayMap getProcessesForUid(int uid) { - synchronized (mLock) { - return super.getProcessesForUid(uid); - } - } - - @Override - public PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid, - @UserIdInt int userId) { - synchronized (mLock) { - return super.getPackageStateFiltered(packageName, callingUid, userId); - } - } - - @Override - public boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName) { - synchronized (mLock) { - return super.getBlockUninstall(userId, packageName); - } - } - - @NonNull - @Override - public WatchedArrayMap> getSharedLibraries() { - synchronized (mLock) { - return super.getSharedLibraries(); - } - } - - @Nullable - @Override - public Pair getPackageOrSharedUser(int appId) { - synchronized (mLock) { - return super.getPackageOrSharedUser(appId); - } - } - - @Nullable - @Override - public SharedUserApi getSharedUser(int sharedUserAppId) { - synchronized (mLock) { - return super.getSharedUser(sharedUserAppId); - } - } - - @NonNull - @Override - public ArraySet getSharedUserPackages(int sharedUserAppId) { - synchronized (mLock) { - return super.getSharedUserPackages(sharedUserAppId); - } - } - - @NonNull - @Override - public ComponentResolverApi getComponentResolver() { - synchronized (mLock) { - return super.getComponentResolver(); - } - } - - @Nullable - @Override - public PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) { - synchronized (mLock) { - return super.getDisabledSystemPackage(packageName); - } - } - - @Nullable - @Override - public ResolveInfo getInstantAppInstallerInfo() { - synchronized (mLock) { - return super.getInstantAppInstallerInfo(); - } - } } diff --git a/services/core/java/com/android/server/pm/ComputerTracker.java b/services/core/java/com/android/server/pm/ComputerTracker.java deleted file mode 100644 index 216ad71b4d5d..000000000000 --- a/services/core/java/com/android/server/pm/ComputerTracker.java +++ /dev/null @@ -1,1327 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.pm; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.annotation.UserIdInt; -import android.content.ComponentName; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.ActivityInfo; -import android.content.pm.ApplicationInfo; -import android.content.pm.ComponentInfo; -import android.content.pm.InstallSourceInfo; -import android.content.pm.InstrumentationInfo; -import android.content.pm.KeySet; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManagerInternal; -import android.content.pm.ParceledListSlice; -import android.content.pm.ProcessInfo; -import android.content.pm.ProviderInfo; -import android.content.pm.ResolveInfo; -import android.content.pm.ServiceInfo; -import android.content.pm.SharedLibraryInfo; -import android.content.pm.SigningDetails; -import android.content.pm.UserInfo; -import android.content.pm.VersionedPackage; -import android.util.ArrayMap; -import android.util.ArraySet; -import android.util.Pair; -import android.util.SparseArray; - -import com.android.server.pm.parsing.pkg.AndroidPackage; -import com.android.server.pm.pkg.PackageState; -import com.android.server.pm.pkg.PackageStateInternal; -import com.android.server.pm.pkg.SharedUserApi; -import com.android.server.pm.resolution.ComponentResolverApi; -import com.android.server.utils.WatchedArrayMap; -import com.android.server.utils.WatchedLongSparseArray; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.List; -import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * This subclass delegates to methods in a Computer after reference-counting the computer. - */ -public final class ComputerTracker implements Computer { - - // The number of times a thread reused a computer in its stack instead of fetching - // a snapshot computer. - private final AtomicInteger mReusedSnapshot = new AtomicInteger(0); - - private final PackageManagerService mService; - ComputerTracker(PackageManagerService s) { - mService = s; - } - - private ThreadComputer snapshot() { - ThreadComputer current = PackageManagerService.sThreadComputer.get(); - if (current.mRefCount > 0) { - current.acquire(); - mReusedSnapshot.incrementAndGet(); - } else { - current.acquire(mService.snapshotComputer()); - } - return current; - } - - public @NonNull List queryIntentActivitiesInternal(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, - @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags, - int filterCallingUid, int userId, boolean resolveForStart, - boolean allowDynamicSplits) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.queryIntentActivitiesInternal(intent, resolvedType, flags, - privateResolveFlags, filterCallingUid, userId, resolveForStart, - allowDynamicSplits); - } finally { - current.release(); - } - } - public @NonNull List queryIntentActivitiesInternal(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.queryIntentActivitiesInternal(intent, resolvedType, flags, - userId); - } finally { - current.release(); - } - } - public @NonNull List queryIntentServicesInternal(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId, - int callingUid, boolean includeInstantApps) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.queryIntentServicesInternal(intent, resolvedType, flags, - userId, callingUid, includeInstantApps); - } finally { - current.release(); - } - } - public @NonNull QueryIntentActivitiesResult queryIntentActivitiesInternalBody( - Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, - int filterCallingUid, int userId, boolean resolveForStart, boolean allowDynamicSplits, - String pkgName, String instantAppPkgName) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.queryIntentActivitiesInternalBody(intent, resolvedType, - flags, filterCallingUid, userId, resolveForStart, allowDynamicSplits, - pkgName, instantAppPkgName); - } finally { - current.release(); - } - } - public ActivityInfo getActivityInfo(ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getActivityInfo(component, flags, userId); - } finally { - current.release(); - } - } - public ActivityInfo getActivityInfoInternal(ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, - int filterCallingUid, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getActivityInfoInternal(component, flags, filterCallingUid, - userId); - } finally { - current.release(); - } - } - public AndroidPackage getPackage(String packageName) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getPackage(packageName); - } finally { - current.release(); - } - } - public AndroidPackage getPackage(int uid) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getPackage(uid); - } finally { - current.release(); - } - } - public ApplicationInfo generateApplicationInfoFromSettings(String packageName, - long flags, int filterCallingUid, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.generateApplicationInfoFromSettings(packageName, flags, - filterCallingUid, userId); - } finally { - current.release(); - } - } - public ApplicationInfo getApplicationInfo(String packageName, - @PackageManager.ApplicationInfoFlagsBits long flags, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getApplicationInfo(packageName, flags, userId); - } finally { - current.release(); - } - } - public ApplicationInfo getApplicationInfoInternal(String packageName, - @PackageManager.ApplicationInfoFlagsBits long flags, int filterCallingUid, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getApplicationInfoInternal(packageName, flags, - filterCallingUid, userId); - } finally { - current.release(); - } - } - public ComponentName getDefaultHomeActivity(int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getDefaultHomeActivity(userId); - } finally { - current.release(); - } - } - public ComponentName getHomeActivitiesAsUser(List allHomeCandidates, - int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getHomeActivitiesAsUser(allHomeCandidates, userId); - } finally { - current.release(); - } - } - public CrossProfileDomainInfo getCrossProfileDomainPreferredLpr(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int sourceUserId, - int parentUserId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getCrossProfileDomainPreferredLpr(intent, resolvedType, - flags, sourceUserId, parentUserId); - } finally { - current.release(); - } - } - public Intent getHomeIntent() { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getHomeIntent(); - } finally { - current.release(); - } - } - public List getMatchingCrossProfileIntentFilters( - Intent intent, String resolvedType, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getMatchingCrossProfileIntentFilters(intent, resolvedType, - userId); - } finally { - current.release(); - } - } - public List applyPostResolutionFilter( - @NonNull List resolveInfos, - String ephemeralPkgName, boolean allowDynamicSplits, int filterCallingUid, - boolean resolveForStart, int userId, Intent intent) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.applyPostResolutionFilter(resolveInfos, ephemeralPkgName, - allowDynamicSplits, filterCallingUid, resolveForStart, userId, intent); - } finally { - current.release(); - } - } - public PackageInfo generatePackageInfo(PackageStateInternal ps, - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.generatePackageInfo(ps, flags, userId); - } finally { - current.release(); - } - } - public PackageInfo getPackageInfo(String packageName, - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getPackageInfo(packageName, flags, userId); - } finally { - current.release(); - } - } - public PackageInfo getPackageInfoInternal(String packageName, long versionCode, - long flags, int filterCallingUid, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getPackageInfoInternal(packageName, versionCode, flags, - filterCallingUid, userId); - } finally { - current.release(); - } - } - public PackageStateInternal getPackageStateInternal(String packageName) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getPackageStateInternal(packageName); - } finally { - current.release(); - } - } - public PackageStateInternal getPackageStateInternal(String packageName, int callingUid) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getPackageStateInternal(packageName, callingUid); - } finally { - current.release(); - } - } - - @Nullable - public PackageState getPackageStateCopied(@NonNull String packageName) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getPackageStateCopied(packageName); - } finally { - current.release(); - } - } - - public ParceledListSlice getInstalledPackages(long flags, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getInstalledPackages(flags, userId); - } finally { - current.release(); - } - } - public ResolveInfo createForwardingResolveInfoUnchecked(WatchedIntentFilter filter, - int sourceUserId, int targetUserId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.createForwardingResolveInfoUnchecked(filter, sourceUserId, - targetUserId); - } finally { - current.release(); - } - } - public ServiceInfo getServiceInfo(ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getServiceInfo(component, flags, userId); - } finally { - current.release(); - } - } - public SharedLibraryInfo getSharedLibraryInfo(String name, long version) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getSharedLibraryInfo(name, version); - } finally { - current.release(); - } - } - public SigningDetails getSigningDetails(@NonNull String packageName) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getSigningDetails(packageName); - } finally { - current.release(); - } - } - public SigningDetails getSigningDetails(int uid) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getSigningDetails(uid); - } finally { - current.release(); - } - } - public String getInstantAppPackageName(int callingUid) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getInstantAppPackageName(callingUid); - } finally { - current.release(); - } - } - public String resolveExternalPackageName(AndroidPackage pkg) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.resolveExternalPackageName(pkg); - } finally { - current.release(); - } - } - public String resolveInternalPackageName(String packageName, long versionCode) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.resolveInternalPackageName(packageName, versionCode); - } finally { - current.release(); - } - } - public String[] getPackagesForUid(int uid) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getPackagesForUid(uid); - } finally { - current.release(); - } - } - public UserInfo getProfileParent(int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getProfileParent(userId); - } finally { - current.release(); - } - } - public boolean canViewInstantApps(int callingUid, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.canViewInstantApps(callingUid, userId); - } finally { - current.release(); - } - } - public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.filterAppAccess(pkg, callingUid, userId); - } finally { - current.release(); - } - } - public boolean filterAppAccess(String packageName, int callingUid, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.filterAppAccess(packageName, callingUid, userId); - } finally { - current.release(); - } - } - public boolean filterAppAccess(int uid, int callingUid) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.filterAppAccess(uid, callingUid); - } finally { - current.release(); - } - } - public boolean filterSharedLibPackage(@Nullable PackageStateInternal ps, int uid, - int userId, @PackageManager.ComponentInfoFlagsBits long flags) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.filterSharedLibPackage(ps, uid, userId, flags); - } finally { - current.release(); - } - } - public boolean isCallerSameApp(String packageName, int uid) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.isCallerSameApp(packageName, uid); - } finally { - current.release(); - } - } - public boolean isComponentVisibleToInstantApp(@Nullable ComponentName component) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.isComponentVisibleToInstantApp(component); - } finally { - current.release(); - } - } - public boolean isComponentVisibleToInstantApp(@Nullable ComponentName component, - @PackageManager.ComponentType int type) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.isComponentVisibleToInstantApp(component, type); - } finally { - current.release(); - } - } - public boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent, - int userId, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, - userId, resolvedType, flags); - } finally { - current.release(); - } - } - public boolean isInstantApp(String packageName, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.isInstantApp(packageName, userId); - } finally { - current.release(); - } - } - public boolean isInstantAppInternal(String packageName, @UserIdInt int userId, - int callingUid) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.isInstantAppInternal(packageName, userId, callingUid); - } finally { - current.release(); - } - } - public boolean isSameProfileGroup(@UserIdInt int callerUserId, - @UserIdInt int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.isSameProfileGroup(callerUserId, userId); - } finally { - current.release(); - } - } - public boolean shouldFilterApplication(@NonNull SharedUserSetting sus, - int callingUid, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.shouldFilterApplication(sus, callingUid, userId); - } finally { - current.release(); - } - } - public boolean shouldFilterApplication(@Nullable PackageStateInternal ps, - int callingUid, @Nullable ComponentName component, - @PackageManager.ComponentType int componentType, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.shouldFilterApplication(ps, callingUid, component, - componentType, userId); - } finally { - current.release(); - } - } - public boolean shouldFilterApplication(@Nullable PackageStateInternal ps, - int callingUid, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.shouldFilterApplication(ps, callingUid, userId); - } finally { - current.release(); - } - } - public int checkUidPermission(String permName, int uid) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.checkUidPermission(permName, uid); - } finally { - current.release(); - } - } - public int getPackageUidInternal(String packageName, - @PackageManager.PackageInfoFlagsBits long flags, int userId, int callingUid) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.getPackageUidInternal(packageName, flags, userId, - callingUid); - } finally { - current.release(); - } - } - public long updateFlagsForApplication(long flags, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.updateFlagsForApplication(flags, userId); - } finally { - current.release(); - } - } - public long updateFlagsForComponent(long flags, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.updateFlagsForComponent(flags, userId); - } finally { - current.release(); - } - } - public long updateFlagsForPackage(long flags, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.updateFlagsForPackage(flags, userId); - } finally { - current.release(); - } - } - public long updateFlagsForResolve(long flags, int userId, int callingUid, - boolean wantInstantApps, boolean isImplicitImageCaptureIntentAndNotSetByDpc) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.updateFlagsForResolve(flags, userId, callingUid, - wantInstantApps, isImplicitImageCaptureIntentAndNotSetByDpc); - } finally { - current.release(); - } - } - public long updateFlagsForResolve(long flags, int userId, int callingUid, - boolean wantInstantApps, boolean onlyExposedExplicitly, - boolean isImplicitImageCaptureIntentAndNotSetByDpc) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.updateFlagsForResolve(flags, userId, callingUid, - wantInstantApps, onlyExposedExplicitly, - isImplicitImageCaptureIntentAndNotSetByDpc); - } finally { - current.release(); - } - } - public void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) { - ThreadComputer current = snapshot(); - try { - current.mComputer.dump(type, fd, pw, dumpState); - } finally { - current.release(); - } - } - public void enforceCrossUserOrProfilePermission(int callingUid, @UserIdInt int userId, - boolean requireFullPermission, boolean checkShell, String message) { - ThreadComputer current = snapshot(); - try { - current.mComputer.enforceCrossUserOrProfilePermission(callingUid, userId, - requireFullPermission, checkShell, message); - } finally { - current.release(); - } - } - public void enforceCrossUserPermission(int callingUid, @UserIdInt int userId, - boolean requireFullPermission, boolean checkShell, String message) { - ThreadComputer current = snapshot(); - try { - current.mComputer.enforceCrossUserPermission(callingUid, userId, - requireFullPermission, checkShell, message); - } finally { - current.release(); - } - } - public void enforceCrossUserPermission(int callingUid, @UserIdInt int userId, - boolean requireFullPermission, boolean checkShell, - boolean requirePermissionWhenSameUser, String message) { - ThreadComputer current = snapshot(); - try { - current.mComputer.enforceCrossUserPermission(callingUid, userId, - requireFullPermission, checkShell, requirePermissionWhenSameUser, message); - } finally { - current.release(); - } - } - public PackageManagerService.FindPreferredActivityBodyResult findPreferredActivityInternal( - Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, - List query, boolean always, boolean removeMatches, boolean debug, - int userId, boolean queryMayBeFiltered) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.findPreferredActivityInternal(intent, resolvedType, flags, - query, always, removeMatches, debug, userId, queryMayBeFiltered); - } finally { - current.release(); - } - } - public ResolveInfo findPersistentPreferredActivityLP(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, - List query, boolean debug, int userId) { - ThreadComputer current = snapshot(); - try { - return current.mComputer.findPersistentPreferredActivityLP(intent, resolvedType, - flags, query, debug, userId); - } finally { - current.release(); - } - } - - @Override - public String[] getAllAvailablePackageNames() { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getAllAvailablePackageNames(); - } - } - - @Override - public PreferredIntentResolver getPreferredActivities(int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getPreferredActivities(userId); - } - } - - @NonNull - @Override - public ArrayMap getPackageStates() { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getPackageStates(); - } - } - - @Nullable - @Override - public String getRenamedPackage(@NonNull String packageName) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getRenamedPackage(packageName); - } - } - - @NonNull - @Override - public ArraySet getNotifyPackagesForReplacedReceived(@NonNull String[] packages) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getNotifyPackagesForReplacedReceived(packages); - } - } - - @Override - public int getPackageStartability(boolean safeMode, @NonNull String packageName, int callingUid, - @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getPackageStartability(safeMode, packageName, callingUid, - userId); - } - } - - @Override - public boolean isPackageAvailable(String packageName, @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.isPackageAvailable(packageName, userId); - } - } - - @Override - public String[] currentToCanonicalPackageNames(String[] names) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.currentToCanonicalPackageNames(names); - } - } - - @Override - public String[] canonicalToCurrentPackageNames(String[] names) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.canonicalToCurrentPackageNames(names); - } - } - - @Override - public int[] getPackageGids(@NonNull String packageName, - @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getPackageGids(packageName, flags, userId); - } - } - - @Override - public int getTargetSdkVersion(@NonNull String packageName) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getTargetSdkVersion(packageName); - } - } - - @Override - public boolean activitySupportsIntent(@NonNull ComponentName resolveComponentName, - @NonNull ComponentName component, @NonNull Intent intent, String resolvedType) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.activitySupportsIntent(resolveComponentName, component, intent, - resolvedType); - } - } - - @Nullable - @Override - public ActivityInfo getReceiverInfo(@NonNull ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getReceiverInfo(component, flags, userId); - } - } - - @Nullable - @Override - public ParceledListSlice getSharedLibraries(@NonNull String packageName, - @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getSharedLibraries(packageName, flags, userId); - } - } - - @Override - public boolean canRequestPackageInstalls(@NonNull String packageName, int callingUid, - @UserIdInt int userId, boolean throwIfPermNotDeclared) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.canRequestPackageInstalls(packageName, callingUid, userId, - throwIfPermNotDeclared); - } - } - - @Override - public boolean isInstallDisabledForPackage(@NonNull String packageName, int uid, - @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.isInstallDisabledForPackage(packageName, uid, userId); - } - } - - @Override - public List getPackagesUsingSharedLibrary(@NonNull SharedLibraryInfo libInfo, - @PackageManager.PackageInfoFlagsBits long flags, int callingUid, - @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getPackagesUsingSharedLibrary(libInfo, flags, callingUid, - userId); - } - } - - @Nullable - @Override - public ParceledListSlice getDeclaredSharedLibraries( - @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, - @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getDeclaredSharedLibraries(packageName, flags, userId); - } - } - - @Nullable - @Override - public ProviderInfo getProviderInfo(@NonNull ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getProviderInfo(component, flags, userId); - } - } - - @Nullable - @Override - public String[] getSystemSharedLibraryNames() { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getSystemSharedLibraryNames(); - } - } - - @Override - public int checkSignatures(@NonNull String pkg1, - @NonNull String pkg2) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.checkSignatures(pkg1, pkg2); - } - } - - @Override - public int checkUidSignatures(int uid1, int uid2) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.checkUidSignatures(uid1, uid2); - } - } - - @Override - public boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate, - int type) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.hasSigningCertificate(packageName, certificate, type); - } - } - - @Override - public boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate, int type) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.hasUidSigningCertificate(uid, certificate, type); - } - } - - @Override - public List getAllPackages() { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getAllPackages(); - } - } - - @Nullable - @Override - public String getNameForUid(int uid) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getNameForUid(uid); - } - } - - @Nullable - @Override - public String[] getNamesForUids(int[] uids) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getNamesForUids(uids); - } - } - - @Override - public int getUidForSharedUser(@NonNull String sharedUserName) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getUidForSharedUser(sharedUserName); - } - } - - @Override - public int getFlagsForUid(int uid) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getFlagsForUid(uid); - } - } - - @Override - public int getPrivateFlagsForUid(int uid) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getPrivateFlagsForUid(uid); - } - } - - @Override - public boolean isUidPrivileged(int uid) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.isUidPrivileged(uid); - } - } - - @NonNull - @Override - public String[] getAppOpPermissionPackages(@NonNull String permissionName) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getAppOpPermissionPackages(permissionName); - } - } - - @NonNull - @Override - public ParceledListSlice getPackagesHoldingPermissions( - @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags, - @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getPackagesHoldingPermissions(permissions, flags, userId); - } - } - - @NonNull - @Override - public List getInstalledApplications( - @PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId, - int callingUid) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getInstalledApplications(flags, userId, callingUid); - } - } - - @Nullable - @Override - public ProviderInfo resolveContentProvider(@NonNull String name, - @PackageManager.ResolveInfoFlagsBits long flags, @UserIdInt int userId, - int callingUid) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.resolveContentProvider(name, flags, userId, callingUid); - } - } - - @Nullable - @Override - public ProviderInfo getGrantImplicitAccessProviderInfo(int recipientUid, - @NonNull String visibleAuthority) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getGrantImplicitAccessProviderInfo(recipientUid, - visibleAuthority); - } - } - - @Override - public void querySyncProviders(boolean safeMode, @NonNull List outNames, - @NonNull List outInfo) { - try (ThreadComputer current = snapshot()) { - current.mComputer.querySyncProviders(safeMode, outNames, outInfo); - } - } - - @NonNull - @Override - public ParceledListSlice queryContentProviders(@Nullable String processName, - int uid, @PackageManager.ComponentInfoFlagsBits long flags, - @Nullable String metaDataKey) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.queryContentProviders(processName, uid, flags, metaDataKey); - } - } - - @Nullable - @Override - public InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getInstrumentationInfo(component, flags); - } - } - - @NonNull - @Override - public ParceledListSlice queryInstrumentation( - @NonNull String targetPackage, int flags) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.queryInstrumentation(targetPackage, flags); - } - } - - @NonNull - @Override - public List findSharedNonSystemLibraries( - @NonNull PackageStateInternal pkgSetting) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.findSharedNonSystemLibraries(pkgSetting); - } - } - - @Override - public boolean getApplicationHiddenSettingAsUser(@NonNull String packageName, - @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getApplicationHiddenSettingAsUser(packageName, userId); - } - } - - @Override - public boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.isPackageSuspendedForUser(packageName, userId); - } - } - - @Override - public boolean isSuspendingAnyPackages(@NonNull String suspendingPackage, - @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.isSuspendingAnyPackages(suspendingPackage, userId); - } - } - - @NonNull - @Override - public ParceledListSlice getAllIntentFilters(@NonNull String packageName) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getAllIntentFilters(packageName); - } - } - - @Override - public boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getBlockUninstallForUser(packageName, userId); - } - } - - @Nullable - @Override - public SparseArray getBroadcastAllowList(@NonNull String packageName, - @UserIdInt int[] userIds, boolean isInstantApp) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getBroadcastAllowList(packageName, userIds, isInstantApp); - } - } - - @Nullable - @Override - public String getInstallerPackageName(@NonNull String packageName) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getInstallerPackageName(packageName); - } - } - - @Nullable - @Override - public InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getInstallSourceInfo(packageName); - } - } - - @Override - public int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getApplicationEnabledSetting(packageName, userId); - } - } - - @Override - public int getComponentEnabledSetting(@NonNull ComponentName component, int callingUid, - @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getComponentEnabledSetting(component, callingUid, userId); - } - } - - @Override - public int getComponentEnabledSettingInternal(@NonNull ComponentName component, int callingUid, - @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getComponentEnabledSettingInternal( - component, callingUid, userId); - } - } - - @Override - public boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo, - @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.isComponentEffectivelyEnabled(componentInfo, userId); - } - } - - @Nullable - @Override - public KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getKeySetByAlias(packageName, alias); - } - } - - @Nullable - @Override - public KeySet getSigningKeySet(@NonNull String packageName) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getSigningKeySet(packageName); - } - } - - @Override - public boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.isPackageSignedByKeySet(packageName, ks); - } - } - - @Override - public boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.isPackageSignedByKeySetExactly(packageName, ks); - } - } - - @Nullable - @Override - public int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getVisibilityAllowList(packageName, userId); - } - } - - @Override - public boolean canQueryPackage(int callingUid, @Nullable String targetPackageName) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.canQueryPackage(callingUid, targetPackageName); - } - } - - @Override - public int getPackageUid(@NonNull String packageName, - @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getPackageUid(packageName, flags, userId); - } - } - - @Override - public boolean canAccessComponent(int callingUid, @NonNull ComponentName component, - @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.canAccessComponent(callingUid, component, userId); - } - } - - @Override - public boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.isCallerInstallerOfRecord(pkg, callingUid); - } - } - - @Override - public int getInstallReason(@NonNull String packageName, @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getInstallReason(packageName, userId); - } - } - - @Override - public boolean canPackageQuery(@NonNull String sourcePackageName, - @NonNull String targetPackageName, @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.canPackageQuery(sourcePackageName, targetPackageName, userId); - } - } - - @Override - public boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType, - @UserIdInt int sourceUserId, @UserIdInt int targetUserId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.canForwardTo(intent, resolvedType, sourceUserId, targetUserId); - } - } - - @NonNull - @Override - public List getPersistentApplications(boolean safeMode, int flags) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getPersistentApplications(safeMode, flags); - } - } - - @NonNull - @Override - public SparseArray getAppsWithSharedUserIds() { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getAppsWithSharedUserIds(); - } - } - - @NonNull - @Override - public String[] getSharedUserPackagesForPackage(@NonNull String packageName, - @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getSharedUserPackagesForPackage(packageName, userId); - } - } - - @NonNull - @Override - public Set getUnusedPackages(long downgradeTimeThresholdMillis) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getUnusedPackages(downgradeTimeThresholdMillis); - } - } - - @Nullable - @Override - public CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getHarmfulAppWarning(packageName, userId); - } - } - - @NonNull - @Override - public String[] filterOnlySystemPackages(@Nullable String... pkgNames) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.filterOnlySystemPackages(pkgNames); - } - } - - @NonNull - @Override - public List getPackagesForAppId(int appId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getPackagesForAppId(appId); - } - } - - @Override - public int getUidTargetSdkVersion(int uid) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getUidTargetSdkVersion(uid); - } - } - - @Nullable - @Override - public ArrayMap getProcessesForUid(int uid) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getProcessesForUid(uid); - } - } - - @Override - public PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid, - @UserIdInt int userId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getPackageStateFiltered(packageName, callingUid, userId); - } - } - - @Override - public boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getBlockUninstall(userId, packageName); - } - } - - @NonNull - @Override - public WatchedArrayMap> getSharedLibraries() { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getSharedLibraries(); - } - } - - @Nullable - @Override - public Pair getPackageOrSharedUser(int appId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getPackageOrSharedUser(appId); - } - } - - @Nullable - @Override - public SharedUserApi getSharedUser(int sharedUserAppId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getSharedUser(sharedUserAppId); - } - } - - @NonNull - @Override - public ArraySet getSharedUserPackages(int sharedUserAppId) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getSharedUserPackages(sharedUserAppId); - } - } - - @NonNull - @Override - public ComponentResolverApi getComponentResolver() { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getComponentResolver(); - } - } - - @Nullable - @Override - public PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getDisabledSystemPackage(packageName); - } - } - - @Nullable - @Override - public ResolveInfo getInstantAppInstallerInfo() { - try (ThreadComputer current = snapshot()) { - return current.mComputer.getInstantAppInstallerInfo(); - } - } -} diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java index 664c7bb929d7..0e1c1ad4120f 100644 --- a/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -147,6 +147,7 @@ final class DeletePackageHelper { final SparseArray priorUserStates; /** enabled state of the uninstalled application */ synchronized (mPm.mLock) { + final Computer computer = mPm.snapshotComputer(); uninstalledPs = mPm.mSettings.getPackageLPr(packageName); if (uninstalledPs == null) { Slog.w(TAG, "Not removing non-existent package " + packageName); @@ -170,10 +171,10 @@ final class DeletePackageHelper { if (pkg != null) { SharedLibraryInfo libraryInfo = null; if (pkg.getStaticSharedLibName() != null) { - libraryInfo = mPm.getSharedLibraryInfo(pkg.getStaticSharedLibName(), + libraryInfo = computer.getSharedLibraryInfo(pkg.getStaticSharedLibName(), pkg.getStaticSharedLibVersion()); } else if (pkg.getSdkLibName() != null) { - libraryInfo = mPm.getSharedLibraryInfo(pkg.getSdkLibName(), + libraryInfo = computer.getSharedLibraryInfo(pkg.getSdkLibName(), pkg.getSdkLibVersionMajor()); } @@ -183,7 +184,7 @@ final class DeletePackageHelper { continue; } List libClientPackages = - mPm.getPackagesUsingSharedLibrary(libraryInfo, + computer.getPackagesUsingSharedLibrary(libraryInfo, MATCH_KNOWN_PACKAGES, Process.SYSTEM_UID, currUserId); if (!ArrayUtils.isEmpty(libClientPackages)) { Slog.w(TAG, "Not removing package " + pkg.getManifestPackageName() @@ -454,11 +455,11 @@ final class DeletePackageHelper { if (affectedUserIds == null) { affectedUserIds = mPm.resolveUserIds(userId); } + final Computer snapshot = mPm.snapshotComputer(); for (final int affectedUserId : affectedUserIds) { if (hadSuspendAppsPermission.get(affectedUserId)) { - mPm.unsuspendForSuspendingPackage(mPm.snapshotComputer(), packageName, - affectedUserId); - mPm.removeAllDistractingPackageRestrictions(affectedUserId); + mPm.unsuspendForSuspendingPackage(snapshot, packageName, affectedUserId); + mPm.removeAllDistractingPackageRestrictions(snapshot, affectedUserId); } } @@ -621,7 +622,8 @@ final class DeletePackageHelper { final int callingUid = Binder.getCallingUid(); mPm.mContext.enforceCallingOrSelfPermission( android.Manifest.permission.DELETE_PACKAGES, null); - final boolean canViewInstantApps = mPm.canViewInstantApps(callingUid, userId); + final Computer snapshot = mPm.snapshotComputer(); + final boolean canViewInstantApps = snapshot.canViewInstantApps(callingUid, userId); Preconditions.checkNotNull(versionedPackage); Preconditions.checkNotNull(observer); Preconditions.checkArgumentInRange(versionedPackage.getLongVersionCode(), @@ -644,12 +646,13 @@ final class DeletePackageHelper { } // Normalize package name to handle renamed packages and static libs - final String internalPackageName = mPm.resolveInternalPackageName(packageName, versionCode); + final String internalPackageName = + snapshot.resolveInternalPackageName(packageName, versionCode); final int uid = Binder.getCallingUid(); - if (!isOrphaned(internalPackageName) + if (!isOrphaned(snapshot, internalPackageName) && !allowSilentUninstall - && !isCallerAllowedToSilentlyUninstall(uid, internalPackageName)) { + && !isCallerAllowedToSilentlyUninstall(snapshot, uid, internalPackageName)) { mPm.mHandler.post(() -> { try { final Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE); @@ -680,8 +683,7 @@ final class DeletePackageHelper { return; } - if (!deleteAllUsers && mPm.mIPackageManager - .getBlockUninstallForUser(internalPackageName, userId)) { + if (!deleteAllUsers && snapshot.getBlockUninstallForUser(internalPackageName, userId)) { mPm.mHandler.post(() -> { try { observer.onPackageDeleted(packageName, @@ -756,44 +758,45 @@ final class DeletePackageHelper { }); } - private boolean isOrphaned(String packageName) { - final PackageStateInternal packageState = mPm.getPackageStateInternal(packageName); + private boolean isOrphaned(@NonNull Computer snapshot, String packageName) { + final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); return packageState != null && packageState.getInstallSource().isOrphaned; } - private boolean isCallerAllowedToSilentlyUninstall(int callingUid, String pkgName) { + private boolean isCallerAllowedToSilentlyUninstall(@NonNull Computer snapshot, int callingUid, + String pkgName) { if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID || UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) { return true; } final int callingUserId = UserHandle.getUserId(callingUid); // If the caller installed the pkgName, then allow it to silently uninstall. - if (callingUid == mPm.mIPackageManager.getPackageUid( - mPm.mIPackageManager.getInstallerPackageName(pkgName), 0, callingUserId)) { + if (callingUid == snapshot.getPackageUid(snapshot.getInstallerPackageName(pkgName), 0, + callingUserId)) { return true; } // Allow package verifier to silently uninstall. - if (mPm.mRequiredVerifierPackage != null && callingUid == mPm.mIPackageManager + if (mPm.mRequiredVerifierPackage != null && callingUid == snapshot .getPackageUid(mPm.mRequiredVerifierPackage, 0, callingUserId)) { return true; } // Allow package uninstaller to silently uninstall. - if (mPm.mRequiredUninstallerPackage != null && callingUid == mPm.mIPackageManager + if (mPm.mRequiredUninstallerPackage != null && callingUid == snapshot .getPackageUid(mPm.mRequiredUninstallerPackage, 0, callingUserId)) { return true; } // Allow storage manager to silently uninstall. - if (mPm.mStorageManagerPackage != null && callingUid == mPm.mIPackageManager.getPackageUid( + if (mPm.mStorageManagerPackage != null && callingUid == snapshot.getPackageUid( mPm.mStorageManagerPackage, 0, callingUserId)) { return true; } // Allow caller having MANAGE_PROFILE_AND_DEVICE_OWNERS permission to silently // uninstall for device owner provisioning. - return mPm.mIPackageManager.checkUidPermission(MANAGE_PROFILE_AND_DEVICE_OWNERS, callingUid) + return snapshot.checkUidPermission(MANAGE_PROFILE_AND_DEVICE_OWNERS, callingUid) == PERMISSION_GRANTED; } @@ -899,8 +902,8 @@ final class DeletePackageHelper { int installedForUsersCount = 0; synchronized (mPm.mLock) { // Normalize package name to handle renamed packages and static libs - final String internalPkgName = mPm.resolveInternalPackageName(packageName, - versionCode); + final String internalPkgName = mPm.snapshotComputer() + .resolveInternalPackageName(packageName, versionCode); final PackageSetting ps = mPm.mSettings.getPackageLPr(internalPkgName); if (ps != null) { int[] installedUsers = ps.queryInstalledUsers(mUserManagerInternal.getUserIds(), diff --git a/services/core/java/com/android/server/pm/DexOptHelper.java b/services/core/java/com/android/server/pm/DexOptHelper.java index 74ea7cc9b4e1..50b2e2321886 100644 --- a/services/core/java/com/android/server/pm/DexOptHelper.java +++ b/services/core/java/com/android/server/pm/DexOptHelper.java @@ -266,8 +266,9 @@ final class DexOptHelper { return; } + final Computer snapshot = mPm.snapshotComputer(); List pkgSettings = - getPackagesForDexopt(mPm.getPackageStates().values(), mPm); + getPackagesForDexopt(snapshot.getPackageStates().values(), mPm); List pkgs = new ArrayList<>(pkgSettings.size()); for (int index = 0; index < pkgSettings.size(); index++) { @@ -282,17 +283,19 @@ final class DexOptHelper { final int elapsedTimeSeconds = (int) TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime); + final Computer newSnapshot = mPm.snapshotComputer(); + MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_dexopted", stats[0]); MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_skipped", stats[1]); MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_failed", stats[2]); - MetricsLogger.histogram( - mPm.mContext, "opt_dialog_num_total", getOptimizablePackages().size()); + MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_total", + getOptimizablePackages(newSnapshot).size()); MetricsLogger.histogram(mPm.mContext, "opt_dialog_time_s", elapsedTimeSeconds); } - public ArraySet getOptimizablePackages() { + public ArraySet getOptimizablePackages(@NonNull Computer snapshot) { ArraySet pkgs = new ArraySet<>(); - mPm.forEachPackageState(packageState -> { + mPm.forEachPackageState(snapshot, packageState -> { final AndroidPackage pkg = packageState.getPkg(); if (pkg != null && mPm.mPackageDexOptimizer.canOptimizePackage(pkg)) { pkgs.add(packageState.getPackageName()); @@ -302,10 +305,10 @@ final class DexOptHelper { } /*package*/ boolean performDexOpt(DexoptOptions options) { - if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) { + final Computer snapshot = mPm.snapshotComputer(); + if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { return false; - } else if (mPm.mIPackageManager.isInstantApp(options.getPackageName(), - UserHandle.getCallingUserId())) { + } else if (snapshot.isInstantApp(options.getPackageName(), UserHandle.getCallingUserId())) { return false; } @@ -417,10 +420,10 @@ final class DexOptHelper { mPm.getDexManager().getPackageUseInfoOrDefault(p.getPackageName()), options); } - public void forceDexOpt(String packageName) { + public void forceDexOpt(@NonNull Computer snapshot, String packageName) { PackageManagerServiceUtils.enforceSystemOrRoot("forceDexOpt"); - final PackageStateInternal packageState = mPm.getPackageStateInternal(packageName); + final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); final AndroidPackage pkg = packageState == null ? null : packageState.getPkg(); if (packageState == null || pkg == null) { throw new IllegalArgumentException("Unknown package: " + packageName); @@ -485,19 +488,21 @@ final class DexOptHelper { ArrayList sortTemp = new ArrayList<>(remainingPkgSettings.size()); + final Computer snapshot = packageManagerService.snapshotComputer(); + // Give priority to core apps. - applyPackageFilter(pkgSetting -> pkgSetting.getPkg().isCoreApp(), result, + applyPackageFilter(snapshot, pkgSetting -> pkgSetting.getPkg().isCoreApp(), result, remainingPkgSettings, sortTemp, packageManagerService); // Give priority to system apps that listen for pre boot complete. Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED); final ArraySet pkgNames = getPackageNamesForIntent(intent, UserHandle.USER_SYSTEM); - applyPackageFilter(pkgSetting -> pkgNames.contains(pkgSetting.getPackageName()), result, + applyPackageFilter(snapshot, pkgSetting -> pkgNames.contains(pkgSetting.getPackageName()), result, remainingPkgSettings, sortTemp, packageManagerService); // Give priority to apps used by other apps. DexManager dexManager = packageManagerService.getDexManager(); - applyPackageFilter(pkgSetting -> + applyPackageFilter(snapshot, pkgSetting -> dexManager.getPackageUseInfoOrDefault(pkgSetting.getPackageName()) .isAnyCodePathUsedByOtherApps(), result, remainingPkgSettings, sortTemp, packageManagerService); @@ -535,7 +540,7 @@ final class DexOptHelper { // No historical info. Take all. remainingPredicate = pkgSetting -> true; } - applyPackageFilter(remainingPredicate, result, remainingPkgSettings, sortTemp, + applyPackageFilter(snapshot, remainingPredicate, result, remainingPkgSettings, sortTemp, packageManagerService); if (debug) { @@ -550,7 +555,7 @@ final class DexOptHelper { // package will be removed from {@code packages} and added to {@code result} with its // dependencies. If usage data is available, the positive packages will be sorted by usage // data (with {@code sortTemp} as temporary storage). - private static void applyPackageFilter( + private static void applyPackageFilter(@NonNull Computer snapshot, Predicate filter, Collection result, Collection packages, @@ -568,8 +573,7 @@ final class DexOptHelper { for (PackageStateInternal pkgSetting : sortTemp) { result.add(pkgSetting); - List deps = - packageManagerService.findSharedNonSystemLibraries(pkgSetting); + List deps = snapshot.findSharedNonSystemLibraries(pkgSetting); if (!deps.isEmpty()) { deps.removeAll(result); result.addAll(deps); diff --git a/services/core/java/com/android/server/pm/DomainVerificationConnection.java b/services/core/java/com/android/server/pm/DomainVerificationConnection.java index db8c6dc60b5e..20e4dd8a995b 100644 --- a/services/core/java/com/android/server/pm/DomainVerificationConnection.java +++ b/services/core/java/com/android/server/pm/DomainVerificationConnection.java @@ -21,7 +21,6 @@ import static com.android.server.pm.PackageManagerService.DOMAIN_VERIFICATION; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; -import android.content.pm.PackageManagerInternal; import android.os.Binder; import android.os.Message; import android.os.UserHandle; @@ -35,13 +34,10 @@ import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV2; public final class DomainVerificationConnection implements DomainVerificationService.Connection, DomainVerificationProxyV1.Connection, DomainVerificationProxyV2.Connection { final PackageManagerService mPm; - final PackageManagerInternal mPmInternal; final UserManagerInternal mUmInternal; - // TODO(b/198166813): remove PMS dependency DomainVerificationConnection(PackageManagerService pm) { mPm = pm; - mPmInternal = mPm.mInjector.getLocalService(PackageManagerInternal.class); mUmInternal = mPm.mInjector.getLocalService(UserManagerInternal.class); } @@ -82,18 +78,18 @@ public final class DomainVerificationConnection implements DomainVerificationSer @Override public boolean isCallerPackage(int callingUid, @NonNull String packageName) { final int callingUserId = UserHandle.getUserId(callingUid); - return callingUid == mPmInternal.getPackageUid(packageName, 0, callingUserId); + return callingUid == mPm.snapshotComputer().getPackageUid(packageName, 0, callingUserId); } @Nullable @Override public AndroidPackage getPackage(@NonNull String packageName) { - return mPmInternal.getPackage(packageName); + return mPm.snapshotComputer().getPackage(packageName); } @Override public boolean filterAppAccess(String packageName, int callingUid, int userId) { - return mPmInternal.filterAppAccess(packageName, callingUid, userId); + return mPm.snapshotComputer().filterAppAccess(packageName, callingUid, userId); } @Override @@ -108,6 +104,6 @@ public final class DomainVerificationConnection implements DomainVerificationSer @NonNull public Computer snapshot() { - return (Computer) mPmInternal.snapshot(); + return mPm.snapshotComputer(); } } diff --git a/services/core/java/com/android/server/pm/DumpHelper.java b/services/core/java/com/android/server/pm/DumpHelper.java index 05ef3c4ec300..f83ef5aea23a 100644 --- a/services/core/java/com/android/server/pm/DumpHelper.java +++ b/services/core/java/com/android/server/pm/DumpHelper.java @@ -55,6 +55,7 @@ final class DumpHelper { @NeverCompile // Avoid size overhead of debugging code. public void doDump(FileDescriptor fd, PrintWriter pw, String[] args) { + final Computer snapshot = mPm.snapshotComputer(); DumpState dumpState = new DumpState(); ArraySet permissionNames = null; @@ -121,7 +122,7 @@ final class DumpHelper { } // Normalize package name to handle renamed packages and static libs - pkg = mPm.resolveInternalPackageName(pkg, PackageManager.VERSION_CODE_HIGHEST); + pkg = snapshot.resolveInternalPackageName(pkg, PackageManager.VERSION_CODE_HIGHEST); pw.println(mPm.checkPermission(perm, pkg, user)); return; @@ -243,7 +244,7 @@ final class DumpHelper { // Return if the package doesn't exist. if (packageName != null - && mPm.getPackageStateInternal(packageName) == null + && snapshot.getPackageStateInternal(packageName) == null && !mPm.mApexManager.isApexPackage(packageName)) { pw.println("Unable to find package: " + packageName); return; @@ -257,7 +258,7 @@ final class DumpHelper { if (!checkin && dumpState.isDumping(DumpState.DUMP_VERSION) && packageName == null) { - mPm.dumpComputer(DumpState.DUMP_VERSION, fd, pw, dumpState); + snapshot.dump(DumpState.DUMP_VERSION, fd, pw, dumpState); } if (!checkin @@ -273,7 +274,7 @@ final class DumpHelper { final String knownPackage = PackageManagerInternal.knownPackageToString(i); ipw.print(knownPackage); ipw.println(":"); - final String[] pkgNames = mPm.getKnownPackageNamesInternal(i, + final String[] pkgNames = mPm.getKnownPackageNamesInternal(snapshot, i, UserHandle.USER_SYSTEM); ipw.increaseIndent(); if (ArrayUtils.isEmpty(pkgNames)) { @@ -288,8 +289,6 @@ final class DumpHelper { ipw.decreaseIndent(); } - final Computer snapshot = mPm.snapshotComputer(); - if (dumpState.isDumping(DumpState.DUMP_VERIFIERS) && packageName == null) { final String requiredVerifierPackage = mPm.mRequiredVerifierPackage; @@ -343,7 +342,7 @@ final class DumpHelper { if (dumpState.isDumping(DumpState.DUMP_LIBS) && packageName == null) { - mPm.dumpComputer(DumpState.DUMP_LIBS, fd, pw, dumpState); + snapshot.dump(DumpState.DUMP_LIBS, fd, pw, dumpState); } if (dumpState.isDumping(DumpState.DUMP_FEATURES) @@ -389,17 +388,17 @@ final class DumpHelper { } if (!checkin && dumpState.isDumping(DumpState.DUMP_PREFERRED)) { - mPm.dumpComputer(DumpState.DUMP_PREFERRED, fd, pw, dumpState); + snapshot.dump(DumpState.DUMP_PREFERRED, fd, pw, dumpState); } if (!checkin && dumpState.isDumping(DumpState.DUMP_PREFERRED_XML) && packageName == null) { - mPm.dumpComputer(DumpState.DUMP_PREFERRED_XML, fd, pw, dumpState); + snapshot.dump(DumpState.DUMP_PREFERRED_XML, fd, pw, dumpState); } if (!checkin && dumpState.isDumping(DumpState.DUMP_DOMAIN_PREFERRED)) { - mPm.dumpComputer(DumpState.DUMP_DOMAIN_PREFERRED, fd, pw, dumpState); + snapshot.dump(DumpState.DUMP_DOMAIN_PREFERRED, fd, pw, dumpState); } if (!checkin && dumpState.isDumping(DumpState.DUMP_PERMISSIONS)) { @@ -429,7 +428,7 @@ final class DumpHelper { if (!checkin && dumpState.isDumping(DumpState.DUMP_QUERIES)) { - mPm.dumpComputer(DumpState.DUMP_QUERIES, fd, pw, dumpState); + snapshot.dump(DumpState.DUMP_QUERIES, fd, pw, dumpState); } if (dumpState.isDumping(DumpState.DUMP_SHARED_USERS)) { @@ -529,12 +528,12 @@ final class DumpHelper { if (!checkin && dumpState.isDumping(DumpState.DUMP_DEXOPT)) { - mPm.dumpComputer(DumpState.DUMP_DEXOPT, fd, pw, dumpState); + snapshot.dump(DumpState.DUMP_DEXOPT, fd, pw, dumpState); } if (!checkin && dumpState.isDumping(DumpState.DUMP_COMPILER_STATS)) { - mPm.dumpComputer(DumpState.DUMP_COMPILER_STATS, fd, pw, dumpState); + snapshot.dump(DumpState.DUMP_COMPILER_STATS, fd, pw, dumpState); } if (dumpState.isDumping(DumpState.DUMP_MESSAGES) @@ -581,7 +580,7 @@ final class DumpHelper { pw.println(" Known digesters list flag: " + PackageManagerService.getKnownDigestersList()); - PerUidReadTimeouts[] items = mPm.getPerUidReadTimeouts(); + PerUidReadTimeouts[] items = mPm.getPerUidReadTimeouts(snapshot); pw.println(" Timeouts (" + items.length + "):"); for (PerUidReadTimeouts item : items) { pw.print(" ("); diff --git a/services/core/java/com/android/server/pm/IPackageManagerBase.java b/services/core/java/com/android/server/pm/IPackageManagerBase.java new file mode 100644 index 000000000000..e1aee6d747f4 --- /dev/null +++ b/services/core/java/com/android/server/pm/IPackageManagerBase.java @@ -0,0 +1,1189 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.pm; + + +import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.SuppressLint; +import android.annotation.UserIdInt; +import android.app.role.RoleManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.IPackageDeleteObserver; +import android.content.pm.IPackageDeleteObserver2; +import android.content.pm.IPackageInstaller; +import android.content.pm.IPackageManager; +import android.content.pm.IPackageStatsObserver; +import android.content.pm.InstallSourceInfo; +import android.content.pm.InstrumentationInfo; +import android.content.pm.IntentFilterVerificationInfo; +import android.content.pm.KeySet; +import android.content.pm.ModuleInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.ParceledListSlice; +import android.content.pm.PermissionGroupInfo; +import android.content.pm.PermissionInfo; +import android.content.pm.ProviderInfo; +import android.content.pm.ResolveInfo; +import android.content.pm.ServiceInfo; +import android.content.pm.SharedLibraryInfo; +import android.content.pm.VersionedPackage; +import android.content.pm.dex.IArtManager; +import android.os.Binder; +import android.os.Process; +import android.os.RemoteException; +import android.os.Trace; +import android.os.UserHandle; +import android.permission.PermissionManager; + +import com.android.internal.R; +import com.android.internal.content.InstallLocationUtils; +import com.android.internal.util.CollectionUtils; +import com.android.server.pm.pkg.PackageStateInternal; +import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; +import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV1; + +import java.util.List; +import java.util.Objects; + +/** + * Contains all simply proxy methods which need a snapshot instance and just calls a method on it, + * with no additional logic. Separated with all methods marked final and deprecated to prevent their + * use from other methods which may need a snapshot for non-trivial reasons. + */ +public abstract class IPackageManagerBase extends IPackageManager.Stub { + + @NonNull + private final PackageManagerService mService; + + @NonNull + private final Context mContext; + + @NonNull private final DexOptHelper mDexOptHelper; + @NonNull private final ModuleInfoProvider mModuleInfoProvider; + @NonNull private final PreferredActivityHelper mPreferredActivityHelper; + @NonNull private final ResolveIntentHelper mResolveIntentHelper; + + @NonNull + private final DomainVerificationManagerInternal mDomainVerificationManager; + + @NonNull + private final DomainVerificationConnection mDomainVerificationConnection; + + @NonNull + private final PackageInstallerService mInstallerService; + + @NonNull + private final PackageProperty mPackageProperty; + + @NonNull + private final ComponentName mResolveComponentName; + + @Nullable + private final ComponentName mInstantAppResolverSettingsComponent; + + @NonNull + private final String mRequiredSupplementalProcessPackage; + + @Nullable + private final String mServicesExtensionPackageName; + + @Nullable + private final String mSharedSystemSharedLibraryPackageName; + + public IPackageManagerBase(@NonNull PackageManagerService service, @NonNull Context context, + @NonNull DexOptHelper dexOptHelper, @NonNull ModuleInfoProvider moduleInfoProvider, + @NonNull PreferredActivityHelper preferredActivityHelper, + @NonNull ResolveIntentHelper resolveIntentHelper, + @NonNull DomainVerificationManagerInternal domainVerificationManager, + @NonNull DomainVerificationConnection domainVerificationConnection, + @NonNull PackageInstallerService installerService, + @NonNull PackageProperty packageProperty, @NonNull ComponentName resolveComponentName, + @Nullable ComponentName instantAppResolverSettingsComponent, + @NonNull String requiredSupplementalProcessPackage, + @Nullable String servicesExtensionPackageName, + @Nullable String sharedSystemSharedLibraryPackageName) { + mService = service; + mContext = context; + mDexOptHelper = dexOptHelper; + mModuleInfoProvider = moduleInfoProvider; + mPreferredActivityHelper = preferredActivityHelper; + mResolveIntentHelper = resolveIntentHelper; + mDomainVerificationManager = domainVerificationManager; + mDomainVerificationConnection = domainVerificationConnection; + mInstallerService = installerService; + mPackageProperty = packageProperty; + mResolveComponentName = resolveComponentName; + mInstantAppResolverSettingsComponent = instantAppResolverSettingsComponent; + mRequiredSupplementalProcessPackage = requiredSupplementalProcessPackage; + mServicesExtensionPackageName = servicesExtensionPackageName; + mSharedSystemSharedLibraryPackageName = sharedSystemSharedLibraryPackageName; + } + + protected Computer snapshot() { + return mService.snapshotComputer(); + } + + @Override + @Deprecated + public final boolean activitySupportsIntent(ComponentName component, Intent intent, + String resolvedType) { + return snapshot().activitySupportsIntent(mResolveComponentName, component, intent, + resolvedType); + } + + @Override + @Deprecated + public final void addCrossProfileIntentFilter(IntentFilter intentFilter, String ownerPackage, + int sourceUserId, int targetUserId, int flags) { + mService.addCrossProfileIntentFilter(snapshot(), + new WatchedIntentFilter(intentFilter), ownerPackage, sourceUserId, targetUserId, + flags); + } + + // NOTE: Can't remove due to unsupported app usage + @Override + @Deprecated + public final boolean addPermission(PermissionInfo info) { + // Because this is accessed via the package manager service AIDL, + // go through the permission manager service AIDL + return mContext.getSystemService(PermissionManager.class).addPermission(info, false); + } + + // NOTE: Can't remove due to unsupported app usage + @Override + @Deprecated + public final boolean addPermissionAsync(PermissionInfo info) { + // Because this is accessed via the package manager service AIDL, + // go through the permission manager service AIDL + return mContext.getSystemService(PermissionManager.class).addPermission(info, true); + } + + @Override + @Deprecated + public final void addPersistentPreferredActivity(IntentFilter filter, ComponentName activity, + int userId) { + mPreferredActivityHelper.addPersistentPreferredActivity(new WatchedIntentFilter(filter), + activity, userId); + } + + @Override + @Deprecated + public final void addPreferredActivity(IntentFilter filter, int match, + ComponentName[] set, ComponentName activity, int userId, boolean removeExisting) { + mPreferredActivityHelper.addPreferredActivity(snapshot(), + new WatchedIntentFilter(filter), match, set, activity, true, userId, + "Adding preferred", removeExisting); + } + + /* + * Returns if intent can be forwarded from the sourceUserId to the targetUserId + */ + @Override + @Deprecated + public final boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType, + @UserIdInt int sourceUserId, @UserIdInt int targetUserId) { + return snapshot().canForwardTo(intent, resolvedType, sourceUserId, targetUserId); + } + + @Override + @Deprecated + public final boolean canRequestPackageInstalls(String packageName, int userId) { + return snapshot().canRequestPackageInstalls(packageName, Binder.getCallingUid(), userId, + true /* throwIfPermNotDeclared*/); + } + + @Override + @Deprecated + public final String[] canonicalToCurrentPackageNames(String[] names) { + return snapshot().canonicalToCurrentPackageNames(names); + } + + // NOTE: Can't remove due to unsupported app usage + @Override + @Deprecated + public final int checkPermission(String permName, String pkgName, int userId) { + return mService.checkPermission(permName, pkgName, userId); + } + + @Override + @Deprecated + public final int checkSignatures(@NonNull String pkg1, @NonNull String pkg2) { + return snapshot().checkSignatures(pkg1, pkg2); + } + + @Override + @Deprecated + public final int checkUidPermission(String permName, int uid) { + return snapshot().checkUidPermission(permName, uid); + } + + @Override + @Deprecated + public final int checkUidSignatures(int uid1, int uid2) { + return snapshot().checkUidSignatures(uid1, uid2); + } + + @Override + @Deprecated + public final void clearPackagePersistentPreferredActivities(String packageName, int userId) { + mPreferredActivityHelper.clearPackagePersistentPreferredActivities(packageName, userId); + } + + @Override + @Deprecated + public final void clearPackagePreferredActivities(String packageName) { + mPreferredActivityHelper.clearPackagePreferredActivities(snapshot(), + packageName); + } + + @Override + @Deprecated + public final String[] currentToCanonicalPackageNames(String[] names) { + return snapshot().currentToCanonicalPackageNames(names); + } + + @Override + @Deprecated + public final void deleteExistingPackageAsUser(VersionedPackage versionedPackage, + final IPackageDeleteObserver2 observer, final int userId) { + mService.deleteExistingPackageAsUser(versionedPackage, observer, userId); + } + + @Override + @Deprecated + public final void deletePackageAsUser(String packageName, int versionCode, + IPackageDeleteObserver observer, int userId, int flags) { + deletePackageVersioned(new VersionedPackage(packageName, versionCode), + new PackageManager.LegacyPackageDeleteObserver(observer).getBinder(), userId, + flags); + } + + @Override + @Deprecated + public final void deletePackageVersioned(VersionedPackage versionedPackage, + final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) { + mService.deletePackageVersioned(versionedPackage, observer, userId, deleteFlags); + } + + @Override + @Deprecated + public final ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) { + return mPreferredActivityHelper.findPersistentPreferredActivity(snapshot(), intent, userId); + } + + @Override + @Deprecated + public final void forceDexOpt(String packageName) { + mDexOptHelper.forceDexOpt(snapshot(), packageName); + } + + @Override + @Deprecated + public final ActivityInfo getActivityInfo(ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, int userId) { + return snapshot().getActivityInfo(component, flags, userId); + } + + @NonNull + @Override + @Deprecated + public final ParceledListSlice getAllIntentFilters(@NonNull String packageName) { + return snapshot().getAllIntentFilters(packageName); + } + + @Override + @Deprecated + public final List getAllPackages() { + return snapshot().getAllPackages(); + } + + // NOTE: Can't remove due to unsupported app usage + @NonNull + @Override + @Deprecated + public final String[] getAppOpPermissionPackages(@NonNull String permissionName) { + return snapshot().getAppOpPermissionPackages(permissionName); + } + + @Override + @Deprecated + public final String getAppPredictionServicePackageName() { + return mService.mAppPredictionServicePackage; + } + + @PackageManager.EnabledState + @Override + @Deprecated + public final int getApplicationEnabledSetting(@NonNull String packageName, + @UserIdInt int userId) { + return snapshot().getApplicationEnabledSetting(packageName, userId); + } + + /** + * Returns true if application is not found or there was an error. Otherwise it returns the + * hidden state of the package for the given user. + */ + @Override + @Deprecated + public final boolean getApplicationHiddenSettingAsUser(@NonNull String packageName, + @UserIdInt int userId) { + return snapshot().getApplicationHiddenSettingAsUser(packageName, userId); + } + + @Override + @Deprecated + public final ApplicationInfo getApplicationInfo(String packageName, + @PackageManager.ApplicationInfoFlagsBits long flags, int userId) { + return snapshot().getApplicationInfo(packageName, flags, userId); + } + + @Override + @Deprecated + public final IArtManager getArtManager() { + return mService.mArtManagerService; + } + + @Override + @Deprecated + public final @Nullable + String getAttentionServicePackageName() { + return mService.ensureSystemPackageName(snapshot(), + mService.getPackageFromComponentString(R.string.config_defaultAttentionService)); + } + + @Override + @Deprecated + public final boolean getBlockUninstallForUser(@NonNull String packageName, + @UserIdInt int userId) { + return snapshot().getBlockUninstallForUser(packageName, userId); + } + + @Override + @Deprecated + public final int getComponentEnabledSetting(@NonNull ComponentName component, int userId) { + return snapshot().getComponentEnabledSetting(component, Binder.getCallingUid(), userId); + } + + @Override + @Deprecated + public final String getContentCaptureServicePackageName() { + return mService.ensureSystemPackageName(snapshot(), + mService.getPackageFromComponentString( + R.string.config_defaultContentCaptureService)); + } + + @Nullable + @Override + @Deprecated + public final ParceledListSlice getDeclaredSharedLibraries( + @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, + @NonNull int userId) { + return snapshot().getDeclaredSharedLibraries(packageName, flags, userId); + } + + /** + * Non-Binder method, support for the backup/restore mechanism: write the default browser (etc) + * settings in its canonical XML format. Returns the default browser XML representation as a + * byte array, or null if there is none. + */ + @Override + @Deprecated + public final byte[] getDefaultAppsBackup(int userId) { + return mPreferredActivityHelper.getDefaultAppsBackup(userId); + } + + @Override + @Deprecated + public final String getDefaultTextClassifierPackageName() { + return mService.mDefaultTextClassifierPackage; + } + + @Override + @Deprecated + public final int getFlagsForUid(int uid) { + return snapshot().getFlagsForUid(uid); + } + + @Nullable + @Override + @Deprecated + public final CharSequence getHarmfulAppWarning(@NonNull String packageName, + @UserIdInt int userId) { + return snapshot().getHarmfulAppWarning(packageName, userId); + } + + @Override + @Deprecated + public final ComponentName getHomeActivities(List allHomeCandidates) { + final Computer snapshot = snapshot(); + if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } + return snapshot.getHomeActivitiesAsUser(allHomeCandidates, + UserHandle.getCallingUserId()); + } + + @Deprecated + public final String getIncidentReportApproverPackageName() { + return mService.mIncidentReportApproverPackage; + } + + @Override + @Deprecated + public final int getInstallLocation() { + // allow instant app access + return android.provider.Settings.Global.getInt(mContext.getContentResolver(), + android.provider.Settings.Global.DEFAULT_INSTALL_LOCATION, + InstallLocationUtils.APP_INSTALL_AUTO); + } + + @PackageManager.InstallReason + @Override + @Deprecated + public final int getInstallReason(@NonNull String packageName, @UserIdInt int userId) { + return snapshot().getInstallReason(packageName, userId); + } + + @Override + @Nullable + @Deprecated + public final InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) { + return snapshot().getInstallSourceInfo(packageName); + } + + @Override + @Deprecated + public final ParceledListSlice getInstalledApplications( + @PackageManager.ApplicationInfoFlagsBits long flags, int userId) { + final int callingUid = Binder.getCallingUid(); + return new ParceledListSlice<>( + snapshot().getInstalledApplications(flags, userId, callingUid)); + } + + @Override + @Deprecated + public final List getInstalledModules(int flags) { + return mModuleInfoProvider.getInstalledModules(flags); + } + + @Override + @Deprecated + public final ParceledListSlice getInstalledPackages( + @PackageManager.PackageInfoFlagsBits long flags, int userId) { + return snapshot().getInstalledPackages(flags, userId); + } + + @Nullable + @Override + @Deprecated + public final String getInstallerPackageName(@NonNull String packageName) { + return snapshot().getInstallerPackageName(packageName); + } + + @Override + @Deprecated + public final ComponentName getInstantAppInstallerComponent() { + final Computer snapshot = snapshot(); + if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } + return snapshot.getInstantAppInstallerComponent(); + } + + @Override + @Deprecated + public final @Nullable + ComponentName getInstantAppResolverComponent() { + final Computer snapshot = snapshot(); + if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } + return mService.getInstantAppResolver(snapshot); + } + + @Override + @Deprecated + public final ComponentName getInstantAppResolverSettingsComponent() { + return mInstantAppResolverSettingsComponent; + } + + @Nullable + @Override + @Deprecated + public final InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, + int flags) { + return snapshot().getInstrumentationInfo(component, flags); + } + + @Override + @Deprecated + public final @NonNull + ParceledListSlice + getIntentFilterVerifications(String packageName) { + return ParceledListSlice.emptyList(); + } + + @Override + @Deprecated + public final int getIntentVerificationStatus(String packageName, int userId) { + return mDomainVerificationManager.getLegacyState(packageName, userId); + } + + @Nullable + @Override + @Deprecated + public final KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) { + return snapshot().getKeySetByAlias(packageName, alias); + } + + @Override + @Deprecated + public final ModuleInfo getModuleInfo(String packageName, + @PackageManager.ModuleInfoFlags int flags) { + return mModuleInfoProvider.getModuleInfo(packageName, flags); + } + + @Nullable + @Override + @Deprecated + public final String getNameForUid(int uid) { + return snapshot().getNameForUid(uid); + } + + @Nullable + @Override + @Deprecated + public final String[] getNamesForUids(@NonNull int[] uids) { + return snapshot().getNamesForUids(uids); + } + + @Override + @Deprecated + public final int[] getPackageGids(String packageName, + @PackageManager.PackageInfoFlagsBits long flags, int userId) { + return snapshot().getPackageGids(packageName, flags, userId); + } + + @Override + @Deprecated + public final PackageInfo getPackageInfo(String packageName, + @PackageManager.PackageInfoFlagsBits long flags, int userId) { + return snapshot().getPackageInfo(packageName, flags, userId); + } + + @Override + @Deprecated + public final PackageInfo getPackageInfoVersioned(VersionedPackage versionedPackage, + @PackageManager.PackageInfoFlagsBits long flags, int userId) { + return snapshot().getPackageInfoInternal(versionedPackage.getPackageName(), + versionedPackage.getLongVersionCode(), flags, Binder.getCallingUid(), userId); + } + + @Override + @Deprecated + public final IPackageInstaller getPackageInstaller() { + // Return installer service for internal calls. + if (PackageManagerServiceUtils.isSystemOrRoot()) { + return mInstallerService; + } + final Computer snapshot = snapshot(); + // Return null for InstantApps. + if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } + return mInstallerService; + } + + @Override + @Deprecated + public final void getPackageSizeInfo(final String packageName, int userId, + final IPackageStatsObserver observer) { + throw new UnsupportedOperationException( + "Shame on you for calling the hidden API getPackageSizeInfo(). Shame!"); + } + + @Override + @Deprecated + public final int getPackageUid(@NonNull String packageName, + @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { + return snapshot().getPackageUid(packageName, flags, userId); + } + + /** + * IMPORTANT: Not all packages returned by this method may be known + * to the system. There are two conditions in which this may occur: + *
    + *
  1. The package is on adoptable storage and the device has been removed
  2. + *
  3. The package is being removed and the internal structures are partially updated
  4. + *
+ * The second is an artifact of the current data structures and should be fixed. See + * b/111075456 for one such instance. + * This binder API is cached. If the algorithm in this method changes, + * or if the underlying objecs (as returned by getSettingLPr()) change + * then the logic that invalidates the cache must be revisited. See + * calls to invalidateGetPackagesForUidCache() to locate the points at + * which the cache is invalidated. + */ + @Override + @Deprecated + public final String[] getPackagesForUid(int uid) { + final int callingUid = Binder.getCallingUid(); + final int userId = UserHandle.getUserId(uid); + snapshot().enforceCrossUserOrProfilePermission(callingUid, userId, + /* requireFullPermission */ false, + /* checkShell */ false, "getPackagesForUid"); + return snapshot().getPackagesForUid(uid); + } + + @Override + @Deprecated + public final ParceledListSlice getPackagesHoldingPermissions( + @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags, + @UserIdInt int userId) { + return snapshot().getPackagesHoldingPermissions(permissions, flags, userId); + } + + // NOTE: Can't remove due to unsupported app usage + @Override + @Deprecated + public final PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) { + return mService.getPermissionGroupInfo(groupName, flags); + } + + @Override + @Deprecated + public final @NonNull + ParceledListSlice getPersistentApplications(int flags) { + final Computer snapshot = snapshot(); + if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { + return ParceledListSlice.emptyList(); + } + return new ParceledListSlice<>(snapshot.getPersistentApplications(isSafeMode(), flags)); + } + + @Override + @Deprecated + public final int getPreferredActivities(List outFilters, + List outActivities, String packageName) { + return mPreferredActivityHelper.getPreferredActivities(snapshot(), outFilters, + outActivities, packageName); + } + + /** + * Non-Binder method, support for the backup/restore mechanism: write the full set of preferred + * activities in its canonical XML format. Returns the XML output as a byte array, or null if + * there is none. + */ + @Override + @Deprecated + public final byte[] getPreferredActivityBackup(int userId) { + return mPreferredActivityHelper.getPreferredActivityBackup(userId); + } + + @Override + @Deprecated + public final int getPrivateFlagsForUid(int uid) { + return snapshot().getPrivateFlagsForUid(uid); + } + + @Override + @Deprecated + public final PackageManager.Property getProperty(String propertyName, String packageName, + String className) { + Objects.requireNonNull(propertyName); + Objects.requireNonNull(packageName); + PackageStateInternal packageState = snapshot().getPackageStateFiltered(packageName, + Binder.getCallingUid(), UserHandle.getCallingUserId()); + if (packageState == null) { + return null; + } + return mPackageProperty.getProperty(propertyName, packageName, className); + } + + @Nullable + @Override + @Deprecated + public final ProviderInfo getProviderInfo(@NonNull ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { + return snapshot().getProviderInfo(component, flags, userId); + } + + @Override + @Deprecated + public final ActivityInfo getReceiverInfo(ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, int userId) { + return snapshot().getReceiverInfo(component, flags, userId); + } + + @Override + @Deprecated + public final @Nullable + String getRotationResolverPackageName() { + return mService.ensureSystemPackageName(snapshot(), + mService.getPackageFromComponentString( + R.string.config_defaultRotationResolverService)); + } + + @Nullable + @Override + @Deprecated + public final ServiceInfo getServiceInfo(@NonNull ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { + return snapshot().getServiceInfo(component, flags, userId); + } + + @Override + @Deprecated + public final @NonNull + String getServicesSystemSharedLibraryPackageName() { + return mServicesExtensionPackageName; + } + + @Override + @Deprecated + public final String getSetupWizardPackageName() { + if (Binder.getCallingUid() != Process.SYSTEM_UID) { + throw new SecurityException("Non-system caller"); + } + return mService.mSetupWizardPackage; + } + + @Override + @Deprecated + public final ParceledListSlice getSharedLibraries(String packageName, + @PackageManager.PackageInfoFlagsBits long flags, int userId) { + return snapshot().getSharedLibraries(packageName, flags, userId); + } + + @Override + @Deprecated + public final @NonNull + String getSharedSystemSharedLibraryPackageName() { + return mSharedSystemSharedLibraryPackageName; + } + + @Nullable + @Override + @Deprecated + public final KeySet getSigningKeySet(@NonNull String packageName) { + return snapshot().getSigningKeySet(packageName); + } + + @Override + @Deprecated + public final String getSdkSandboxPackageName() { + return mService.getSdkSandboxPackageName(); + } + + @Override + @Deprecated + public final String getSystemCaptionsServicePackageName() { + return mService.ensureSystemPackageName(snapshot(), + mService.getPackageFromComponentString( + R.string.config_defaultSystemCaptionsService)); + } + + @Nullable + @Override + @Deprecated + public final String[] getSystemSharedLibraryNames() { + return snapshot().getSystemSharedLibraryNames(); + } + + @Override + @Deprecated + public final String getSystemTextClassifierPackageName() { + return mService.mSystemTextClassifierPackageName; + } + + @Override + @Deprecated + public final int getTargetSdkVersion(@NonNull String packageName) { + return snapshot().getTargetSdkVersion(packageName); + } + + @Override + @Deprecated + public final int getUidForSharedUser(@NonNull String sharedUserName) { + return snapshot().getUidForSharedUser(sharedUserName); + } + + @SuppressLint("MissingPermission") + @Override + @Deprecated + public final String getWellbeingPackageName() { + final long identity = Binder.clearCallingIdentity(); + try { + return CollectionUtils.firstOrNull( + mContext.getSystemService(RoleManager.class).getRoleHolders( + RoleManager.ROLE_SYSTEM_WELLBEING)); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + // NOTE: Can't remove due to unsupported app usage + @SuppressLint("MissingPermission") + @Override + @Deprecated + public final void grantRuntimePermission(String packageName, String permName, + final int userId) { + // Because this is accessed via the package manager service AIDL, + // go through the permission manager service AIDL + mContext.getSystemService(PermissionManager.class) + .grantRuntimePermission(packageName, permName, UserHandle.of(userId)); + } + + @Override + @Deprecated + public final boolean hasSigningCertificate(@NonNull String packageName, + @NonNull byte[] certificate, + @PackageManager.CertificateInputType int type) { + return snapshot().hasSigningCertificate(packageName, certificate, type); + } + + @Override + @Deprecated + public final boolean hasSystemFeature(String name, int version) { + return mService.hasSystemFeature(name, version); + } + + @Override + @Deprecated + public final boolean hasSystemUidErrors() { + // allow instant applications + return false; + } + + @Override + @Deprecated + public final boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate, + @PackageManager.CertificateInputType int type) { + return snapshot().hasUidSigningCertificate(uid, certificate, type); + } + + @Override + @Deprecated + public final boolean isDeviceUpgrading() { + return mService.isDeviceUpgrading(); + } + + @Override + @Deprecated + public final boolean isFirstBoot() { + return mService.isFirstBoot(); + } + + @Override + @Deprecated + public final boolean isInstantApp(String packageName, int userId) { + return snapshot().isInstantApp(packageName, userId); + } + + @Override + @Deprecated + public final boolean isOnlyCoreApps() { + return mService.isOnlyCoreApps(); + } + + @Override + @Deprecated + public final boolean isPackageAvailable(String packageName, int userId) { + return snapshot().isPackageAvailable(packageName, userId); + } + + @Override + @Deprecated + public final boolean isPackageDeviceAdminOnAnyUser(String packageName) { + return mService.isPackageDeviceAdminOnAnyUser(snapshot(), + packageName); + } + + @Override + @Deprecated + public final boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) { + return snapshot().isPackageSignedByKeySet(packageName, ks); + } + + @Override + @Deprecated + public final boolean isPackageSignedByKeySetExactly(@NonNull String packageName, + @NonNull KeySet ks) { + return snapshot().isPackageSignedByKeySetExactly(packageName, ks); + } + + @Override + @Deprecated + public final boolean isPackageSuspendedForUser(@NonNull String packageName, + @UserIdInt int userId) { + return snapshot().isPackageSuspendedForUser(packageName, userId); + } + + @Override + @Deprecated + public final boolean isSafeMode() { + // allow instant applications + return mService.getSafeMode(); + } + + @Override + @Deprecated + public final boolean isStorageLow() { + return mService.isStorageLow(); + } + + @Override + @Deprecated + public final boolean isUidPrivileged(int uid) { + return snapshot().isUidPrivileged(uid); + } + + /** + * Ask the package manager to perform a dex-opt with the given compiler filter. + *

+ * Note: exposed only for the shell command to allow moving packages explicitly to a definite + * state. + */ + @Override + @Deprecated + public final boolean performDexOptMode(String packageName, + boolean checkProfiles, String targetCompilerFilter, boolean force, + boolean bootComplete, String splitName) { + return mDexOptHelper.performDexOptMode(packageName, checkProfiles, targetCompilerFilter, + force, bootComplete, splitName); + } + + /** + * Ask the package manager to perform a dex-opt with the given compiler filter on the secondary + * dex files belonging to the given package. + *

+ * Note: exposed only for the shell command to allow moving packages explicitly to a definite + * state. + */ + @Override + @Deprecated + public final boolean performDexOptSecondary(String packageName, String compilerFilter, + boolean force) { + return mDexOptHelper.performDexOptSecondary(packageName, compilerFilter, force); + } + + @Override + @Deprecated + public final @NonNull + ParceledListSlice queryIntentActivities(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + try { + Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "queryIntentActivities"); + + return new ParceledListSlice<>(snapshot().queryIntentActivitiesInternal(intent, + resolvedType, flags, userId)); + } finally { + Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); + } + } + + @NonNull + @Override + @Deprecated + public final ParceledListSlice queryContentProviders(@Nullable String processName, + int uid, @PackageManager.ComponentInfoFlagsBits long flags, + @Nullable String metaDataKey) { + return snapshot().queryContentProviders(processName, uid, flags, metaDataKey); + } + + @NonNull + @Override + @Deprecated + public final ParceledListSlice queryInstrumentation( + @NonNull String targetPackage, int flags) { + return snapshot().queryInstrumentation(targetPackage, flags); + } + + @Override + @Deprecated + public final @NonNull + ParceledListSlice queryIntentActivityOptions( + ComponentName caller, Intent[] specifics, String[] specificTypes, Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + return new ParceledListSlice<>(mResolveIntentHelper.queryIntentActivityOptionsInternal( + snapshot(), caller, specifics, specificTypes, intent, resolvedType, flags, + userId)); + } + + @Override + @Deprecated + public final @NonNull + ParceledListSlice queryIntentContentProviders(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + return new ParceledListSlice<>(mResolveIntentHelper.queryIntentContentProvidersInternal( + snapshot(), intent, resolvedType, flags, userId)); + } + + @Override + @Deprecated + public final @NonNull + ParceledListSlice queryIntentReceivers(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + return new ParceledListSlice<>(mResolveIntentHelper.queryIntentReceiversInternal( + snapshot(), intent, resolvedType, flags, userId, Binder.getCallingUid())); + } + + @Override + @Deprecated + public final @NonNull + ParceledListSlice queryIntentServices(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + final int callingUid = Binder.getCallingUid(); + return new ParceledListSlice<>(snapshot().queryIntentServicesInternal( + intent, resolvedType, flags, userId, callingUid, false /*includeInstantApps*/)); + } + + @Override + @Deprecated + public final void querySyncProviders(List outNames, List outInfo) { + snapshot().querySyncProviders(isSafeMode(), outNames, outInfo); + } + + @Override + @Deprecated + public final void removePermission(String permName) { + // Because this is accessed via the package manager service AIDL, + // go through the permission manager service AIDL + mContext.getSystemService(PermissionManager.class).removePermission(permName); + } + + @Override + @Deprecated + public final void replacePreferredActivity(IntentFilter filter, int match, + ComponentName[] set, ComponentName activity, int userId) { + mPreferredActivityHelper.replacePreferredActivity(snapshot(), + new WatchedIntentFilter(filter), match, set, activity, userId); + } + + @Override + @Deprecated + public final ProviderInfo resolveContentProvider(String name, + @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + return snapshot().resolveContentProvider(name, flags, userId, Binder.getCallingUid()); + } + + @Override + @Deprecated + public final void resetApplicationPreferences(int userId) { + mPreferredActivityHelper.resetApplicationPreferences(userId); + } + + @Override + @Deprecated + public final ResolveInfo resolveIntent(Intent intent, String resolvedType, + @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + return mResolveIntentHelper.resolveIntentInternal(snapshot(), intent, + resolvedType, flags, 0 /*privateResolveFlags*/, userId, false, + Binder.getCallingUid()); + } + + @Override + @Deprecated + public final ResolveInfo resolveService(Intent intent, String resolvedType, + @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + final int callingUid = Binder.getCallingUid(); + return mResolveIntentHelper.resolveServiceInternal(snapshot(), intent, + resolvedType, flags, userId, callingUid); + } + + @Override + @Deprecated + public final void restoreDefaultApps(byte[] backup, int userId) { + mPreferredActivityHelper.restoreDefaultApps(backup, userId); + } + + @Override + @Deprecated + public final void restorePreferredActivities(byte[] backup, int userId) { + mPreferredActivityHelper.restorePreferredActivities(backup, userId); + } + + @Override + @Deprecated + public final void setHomeActivity(ComponentName comp, int userId) { + mPreferredActivityHelper.setHomeActivity(snapshot(), comp, userId); + } + + @Override + @Deprecated + public final void setLastChosenActivity(Intent intent, String resolvedType, int flags, + IntentFilter filter, int match, ComponentName activity) { + mPreferredActivityHelper.setLastChosenActivity(snapshot(), intent, resolvedType, + flags, new WatchedIntentFilter(filter), match, activity); + } + + @Override + @Deprecated + public final boolean updateIntentVerificationStatus(String packageName, int status, + int userId) { + return mDomainVerificationManager.setLegacyUserState(packageName, userId, status); + } + + @Override + @Deprecated + public final void verifyIntentFilter(int id, int verificationCode, List failedDomains) { + DomainVerificationProxyV1.queueLegacyVerifyResult(mContext, mDomainVerificationConnection, + id, verificationCode, failedDomains, Binder.getCallingUid()); + } + + @Override + @Deprecated + public final boolean canPackageQuery(@NonNull String sourcePackageName, + @NonNull String targetPackageName, @UserIdInt int userId) { + return snapshot().canPackageQuery(sourcePackageName, targetPackageName, userId); + } + + @Override + @Deprecated + public final void deletePreloadsFileCache() throws RemoteException { + mService.deletePreloadsFileCache(); + } + + @Override + @Deprecated + public final void setSystemAppHiddenUntilInstalled(String packageName, boolean hidden) + throws RemoteException { + mService.setSystemAppHiddenUntilInstalled(snapshot(), packageName, hidden); + } + + @Override + @Deprecated + public final boolean setSystemAppInstallState(String packageName, + boolean installed, int userId) throws RemoteException { + return mService.setSystemAppInstallState(snapshot(), packageName, installed, userId); + } + + @Override + @Deprecated + public final void finishPackageInstall(int token, boolean didLaunch) throws RemoteException { + mService.finishPackageInstall(token, didLaunch); + } +} diff --git a/services/core/java/com/android/server/pm/IncrementalProgressListener.java b/services/core/java/com/android/server/pm/IncrementalProgressListener.java index fa11924218d4..703bbda92182 100644 --- a/services/core/java/com/android/server/pm/IncrementalProgressListener.java +++ b/services/core/java/com/android/server/pm/IncrementalProgressListener.java @@ -33,7 +33,8 @@ final class IncrementalProgressListener extends IPackageLoadingProgressCallback. @Override public void onPackageLoadingProgressChanged(float progress) { - PackageStateInternal packageState = mPm.getPackageStateInternal(mPackageName); + PackageStateInternal packageState = mPm.snapshotComputer() + .getPackageStateInternal(mPackageName); if (packageState == null) { return; } diff --git a/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java b/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java index 6dbe9b6f89f6..f452b2967327 100644 --- a/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java +++ b/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java @@ -170,7 +170,7 @@ final class InitAndSystemPackageHelper { } } OverlayConfig overlayConfig = OverlayConfig.initializeSystemInstance( - consumer -> mPm.forEachPackage( + consumer -> mPm.forEachPackage(mPm.snapshotComputer(), pkg -> consumer.accept(pkg, pkg.isSystem(), apkInApexPreInstalledPaths.get(pkg.getPackageName())))); // Prune any system packages that no longer exist. diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 8667ffd7930c..b39b24f6defa 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -527,8 +527,10 @@ final class InstallPackageHelper { + android.Manifest.permission.INSTALL_PACKAGES + "."); } PackageSetting pkgSetting; - mPm.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, - true /* checkShell */, "installExistingPackage for user " + userId); + final Computer preLockSnapshot = mPm.snapshotComputer(); + preLockSnapshot.enforceCrossUserPermission(callingUid, userId, + true /* requireFullPermission */, true /* checkShell */, + "installExistingPackage for user " + userId); if (mPm.isUserRestricted(userId, UserManager.DISALLOW_INSTALL_APPS)) { return PackageManager.INSTALL_FAILED_USER_RESTRICTED; } @@ -543,11 +545,12 @@ final class InstallPackageHelper { // writer synchronized (mPm.mLock) { + final Computer snapshot = mPm.snapshotComputer(); pkgSetting = mPm.mSettings.getPackageLPr(packageName); if (pkgSetting == null) { return PackageManager.INSTALL_FAILED_INVALID_URI; } - if (!mPm.canViewInstantApps(callingUid, UserHandle.getUserId(callingUid))) { + if (!snapshot.canViewInstantApps(callingUid, UserHandle.getUserId(callingUid))) { // only allow the existing package to be used if it's installed as a full // application for at least one user boolean installAllowed = false; @@ -597,7 +600,8 @@ final class InstallPackageHelper { mAppDataHelper.prepareAppDataAfterInstallLIF(pkgSetting.getPkg()); } } - mPm.sendPackageAddedForUser(packageName, pkgSetting, userId, DataLoaderType.NONE); + mPm.sendPackageAddedForUser(mPm.snapshotComputer(), packageName, pkgSetting, userId, + DataLoaderType.NONE); synchronized (mPm.mLock) { mPm.updateSequenceNumberLP(pkgSetting, new int[]{ userId }); } @@ -1902,8 +1906,8 @@ final class InstallPackageHelper { AndroidPackage oldPackage = mPm.mPackages.get(packageName); // Set the update and install times - PackageStateInternal deletedPkgSetting = mPm.getPackageStateInternal( - oldPackage.getPackageName()); + PackageStateInternal deletedPkgSetting = mPm.snapshotComputer() + .getPackageStateInternal(oldPackage.getPackageName()); reconciledPkg.mPkgSetting .setFirstInstallTimeFromReplaced(deletedPkgSetting, request.mAllUsers) .setLastUpdateTime(System.currentTimeMillis()); @@ -2571,9 +2575,10 @@ final class InstallPackageHelper { size = i; mPm.mPendingBroadcasts.clear(); } + final Computer snapshot = mPm.snapshotComputer(); // Send broadcasts for (int i = 0; i < size; i++) { - mPm.sendPackageChangedBroadcast(packages[i], true /* dontKillApp */, + mPm.sendPackageChangedBroadcast(snapshot, packages[i], true /* dontKillApp */, components[i], uids[i], null /* reason */); } Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); @@ -2592,7 +2597,7 @@ final class InstallPackageHelper { final boolean update = res.mRemovedInfo != null && res.mRemovedInfo.mRemovedPackage != null; final String packageName = res.mName; final PackageStateInternal pkgSetting = - succeeded ? mPm.getPackageStateInternal(packageName) : null; + succeeded ? mPm.snapshotComputer().getPackageStateInternal(packageName) : null; final boolean removedBeforeUpdate = (pkgSetting == null) || (pkgSetting.isSystem() && !pkgSetting.getPath().getPath().equals( res.mPkg.getPath())); @@ -2690,9 +2695,9 @@ final class InstallPackageHelper { // sendPackageAddedForNewUsers also deals with system apps int appId = UserHandle.getAppId(res.mUid); boolean isSystem = res.mPkg.isSystem(); - mPm.sendPackageAddedForNewUsers(packageName, isSystem || virtualPreload, - virtualPreload /*startReceiver*/, appId, firstUserIds, firstInstantUserIds, - dataLoaderType); + mPm.sendPackageAddedForNewUsers(mPm.snapshotComputer(), packageName, + isSystem || virtualPreload, virtualPreload /*startReceiver*/, appId, + firstUserIds, firstInstantUserIds, dataLoaderType); // Send added for users that don't see the package for the first time Bundle extras = new Bundle(); @@ -2705,7 +2710,8 @@ final class InstallPackageHelper { final SparseArray newBroadcastAllowList; synchronized (mPm.mLock) { newBroadcastAllowList = mPm.mAppsFilter.getVisibilityAllowList( - mPm.getPackageStateInternal(packageName, Process.SYSTEM_UID), + mPm.snapshotComputer() + .getPackageStateInternal(packageName, Process.SYSTEM_UID), updateUserIds, mPm.mSettings.getPackagesLocked()); } mPm.sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, packageName, @@ -2807,11 +2813,12 @@ final class InstallPackageHelper { } } else if (!ArrayUtils.isEmpty(res.mLibraryConsumers)) { // if static shared lib // No need to kill consumers if it's installation of new version static shared lib. + final Computer snapshot = mPm.snapshotComputer(); final boolean dontKillApp = !update && res.mPkg.getStaticSharedLibName() != null; for (int i = 0; i < res.mLibraryConsumers.size(); i++) { AndroidPackage pkg = res.mLibraryConsumers.get(i); // send broadcast that all consumers of the static shared library have changed - mPm.sendPackageChangedBroadcast(pkg.getPackageName(), dontKillApp, + mPm.sendPackageChangedBroadcast(snapshot, pkg.getPackageName(), dontKillApp, new ArrayList<>(Collections.singletonList(pkg.getPackageName())), pkg.getUid(), null); } diff --git a/services/core/java/com/android/server/pm/ModuleInfoProvider.java b/services/core/java/com/android/server/pm/ModuleInfoProvider.java index 0ffc1ed9e90c..230f5558b37d 100644 --- a/services/core/java/com/android/server/pm/ModuleInfoProvider.java +++ b/services/core/java/com/android/server/pm/ModuleInfoProvider.java @@ -16,6 +16,7 @@ package com.android.server.pm; +import android.annotation.NonNull; import android.content.Context; import android.content.pm.IPackageManager; import android.content.pm.ModuleInfo; @@ -25,6 +26,7 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.os.RemoteException; +import android.os.ServiceManager; import android.os.UserHandle; import android.text.TextUtils; import android.util.ArrayMap; @@ -58,7 +60,7 @@ public class ModuleInfoProvider { private static final String MODULE_METADATA_KEY = "android.content.pm.MODULE_METADATA"; private final Context mContext; - private final IPackageManager mPackageManager; + private IPackageManager mPackageManager; private final ApexManager mApexManager; private final Map mModuleInfo; @@ -66,9 +68,8 @@ public class ModuleInfoProvider { private volatile boolean mMetadataLoaded; private volatile String mPackageName; - ModuleInfoProvider(Context context, IPackageManager packageManager) { + ModuleInfoProvider(Context context) { mContext = context; - mPackageManager = packageManager; mApexManager = ApexManager.getInstance(); mModuleInfo = new ArrayMap<>(); } @@ -77,12 +78,20 @@ public class ModuleInfoProvider { public ModuleInfoProvider( XmlResourceParser metadata, Resources resources, ApexManager apexManager) { mContext = null; - mPackageManager = null; mApexManager = apexManager; mModuleInfo = new ArrayMap<>(); loadModuleMetadata(metadata, resources); } + @NonNull + private IPackageManager getPackageManager() { + if (mPackageManager == null) { + mPackageManager = IPackageManager.Stub.asInterface( + ServiceManager.getService("package")); + } + return mPackageManager; + } + /** Called by the {@code PackageManager} when it has completed its boot sequence */ public void systemReady() { mPackageName = mContext.getResources().getString( @@ -95,7 +104,7 @@ public class ModuleInfoProvider { final Resources packageResources; final PackageInfo pi; try { - pi = mPackageManager.getPackageInfo(mPackageName, + pi = getPackageManager().getPackageInfo(mPackageName, PackageManager.GET_META_DATA, UserHandle.USER_SYSTEM); Context packageContext = mContext.createPackageContext(mPackageName, 0); @@ -183,7 +192,7 @@ public class ModuleInfoProvider { List allPackages; try { - allPackages = mPackageManager.getInstalledPackages( + allPackages = getPackageManager().getInstalledPackages( flags | PackageManager.MATCH_APEX, UserHandle.getCallingUserId()).getList(); } catch (RemoteException e) { Slog.w(TAG, "Unable to retrieve all package names", e); diff --git a/services/core/java/com/android/server/pm/MovePackageHelper.java b/services/core/java/com/android/server/pm/MovePackageHelper.java index 5fc90b1d994f..c5ca06cc7b84 100644 --- a/services/core/java/com/android/server/pm/MovePackageHelper.java +++ b/services/core/java/com/android/server/pm/MovePackageHelper.java @@ -57,6 +57,8 @@ import com.android.internal.os.SomeArgs; import com.android.internal.util.FrameworkStatsLog; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; +import com.android.server.pm.pkg.PackageStateInternal; +import com.android.server.pm.pkg.PackageStateUtils; import java.io.File; import java.util.Objects; @@ -77,81 +79,74 @@ public final class MovePackageHelper { final StorageManager storage = mPm.mInjector.getSystemService(StorageManager.class); final PackageManager pm = mPm.mContext.getPackageManager(); - final String currentVolumeUuid; - final File codeFile; - final InstallSource installSource; - final String packageAbiOverride; - final int appId; - final String seinfo; - final String label; - final int targetSdkVersion; - final PackageFreezer freezer; - final int[] installedUserIds; - final boolean isCurrentLocationExternal; + Computer snapshot = mPm.snapshotComputer(); + final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); + if (packageState == null + || packageState.getPkg() == null + || snapshot.shouldFilterApplication(packageState, callingUid, user.getIdentifier())) { + throw new PackageManagerException(MOVE_FAILED_DOESNT_EXIST, "Missing package"); + } + final AndroidPackage pkg = packageState.getPkg(); + if (pkg.isSystem()) { + throw new PackageManagerException(MOVE_FAILED_SYSTEM_PACKAGE, + "Cannot move system application"); + } + + final boolean isInternalStorage = VolumeInfo.ID_PRIVATE_INTERNAL.equals(volumeUuid); + final boolean allow3rdPartyOnInternal = mPm.mContext.getResources().getBoolean( + com.android.internal.R.bool.config_allow3rdPartyAppOnInternal); + if (isInternalStorage && !allow3rdPartyOnInternal) { + throw new PackageManagerException(MOVE_FAILED_3RD_PARTY_NOT_ALLOWED_ON_INTERNAL, + "3rd party apps are not allowed on internal storage"); + } + + + final String currentVolumeUuid = packageState.getVolumeUuid(); + + final File probe = new File(pkg.getPath()); + final File probeOat = new File(probe, "oat"); + if (!probe.isDirectory() || !probeOat.isDirectory()) { + throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR, + "Move only supported for modern cluster style installs"); + } + + if (Objects.equals(currentVolumeUuid, volumeUuid)) { + throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR, + "Package already moved to " + volumeUuid); + } + if (!pkg.isExternalStorage() + && mPm.isPackageDeviceAdminOnAnyUser(snapshot, packageName)) { + throw new PackageManagerException(MOVE_FAILED_DEVICE_ADMIN, + "Device admin cannot be moved"); + } + + if (snapshot.getFrozenPackages().containsKey(packageName)) { + throw new PackageManagerException(MOVE_FAILED_OPERATION_PENDING, + "Failed to move already frozen package"); + } + + final boolean isCurrentLocationExternal = pkg.isExternalStorage(); + final File codeFile = new File(pkg.getPath()); + final InstallSource installSource = packageState.getInstallSource(); + final String packageAbiOverride = packageState.getCpuAbiOverride(); + final int appId = UserHandle.getAppId(pkg.getUid()); + final String seinfo = AndroidPackageUtils.getSeInfo(pkg, packageState); + final String label = String.valueOf(pm.getApplicationLabel( + AndroidPackageUtils.generateAppInfoWithoutState(pkg))); + final int targetSdkVersion = pkg.getTargetSdkVersion(); + final int[] installedUserIds = PackageStateUtils.queryInstalledUsers(packageState, + mPm.mUserManager.getUserIds(), true); final String fromCodePath; + if (codeFile.getParentFile().getName().startsWith( + PackageManagerService.RANDOM_DIR_PREFIX)) { + fromCodePath = codeFile.getParentFile().getAbsolutePath(); + } else { + fromCodePath = codeFile.getAbsolutePath(); + } - // reader + final PackageFreezer freezer; synchronized (mPm.mLock) { - final AndroidPackage pkg = mPm.mPackages.get(packageName); - final PackageSetting ps = mPm.mSettings.getPackageLPr(packageName); - if (pkg == null - || ps == null - || mPm.shouldFilterApplication(ps, callingUid, user.getIdentifier())) { - throw new PackageManagerException(MOVE_FAILED_DOESNT_EXIST, "Missing package"); - } - if (pkg.isSystem()) { - throw new PackageManagerException(MOVE_FAILED_SYSTEM_PACKAGE, - "Cannot move system application"); - } - - final boolean isInternalStorage = VolumeInfo.ID_PRIVATE_INTERNAL.equals(volumeUuid); - final boolean allow3rdPartyOnInternal = mPm.mContext.getResources().getBoolean( - com.android.internal.R.bool.config_allow3rdPartyAppOnInternal); - if (isInternalStorage && !allow3rdPartyOnInternal) { - throw new PackageManagerException(MOVE_FAILED_3RD_PARTY_NOT_ALLOWED_ON_INTERNAL, - "3rd party apps are not allowed on internal storage"); - } - - currentVolumeUuid = ps.getVolumeUuid(); - - final File probe = new File(pkg.getPath()); - final File probeOat = new File(probe, "oat"); - if (!probe.isDirectory() || !probeOat.isDirectory()) { - throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR, - "Move only supported for modern cluster style installs"); - } - - if (Objects.equals(currentVolumeUuid, volumeUuid)) { - throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR, - "Package already moved to " + volumeUuid); - } - if (!pkg.isExternalStorage() && mPm.isPackageDeviceAdminOnAnyUser(packageName)) { - throw new PackageManagerException(MOVE_FAILED_DEVICE_ADMIN, - "Device admin cannot be moved"); - } - - if (mPm.mFrozenPackages.containsKey(packageName)) { - throw new PackageManagerException(MOVE_FAILED_OPERATION_PENDING, - "Failed to move already frozen package"); - } - - isCurrentLocationExternal = pkg.isExternalStorage(); - codeFile = new File(pkg.getPath()); - installSource = ps.getInstallSource(); - packageAbiOverride = ps.getCpuAbiOverride(); - appId = UserHandle.getAppId(pkg.getUid()); - seinfo = AndroidPackageUtils.getSeInfo(pkg, ps); - label = String.valueOf(pm.getApplicationLabel( - AndroidPackageUtils.generateAppInfoWithoutState(pkg))); - targetSdkVersion = pkg.getTargetSdkVersion(); freezer = mPm.freezePackage(packageName, "movePackageInternal"); - installedUserIds = ps.queryInstalledUsers(mPm.mUserManager.getUserIds(), true); - if (codeFile.getParentFile().getName().startsWith( - PackageManagerService.RANDOM_DIR_PREFIX)) { - fromCodePath = codeFile.getParentFile().getAbsolutePath(); - } else { - fromCodePath = codeFile.getAbsolutePath(); - } } final Bundle extras = new Bundle(); diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java index bd0091480caf..cc4a76034b2b 100644 --- a/services/core/java/com/android/server/pm/OtaDexoptService.java +++ b/services/core/java/com/android/server/pm/OtaDexoptService.java @@ -131,8 +131,9 @@ public class OtaDexoptService extends IOtaDexopt.Stub { Predicate isPlatformPackage = pkgSetting -> PLATFORM_PACKAGE_NAME.equals(pkgSetting.getPkg().getPackageName()); // Important: the packages we need to run with ab-ota compiler-reason. + final Computer snapshot = mPackageManagerService.snapshotComputer(); final Collection allPackageStates = - mPackageManagerService.getPackageStates().values(); + snapshot.getPackageStates().values(); important = DexOptHelper.getPackagesForDexopt(allPackageStates,mPackageManagerService, DEBUG_DEXOPT); // Remove Platform Package from A/B OTA b/160735835. @@ -165,7 +166,7 @@ public class OtaDexoptService extends IOtaDexopt.Stub { Log.i(TAG, "Low on space, deleting oat files in an attempt to free up space: " + DexOptHelper.packagesToString(others)); for (PackageStateInternal pkg : others) { - mPackageManagerService.deleteOatArtifactsOfPackage(pkg.getPackageName()); + mPackageManagerService.deleteOatArtifactsOfPackage(snapshot, pkg.getPackageName()); } } long spaceAvailableNow = getAvailableSpace(); diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 6613f016f66a..4e702e2c9df5 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -597,8 +597,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements String installerAttributionTag, int userId) throws IOException { final int callingUid = Binder.getCallingUid(); - mPm.enforceCrossUserPermission( - callingUid, userId, true, true, "createSession"); + final Computer snapshot = mPm.snapshotComputer(); + snapshot.enforceCrossUserPermission(callingUid, userId, true, true, "createSession"); if (mPm.isUserRestricted(userId, UserManager.DISALLOW_INSTALL_APPS)) { throw new SecurityException("User restriction prevents installing"); @@ -663,7 +663,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements params.installFlags &= ~PackageManager.INSTALL_ALL_USERS; params.installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; if ((params.installFlags & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0 - && !mPm.isCallerVerifier(callingUid)) { + && !mPm.isCallerVerifier(snapshot, callingUid)) { params.installFlags &= ~PackageManager.INSTALL_VIRTUAL_PRELOAD; } if (mContext.checkCallingOrSelfPermission( @@ -676,7 +676,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements String originatingPackageName = null; if (params.originatingUid != SessionParams.UID_UNKNOWN && params.originatingUid != callingUid) { - String[] packages = mPm.mIPackageManager.getPackagesForUid(params.originatingUid); + String[] packages = snapshot.getPackagesForUid(params.originatingUid); if (packages != null && packages.length > 0) { // Choose an arbitrary representative package in the case of a shared UID. originatingPackageName = packages[0]; @@ -727,7 +727,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements if ((params.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0 && !isCalledBySystemOrShell(callingUid) - && (mPm.mIPackageManager.getFlagsForUid(callingUid) & ApplicationInfo.FLAG_SYSTEM) + && (snapshot.getFlagsForUid(callingUid) & ApplicationInfo.FLAG_SYSTEM) == 0) { throw new SecurityException( "Only system apps could use the PackageManager.INSTALL_INSTANT_APP flag."); @@ -1038,11 +1038,12 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements return "smdl" + sessionId + ".tmp"; } - private boolean shouldFilterSession(int uid, SessionInfo info) { + private boolean shouldFilterSession(@NonNull Computer snapshot, int uid, SessionInfo info) { if (info == null) { return false; } - return uid != info.getInstallerUid() && !mPm.canQueryPackage(uid, info.getAppPackageName()); + return uid != info.getInstallerUid() + && !snapshot.canQueryPackage(uid, info.getAppPackageName()); } @Override @@ -1055,7 +1056,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements ? session.generateInfoForCaller(true /* includeIcon */, callingUid) : null; } - return shouldFilterSession(callingUid, result) ? null : result; + return shouldFilterSession(mPm.snapshotComputer(), callingUid, result) ? null : result; } @Override @@ -1070,15 +1071,16 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } } } - result.removeIf(info -> shouldFilterSession(callingUid, info)); + final Computer snapshot = mPm.snapshotComputer(); + result.removeIf(info -> shouldFilterSession(snapshot, callingUid, info)); return new ParceledListSlice<>(result); } @Override public ParceledListSlice getAllSessions(int userId) { final int callingUid = Binder.getCallingUid(); - mPm.enforceCrossUserPermission( - callingUid, userId, true, false, "getAllSessions"); + final Computer snapshot = mPm.snapshotComputer(); + snapshot.enforceCrossUserPermission(callingUid, userId, true, false, "getAllSessions"); final List result = new ArrayList<>(); synchronized (mSessions) { @@ -1090,15 +1092,16 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } } } - result.removeIf(info -> shouldFilterSession(callingUid, info)); + result.removeIf(info -> shouldFilterSession(snapshot, callingUid, info)); return new ParceledListSlice<>(result); } @Override public ParceledListSlice getMySessions(String installerPackageName, int userId) { - mPm.enforceCrossUserPermission( - Binder.getCallingUid(), userId, true, false, "getMySessions"); - mAppOps.checkPackage(Binder.getCallingUid(), installerPackageName); + final Computer snapshot = mPm.snapshotComputer(); + final int callingUid = Binder.getCallingUid(); + snapshot.enforceCrossUserPermission(callingUid, userId, true, false, "getMySessions"); + mAppOps.checkPackage(callingUid, installerPackageName); final List result = new ArrayList<>(); synchronized (mSessions) { @@ -1120,8 +1123,9 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements @Override public void uninstall(VersionedPackage versionedPackage, String callerPackageName, int flags, IntentSender statusReceiver, int userId) { + final Computer snapshot = mPm.snapshotComputer(); final int callingUid = Binder.getCallingUid(); - mPm.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall"); + snapshot.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall"); if ((callingUid != Process.SHELL_UID) && (callingUid != Process.ROOT_UID)) { mAppOps.checkPackage(callingUid, callerPackageName); } @@ -1154,8 +1158,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements .setAdmin(callerPackageName) .write(); } else { - ApplicationInfo appInfo = mPm.mIPackageManager - .getApplicationInfo(callerPackageName, 0, userId); + ApplicationInfo appInfo = snapshot.getApplicationInfo(callerPackageName, 0, userId); if (appInfo.targetSdkVersion >= Build.VERSION_CODES.P) { mContext.enforceCallingOrSelfPermission(Manifest.permission.REQUEST_DELETE_PACKAGES, null); @@ -1174,7 +1177,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements String callerPackageName, IntentSender statusReceiver, int userId) { final int callingUid = Binder.getCallingUid(); mContext.enforceCallingOrSelfPermission(Manifest.permission.DELETE_PACKAGES, null); - mPm.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall"); + final Computer snapshot = mPm.snapshotComputer(); + snapshot.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall"); if ((callingUid != Process.SHELL_UID) && (callingUid != Process.ROOT_UID)) { mAppOps.checkPackage(callingUid, callerPackageName); } @@ -1206,8 +1210,9 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements @Override public void registerCallback(IPackageInstallerCallback callback, int userId) { - mPm.enforceCrossUserPermission( - Binder.getCallingUid(), userId, true, false, "registerCallback"); + final Computer snapshot = mPm.snapshotComputer(); + snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, + "registerCallback"); registerCallback(callback, eventUserId -> userId == eventUserId); } @@ -1295,13 +1300,13 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } } - private boolean shouldFilterSession(int uid, int sessionId) { + private boolean shouldFilterSession(@NonNull Computer snapshot, int uid, int sessionId) { final PackageInstallerSession session = getSession(sessionId); if (session == null) { return false; } return uid != session.getInstallerUid() - && !mPm.canQueryPackage(uid, session.getPackageName()); + && !snapshot.canQueryPackage(uid, session.getPackageName()); } static class PackageDeleteObserverAdapter extends PackageDeleteObserver { @@ -1454,11 +1459,12 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements final int sessionId = msg.arg1; final int userId = msg.arg2; final int n = mCallbacks.beginBroadcast(); + final Computer snapshot = mPm.snapshotComputer(); for (int i = 0; i < n; i++) { final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i); final BroadcastCookie cookie = (BroadcastCookie) mCallbacks.getBroadcastCookie(i); if (cookie.userCheck.test(userId) - && !shouldFilterSession(cookie.callingUid, sessionId)) { + && !shouldFilterSession(snapshot, cookie.callingUid, sessionId)) { try { invokeCallback(callback, msg); } catch (RemoteException ignored) { diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 35a7eaf29ddc..b3a2daebe99b 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -859,7 +859,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return USER_ACTION_NOT_NEEDED; } - if (mPm.isInstallDisabledForPackage(getInstallerPackageName(), mInstallerUid, userId)) { + if (snapshot.isInstallDisabledForPackage(getInstallerPackageName(), mInstallerUid, + userId)) { // show the installer to account for device poslicy or unknown sources use cases return USER_ACTION_REQUIRED; } @@ -3752,7 +3753,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { }; if (!manualStartAndDestroy) { - final PerUidReadTimeouts[] perUidReadTimeouts = mPm.getPerUidReadTimeouts(); + final PerUidReadTimeouts[] perUidReadTimeouts = + mPm.getPerUidReadTimeouts(mPm.snapshotComputer()); final StorageHealthCheckParams healthCheckParams = new StorageHealthCheckParams(); healthCheckParams.blockedTimeoutMs = INCREMENTAL_STORAGE_BLOCKED_TIMEOUT_MS; diff --git a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java new file mode 100644 index 000000000000..2b733754685e --- /dev/null +++ b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java @@ -0,0 +1,751 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.pm; + +import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; +import static android.content.pm.PackageManager.RESTRICTION_NONE; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.UserIdInt; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.AuxiliaryResolveInfo; +import android.content.pm.Checksum; +import android.content.pm.IOnChecksumsReadyListener; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal; +import android.content.pm.ProcessInfo; +import android.content.pm.ProviderInfo; +import android.content.pm.ResolveInfo; +import android.content.pm.SuspendDialogInfo; +import android.os.Binder; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Process; +import android.os.storage.StorageManager; +import android.util.ArrayMap; +import android.util.ArraySet; +import android.util.SparseArray; + +import com.android.server.pm.dex.DexManager; +import com.android.server.pm.dex.DynamicCodeLogger; +import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.permission.PermissionManagerServiceInternal; +import com.android.server.pm.pkg.AndroidPackageApi; +import com.android.server.pm.pkg.PackageStateInternal; +import com.android.server.pm.pkg.PackageStateUtils; +import com.android.server.pm.pkg.SharedUserApi; +import com.android.server.pm.pkg.component.ParsedMainComponent; +import com.android.server.pm.pkg.mutate.PackageStateMutator; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.Executor; +import java.util.function.Consumer; + +/** + * Internal manager variant of {@link IPackageManagerBase}. See that class for info. + * {@link PackageManagerInternal} should eventually passing in a snapshot instance, deprecating + * this class, but that requires much larger refactor. + */ +abstract class PackageManagerInternalBase extends PackageManagerInternal { + + @NonNull + private final PackageManagerService mService; + + public PackageManagerInternalBase(@NonNull PackageManagerService service) { + mService = service; + } + + @NonNull protected abstract Context getContext(); + @NonNull protected abstract PermissionManagerServiceInternal getPermissionManager(); + @NonNull protected abstract AppDataHelper getAppDataHelper(); + @NonNull protected abstract PackageObserverHelper getPackageObserverHelper(); + @NonNull protected abstract ResolveIntentHelper getResolveIntentHelper(); + @NonNull protected abstract SuspendPackageHelper getSuspendPackageHelper(); + @NonNull protected abstract ProtectedPackages getProtectedPackages(); + @NonNull protected abstract UserNeedsBadgingCache getUserNeedsBadging(); + @NonNull protected abstract InstantAppRegistry getInstantAppRegistry(); + @NonNull protected abstract ApexManager getApexManager(); + @NonNull protected abstract DexManager getDexManager(); + + @Override + public final Computer snapshot() { + return mService.snapshotComputer(); + } + + @Override + @Deprecated + public final List getInstalledApplications( + @PackageManager.ApplicationInfoFlagsBits long flags, int userId, int callingUid) { + return snapshot().getInstalledApplications(flags, userId, callingUid); + } + + @Override + @Deprecated + public final boolean isInstantApp(String packageName, int userId) { + return snapshot().isInstantApp(packageName, userId); + } + + @Override + @Deprecated + public final String getInstantAppPackageName(int uid) { + return snapshot().getInstantAppPackageName(uid); + } + + @Override + @Deprecated + public final boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) { + return snapshot().filterAppAccess(pkg, callingUid, userId); + } + + @Override + @Deprecated + public final boolean filterAppAccess(String packageName, int callingUid, int userId) { + return snapshot().filterAppAccess(packageName, callingUid, userId); + } + + @Override + @Deprecated + public final boolean filterAppAccess(int uid, int callingUid) { + return snapshot().filterAppAccess(uid, callingUid); + } + + @Nullable + @Override + @Deprecated + public final int[] getVisibilityAllowList(@NonNull String packageName, int userId) { + return snapshot().getVisibilityAllowList(packageName, userId); + } + + @Override + @Deprecated + public final boolean canQueryPackage(int callingUid, @Nullable String packageName) { + return snapshot().canQueryPackage(callingUid, packageName); + } + + @Override + @Deprecated + public final AndroidPackage getPackage(String packageName) { + return snapshot().getPackage(packageName); + } + + @Nullable + @Override + @Deprecated + public final AndroidPackageApi getAndroidPackage(@NonNull String packageName) { + return snapshot().getPackage(packageName); + } + + @Override + @Deprecated + public final AndroidPackage getPackage(int uid) { + return snapshot().getPackage(uid); + } + + @Override + @Deprecated + public final List getPackagesForAppId(int appId) { + return snapshot().getPackagesForAppId(appId); + } + + @Nullable + @Override + @Deprecated + public final PackageStateInternal getPackageStateInternal(String packageName) { + return snapshot().getPackageStateInternal(packageName); + } + + @NonNull + @Override + @Deprecated + public final ArrayMap getPackageStates() { + return snapshot().getPackageStates(); + } + + @Override + @Deprecated + public final void removePackageListObserver(PackageListObserver observer) { + getPackageObserverHelper().removeObserver(observer); + } + + @Override + @Deprecated + public final PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) { + return snapshot().getDisabledSystemPackage(packageName); + } + + @Override + @Deprecated + public final @NonNull String[] getKnownPackageNames(int knownPackage, int userId) { + return mService.getKnownPackageNamesInternal(snapshot(), knownPackage, userId); + } + + @Override + @Deprecated + public final void setKeepUninstalledPackages(final List packageList) { + mService.setKeepUninstalledPackagesInternal(snapshot(), packageList); + } + + @Override + @Deprecated + public final boolean isPermissionsReviewRequired(String packageName, int userId) { + return getPermissionManager().isPermissionsReviewRequired(packageName, userId); + } + + @Override + @Deprecated + public final PackageInfo getPackageInfo(String packageName, + @PackageManager.PackageInfoFlagsBits long flags, int filterCallingUid, int userId) { + return snapshot().getPackageInfoInternal(packageName, + PackageManager.VERSION_CODE_HIGHEST, flags, filterCallingUid, userId); + } + + @Override + @Deprecated + public final Bundle getSuspendedPackageLauncherExtras(String packageName, int userId) { + return getSuspendPackageHelper().getSuspendedPackageLauncherExtras(snapshot(), packageName, + userId, Binder.getCallingUid()); + } + + @Override + @Deprecated + public final boolean isPackageSuspended(String packageName, int userId) { + return getSuspendPackageHelper().isPackageSuspended(snapshot(), packageName, userId, + Binder.getCallingUid()); + } + + @Override + @Deprecated + public final void removeNonSystemPackageSuspensions(String packageName, int userId) { + getSuspendPackageHelper().removeSuspensionsBySuspendingPackage(snapshot(), + new String[]{packageName}, + (suspendingPackage) -> !PackageManagerService.PLATFORM_PACKAGE_NAME.equals( + suspendingPackage), + userId); + } + + @Override + @Deprecated + public final void removeDistractingPackageRestrictions(String packageName, int userId) { + mService.removeDistractingPackageRestrictions(snapshot(), new String[]{packageName}, + userId); + } + + @Override + @Deprecated + public final void removeAllDistractingPackageRestrictions(int userId) { + mService.removeAllDistractingPackageRestrictions(snapshot(), userId); + } + + @Override + @Deprecated + public final String getSuspendingPackage(String suspendedPackage, int userId) { + return getSuspendPackageHelper().getSuspendingPackage(snapshot(), suspendedPackage, userId, + Binder.getCallingUid()); + } + + @Override + @Deprecated + public final SuspendDialogInfo getSuspendedDialogInfo(String suspendedPackage, + String suspendingPackage, int userId) { + return getSuspendPackageHelper().getSuspendedDialogInfo(snapshot(), suspendedPackage, + suspendingPackage, userId, Binder.getCallingUid()); + } + + @Override + @Deprecated + public final int getDistractingPackageRestrictions(String packageName, int userId) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); + return (packageState == null) ? RESTRICTION_NONE + : packageState.getUserStateOrDefault(userId).getDistractionFlags(); + } + + @Override + @Deprecated + public final int getPackageUid(String packageName, + @PackageManager.PackageInfoFlagsBits long flags, int userId) { + return snapshot().getPackageUidInternal(packageName, flags, userId, Process.SYSTEM_UID); + } + + @Override + @Deprecated + public final ApplicationInfo getApplicationInfo(String packageName, + @PackageManager.ApplicationInfoFlagsBits long flags, int filterCallingUid, int userId) { + return snapshot().getApplicationInfoInternal(packageName, flags, filterCallingUid, userId); + } + + @Override + @Deprecated + public final ActivityInfo getActivityInfo(ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, int filterCallingUid, int userId) { + return snapshot().getActivityInfoInternal(component, flags, filterCallingUid, userId); + } + + @Override + @Deprecated + public final List queryIntentActivities( + Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, + int filterCallingUid, int userId) { + return snapshot().queryIntentActivitiesInternal(intent, resolvedType, flags, userId); + } + + @Override + @Deprecated + public final List queryIntentReceivers(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, + int filterCallingUid, int userId) { + return getResolveIntentHelper().queryIntentReceiversInternal( + snapshot(), intent, resolvedType, flags, userId, filterCallingUid); + } + + @Override + @Deprecated + public final List queryIntentServices( + Intent intent, @PackageManager.ResolveInfoFlagsBits long flags, int callingUid, + int userId) { + final String resolvedType = intent.resolveTypeIfNeeded(getContext().getContentResolver()); + return snapshot().queryIntentServicesInternal(intent, resolvedType, flags, userId, + callingUid, false); + } + + @Override + @Deprecated + public final ComponentName getHomeActivitiesAsUser(List allHomeCandidates, + int userId) { + return snapshot().getHomeActivitiesAsUser(allHomeCandidates, userId); + } + + @Override + @Deprecated + public final ComponentName getDefaultHomeActivity(int userId) { + return snapshot().getDefaultHomeActivity(userId); + } + + @Override + @Deprecated + public final ComponentName getSystemUiServiceComponent() { + return ComponentName.unflattenFromString(getContext().getResources().getString( + com.android.internal.R.string.config_systemUIServiceComponent)); + } + + @Override + @Deprecated + public final void setDeviceOwnerProtectedPackages( + String deviceOwnerPackageName, List packageNames) { + getProtectedPackages().setDeviceOwnerProtectedPackages( + deviceOwnerPackageName, packageNames); + } + + @Override + @Deprecated + public final boolean isPackageDataProtected(int userId, String packageName) { + return getProtectedPackages().isPackageDataProtected(userId, packageName); + } + + @Override + @Deprecated + public final boolean isPackageStateProtected(String packageName, int userId) { + return getProtectedPackages().isPackageStateProtected(userId, packageName); + } + + @Override + @Deprecated + public final boolean isPackageEphemeral(int userId, String packageName) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); + return packageState != null + && packageState.getUserStateOrDefault(userId).isInstantApp(); + } + + @Override + @Deprecated + public final boolean wasPackageEverLaunched(String packageName, int userId) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); + if (packageState == null) { + throw new IllegalArgumentException("Unknown package: " + packageName); + } + return !packageState.getUserStateOrDefault(userId).isNotLaunched(); + } + + @Override + @Deprecated + public final boolean isEnabledAndMatches(ParsedMainComponent component, long flags, int userId) { + return PackageStateUtils.isEnabledAndMatches( + getPackageStateInternal(component.getPackageName()), component, flags, userId); + } + + @Override + @Deprecated + public final boolean userNeedsBadging(int userId) { + return getUserNeedsBadging().get(userId); + } + + @Override + @Deprecated + public final String getNameForUid(int uid) { + return snapshot().getNameForUid(uid); + } + + @Override + @Deprecated + public final void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj, + Intent origIntent, String resolvedType, String callingPackage, + @Nullable String callingFeatureId, boolean isRequesterInstantApp, + Bundle verificationBundle, int userId) { + mService.requestInstantAppResolutionPhaseTwo(responseObj, origIntent, + resolvedType, callingPackage, callingFeatureId, isRequesterInstantApp, + verificationBundle, userId); + } + + @Override + @Deprecated + public final void grantImplicitAccess(int userId, Intent intent, + int recipientAppId, int visibleUid, boolean direct) { + grantImplicitAccess(userId, intent, recipientAppId, visibleUid, direct, + false /* retainOnUpdate */); + } + + @Override + @Deprecated + public final void grantImplicitAccess(int userId, Intent intent, + int recipientAppId, int visibleUid, boolean direct, boolean retainOnUpdate) { + mService.grantImplicitAccess(snapshot(), userId, intent, + recipientAppId, visibleUid, direct, retainOnUpdate); + } + + @Override + @Deprecated + public final boolean isInstantAppInstallerComponent(ComponentName component) { + final ActivityInfo instantAppInstallerActivity = mService.mInstantAppInstallerActivity; + return instantAppInstallerActivity != null + && instantAppInstallerActivity.getComponentName().equals(component); + } + + @Override + @Deprecated + public final void pruneInstantApps() { + getInstantAppRegistry().pruneInstantApps(snapshot()); + } + + @Override + @Deprecated + public final String getSetupWizardPackageName() { + return mService.mSetupWizardPackage; + } + + @Override + @Deprecated + public final ResolveInfo resolveIntent(Intent intent, String resolvedType, + @PackageManager.ResolveInfoFlagsBits long flags, + @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags, int userId, + boolean resolveForStart, int filterCallingUid) { + return getResolveIntentHelper().resolveIntentInternal(snapshot(), + intent, resolvedType, flags, privateResolveFlags, userId, resolveForStart, + filterCallingUid); + } + + @Override + @Deprecated + public final ResolveInfo resolveService(Intent intent, String resolvedType, + @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) { + return getResolveIntentHelper().resolveServiceInternal(snapshot(), intent, + resolvedType, flags, userId, callingUid); + } + + @Override + @Deprecated + public final ProviderInfo resolveContentProvider(String name, + @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) { + return snapshot().resolveContentProvider(name, flags, userId,callingUid); + } + + @Override + @Deprecated + public final int getUidTargetSdkVersion(int uid) { + return snapshot().getUidTargetSdkVersion(uid); + } + + @Override + @Deprecated + public final int getPackageTargetSdkVersion(String packageName) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); + if (packageState != null && packageState.getPkg() != null) { + return packageState.getPkg().getTargetSdkVersion(); + } + return Build.VERSION_CODES.CUR_DEVELOPMENT; + } + + @Override + @Deprecated + public final boolean canAccessInstantApps(int callingUid, @UserIdInt int userId) { + return snapshot().canViewInstantApps(callingUid, userId); + } + + @Override + @Deprecated + public final boolean canAccessComponent(int callingUid, @NonNull ComponentName component, + @UserIdInt int userId) { + return snapshot().canAccessComponent(callingUid, component, userId); + } + + @Override + @Deprecated + public final boolean hasInstantApplicationMetadata(String packageName, int userId) { + return getInstantAppRegistry().hasInstantApplicationMetadata(packageName, userId); + } + + @Override + @Deprecated + public final SparseArray getAppsWithSharedUserIds() { + return snapshot().getAppsWithSharedUserIds(); + } + + @Override + @NonNull + @Deprecated + public final String[] getSharedUserPackagesForPackage(String packageName, int userId) { + return snapshot().getSharedUserPackagesForPackage(packageName, userId); + } + + @Override + @Deprecated + public final ArrayMap getProcessesForUid(int uid) { + return snapshot().getProcessesForUid(uid); + } + + @Override + @Deprecated + public final int[] getPermissionGids(String permissionName, int userId) { + return getPermissionManager().getPermissionGids(permissionName, userId); + } + + @Override + @Deprecated + public final boolean isOnlyCoreApps() { + return mService.isOnlyCoreApps(); + } + + @Override + @Deprecated + public final void freeStorage(String volumeUuid, long bytes, + @StorageManager.AllocateFlags int flags) throws IOException { + mService.freeStorage(volumeUuid, bytes, flags); + } + + @Override + @Deprecated + public final void freeAllAppCacheAboveQuota(@NonNull String volumeUuid) throws IOException { + mService.freeAllAppCacheAboveQuota(volumeUuid); + } + + @Override + @Deprecated + public final void forEachPackageSetting(Consumer actionLocked) { + mService.forEachPackageSetting(actionLocked); + } + + @Override + @Deprecated + public final void forEachPackageState(Consumer action) { + mService.forEachPackageState(snapshot(), action); + } + + @Override + @Deprecated + public final void forEachPackage(Consumer action) { + mService.forEachPackage(snapshot(), action); + } + + @Override + @Deprecated + public final void forEachInstalledPackage(@NonNull Consumer action, + @UserIdInt int userId) { + mService.forEachInstalledPackage(snapshot(), action, userId); + } + + @Override + @Deprecated + public final ArraySet getEnabledComponents(String packageName, int userId) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); + if (packageState == null) { + return new ArraySet<>(); + } + return packageState.getUserStateOrDefault(userId).getEnabledComponents(); + } + + @Override + @Deprecated + public final ArraySet getDisabledComponents(String packageName, int userId) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); + if (packageState == null) { + return new ArraySet<>(); + } + return packageState.getUserStateOrDefault(userId).getDisabledComponents(); + } + + @Override + @Deprecated + public final @PackageManager.EnabledState int getApplicationEnabledState( + String packageName, int userId) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); + if (packageState == null) { + return COMPONENT_ENABLED_STATE_DEFAULT; + } + return packageState.getUserStateOrDefault(userId).getEnabledState(); + } + + @Override + @Deprecated + public final @PackageManager.EnabledState int getComponentEnabledSetting( + @NonNull ComponentName componentName, int callingUid, int userId) { + return snapshot().getComponentEnabledSettingInternal( + componentName, callingUid, userId); + } + + @Override + @Deprecated + public final void setEnableRollbackCode(int token, int enableRollbackCode) { + mService.setEnableRollbackCode(token, enableRollbackCode); + } + + @Override + @Deprecated + public final void finishPackageInstall(int token, boolean didLaunch) { + mService.finishPackageInstall(token, didLaunch); + } + + @Override + @Deprecated + public final boolean isApexPackage(String packageName) { + return getApexManager().isApexPackage(packageName); + } + + @Override + @Deprecated + public final List getApksInApex(String apexPackageName) { + return getApexManager().getApksInApex(apexPackageName); + } + + @Override + @Deprecated + public final boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) { + return snapshot().isCallerInstallerOfRecord(pkg, callingUid); + } + + @Override + @Deprecated + public final List getMimeGroup(String packageName, String mimeGroup) { + return mService.getMimeGroupInternal(snapshot(), packageName, mimeGroup); + } + + @Override + @Deprecated + public final boolean isSystemPackage(@NonNull String packageName) { + return packageName.equals(mService.ensureSystemPackageName(snapshot(), packageName)); + } + + @Override + @Deprecated + public final void unsuspendForSuspendingPackage(final String packageName, int affectedUser) { + mService.unsuspendForSuspendingPackage(snapshot(), packageName, affectedUser); + } + + @Override + @Deprecated + public final boolean isSuspendingAnyPackages(String suspendingPackage, int userId) { + return snapshot().isSuspendingAnyPackages(suspendingPackage, userId); + } + + @Override + @Deprecated + public final void requestChecksums(@NonNull String packageName, boolean includeSplits, + @Checksum.TypeMask int optional, @Checksum.TypeMask int required, + @Nullable List trustedInstallers, + @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId, + @NonNull Executor executor, @NonNull Handler handler) { + mService.requestChecksumsInternal(snapshot(), packageName, includeSplits, optional, + required, trustedInstallers, onChecksumsReadyListener, userId, executor, + handler); + } + + @Override + @Deprecated + public final boolean isPackageFrozen(@NonNull String packageName, + int callingUid, int userId) { + return snapshot().getPackageStartability(mService.getSafeMode(), packageName, callingUid, userId) + == PackageManagerService.PACKAGE_STARTABILITY_FROZEN; + } + + @Override + @Deprecated + public final long deleteOatArtifactsOfPackage(String packageName) { + return mService.deleteOatArtifactsOfPackage(snapshot(), packageName); + } + + @Override + @Deprecated + public final void reconcileAppsData(int userId, @StorageManager.StorageFlags int flags, + boolean migrateAppsData) { + getAppDataHelper().reconcileAppsData(userId, flags, migrateAppsData); + } + + @Override + @NonNull + public ArraySet getSharedUserPackages(int sharedUserAppId) { + return snapshot().getSharedUserPackages(sharedUserAppId); + } + + @Override + @Nullable + public SharedUserApi getSharedUserApi(int sharedUserAppId) { + return snapshot().getSharedUser(sharedUserAppId); + } + + @NonNull + @Override + @Deprecated + public final PackageStateMutator.InitialState recordInitialState() { + return mService.recordInitialState(); + } + + @Nullable + @Override + @Deprecated + public final PackageStateMutator.Result commitPackageStateMutation( + @Nullable PackageStateMutator.InitialState state, + @NonNull Consumer consumer) { + return mService.commitPackageStateMutation(state, consumer); + } + + @Override + @Deprecated + public final void shutdown() { + mService.shutdown(); + } + + @Override + @Deprecated + public final DynamicCodeLogger getDynamicCodeLogger() { + return getDexManager().getDynamicCodeLogger(); + } +} diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e20a861e2eae..99c9c689544d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -29,7 +29,6 @@ import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; import static android.content.pm.PackageManager.MATCH_FACTORY_ONLY; import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; import static android.content.pm.PackageManager.PERMISSION_GRANTED; -import static android.content.pm.PackageManager.RESTRICTION_NONE; import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; import static android.os.storage.StorageManager.FLAG_STORAGE_CE; import static android.os.storage.StorageManager.FLAG_STORAGE_DE; @@ -83,21 +82,15 @@ import android.content.pm.IDexModuleRegisterCallback; import android.content.pm.IOnChecksumsReadyListener; import android.content.pm.IPackageChangeObserver; import android.content.pm.IPackageDataObserver; -import android.content.pm.IPackageDeleteObserver; import android.content.pm.IPackageDeleteObserver2; import android.content.pm.IPackageInstallObserver2; -import android.content.pm.IPackageInstaller; import android.content.pm.IPackageLoadingProgressCallback; import android.content.pm.IPackageManager; import android.content.pm.IPackageMoveObserver; -import android.content.pm.IPackageStatsObserver; import android.content.pm.IncrementalStatesInfo; import android.content.pm.InstallSourceInfo; import android.content.pm.InstantAppInfo; import android.content.pm.InstantAppRequest; -import android.content.pm.InstrumentationInfo; -import android.content.pm.IntentFilterVerificationInfo; -import android.content.pm.KeySet; import android.content.pm.ModuleInfo; import android.content.pm.PackageChangeEvent; import android.content.pm.PackageInfo; @@ -109,11 +102,8 @@ import android.content.pm.PackageManagerInternal; import android.content.pm.PackagePartitions; import android.content.pm.ParceledListSlice; import android.content.pm.PermissionGroupInfo; -import android.content.pm.PermissionInfo; -import android.content.pm.ProcessInfo; import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; -import android.content.pm.ServiceInfo; import android.content.pm.SharedLibraryInfo; import android.content.pm.Signature; import android.content.pm.SigningDetails; @@ -122,7 +112,6 @@ import android.content.pm.TestUtilityService; import android.content.pm.UserInfo; import android.content.pm.VerifierDeviceIdentity; import android.content.pm.VersionedPackage; -import android.content.pm.dex.IArtManager; import android.content.pm.overlay.OverlayPaths; import android.content.pm.parsing.PackageLite; import android.content.res.Resources; @@ -213,7 +202,6 @@ import com.android.server.pm.Settings.VersionInfo; import com.android.server.pm.dex.ArtManagerService; import com.android.server.pm.dex.ArtUtils; import com.android.server.pm.dex.DexManager; -import com.android.server.pm.dex.DynamicCodeLogger; import com.android.server.pm.dex.ViewCompiler; import com.android.server.pm.parsing.PackageCacher; import com.android.server.pm.parsing.PackageInfoUtils; @@ -225,10 +213,7 @@ import com.android.server.pm.permission.LegacyPermissionManagerInternal; import com.android.server.pm.permission.LegacyPermissionManagerService; import com.android.server.pm.permission.PermissionManagerService; import com.android.server.pm.permission.PermissionManagerServiceInternal; -import com.android.server.pm.pkg.AndroidPackageApi; -import com.android.server.pm.pkg.PackageState; import com.android.server.pm.pkg.PackageStateInternal; -import com.android.server.pm.pkg.PackageStateUtils; import com.android.server.pm.pkg.PackageUserState; import com.android.server.pm.pkg.PackageUserStateInternal; import com.android.server.pm.pkg.SharedUserApi; @@ -413,7 +398,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService public @interface ScanFlags {} /** - * Used as the result code of the {@link #getPackageStartability}. + * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int, + * int)}. */ @IntDef(value = { PACKAGE_STARTABILITY_OK, @@ -426,40 +412,43 @@ public class PackageManagerService implements PackageSender, TestUtilityService public @interface PackageStartability {} /** - * Used as the result code of the {@link #getPackageStartability} to indicate - * the given package is allowed to start. + * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int, + * int)} to indicate the given package is allowed to start. */ public static final int PACKAGE_STARTABILITY_OK = 0; /** - * Used as the result code of the {@link #getPackageStartability} to indicate - * the given package is not allowed to start because it's not found + * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int, + * int)} to indicate the given package is not allowed to start because it's not found * (could be due to that package is invisible to the given user). */ public static final int PACKAGE_STARTABILITY_NOT_FOUND = 1; /** - * Used as the result code of the {@link #getPackageStartability} to indicate - * the given package is not allowed to start because it's not a system app - * and the system is running in safe mode. + * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int, + * int)} to indicate the given package is not allowed to start because it's not a system + * app and the system is running in safe mode. */ public static final int PACKAGE_STARTABILITY_NOT_SYSTEM = 2; /** - * Used as the result code of the {@link #getPackageStartability} to indicate - * the given package is not allowed to start because it's currently frozen. + * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int, + * int)} to indicate the given package is not allowed to start because it's currently + * frozen. */ public static final int PACKAGE_STARTABILITY_FROZEN = 3; /** - * Used as the result code of the {@link #getPackageStartability} to indicate - * the given package is not allowed to start because it doesn't support + * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int, + * int)} to indicate the given package is not allowed to start because it doesn't support * direct boot. */ public static final int PACKAGE_STARTABILITY_DIRECT_BOOT_UNSUPPORTED = 4; private static final String STATIC_SHARED_LIB_DELIMITER = "_"; - /** Extension of the compressed packages */ + /** + * Extension of the compressed packages + */ public final static String COMPRESSED_EXTENSION = ".gz"; /** Suffix of stub packages on the system partition */ public final static String STUB_SUFFIX = "-Stub"; @@ -644,9 +633,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService */ boolean mPromoteSystemApps; - // TODO: Make IPackageManager reference private to hide discouraged APIs - final IPackageManagerImpl mIPackageManager; - private final PackageManagerInternal mPmInternal; private final TestUtilityService mTestUtilityService; @Watched @@ -1057,9 +1043,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService // A lock-free cache for frequently called functions. private volatile Computer mSnapshotComputer; - // A trampoline that directs callers to either the live or snapshot computer. - final ComputerTracker mComputer = new ComputerTracker(this); - // If true, the snapshot is invalid (stale). The attribute is static since it may be // set from outside classes. The attribute may be set to true anywhere, although it // should only be set true while holding mLock. However, the attribute id guaranteed @@ -1088,6 +1071,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService * Return the cached computer. The method will rebuild the cached computer if necessary. * The live computer will be returned if snapshots are disabled. */ + @VisibleForTesting(visibility = Visibility.PACKAGE) + @NonNull public Computer snapshotComputer() { if (Thread.holdsLock(mLock)) { // If the current thread holds mLock then it may have modified state but not @@ -1247,15 +1232,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService ApkChecksums.Injector injector = new ApkChecksums.Injector( () -> mContext, () -> handler, - () -> mInjector.getIncrementalManager(), - () -> mPmInternal); + mInjector::getIncrementalManager, + () -> mInjector.getLocalService(PackageManagerInternal.class)); ApkChecksums.getChecksums(filesToChecksum, optional, required, installerPackageName, trustedCerts, onChecksumsReadyListener, injector); }); } - private void requestChecksumsInternal(@NonNull String packageName, boolean includeSplits, - @Checksum.TypeMask int optional, @Checksum.TypeMask int required, + void requestChecksumsInternal(@NonNull Computer snapshot, @NonNull String packageName, + boolean includeSplits, @Checksum.TypeMask int optional, @Checksum.TypeMask int required, @Nullable List trustedInstallers, @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId, @NonNull Executor executor, @NonNull Handler handler) { @@ -1264,13 +1249,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService Objects.requireNonNull(executor); Objects.requireNonNull(handler); - final ApplicationInfo applicationInfo = getApplicationInfoInternal(packageName, 0, + final ApplicationInfo applicationInfo = snapshot.getApplicationInfoInternal(packageName, 0, Binder.getCallingUid(), userId); if (applicationInfo == null) { throw new ParcelableException(new PackageManager.NameNotFoundException(packageName)); } - final InstallSourceInfo installSourceInfo = - mIPackageManager.getInstallSourceInfo(packageName); + final InstallSourceInfo installSourceInfo = snapshot.getInstallSourceInfo(packageName); final String installerPackageName = installSourceInfo != null ? installSourceInfo.getInitiatingPackageName() : null; @@ -1294,8 +1278,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService ApkChecksums.Injector injector = new ApkChecksums.Injector( () -> mContext, () -> handler, - () -> mInjector.getIncrementalManager(), - () -> mPmInternal); + mInjector::getIncrementalManager, + () -> mInjector.getLocalService(PackageManagerInternal.class)); ApkChecksums.getChecksums(filesToChecksum, optional, required, installerPackageName, trustedCerts, onChecksumsReadyListener, injector); }); @@ -1440,15 +1424,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService RuntimePermissionsPersistence.createInstance(), i.getPermissionManagerServiceInternal(), domainVerificationService, lock), - (i, pm) -> AppsFilter.create(pm.mPmInternal, i), + (i, pm) -> AppsFilter.create(i, i.getLocalService(PackageManagerInternal.class)), (i, pm) -> (PlatformCompat) ServiceManager.getService("platform_compat"), (i, pm) -> SystemConfig.getInstance(), (i, pm) -> new PackageDexOptimizer(i.getInstaller(), i.getInstallLock(), i.getContext(), "*dexopt*"), - (i, pm) -> new DexManager(i.getContext(), pm.mIPackageManager, - i.getPackageDexOptimizer(), i.getInstaller(), i.getInstallLock()), - (i, pm) -> new ArtManagerService(i.getContext(), pm.mIPackageManager, + (i, pm) -> new DexManager(i.getContext(), i.getPackageDexOptimizer(), i.getInstaller(), i.getInstallLock()), + (i, pm) -> new ArtManagerService(i.getContext(), i.getInstaller(), + i.getInstallLock()), (i, pm) -> ApexManager.getInstance(), (i, pm) -> new ViewCompiler(i.getInstallLock(), i.getInstaller()), (i, pm) -> (IncrementalManager) @@ -1470,7 +1454,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService i.getContext(), pm, i::getScanningPackageParser), (i, pm, cn) -> new InstantAppResolverConnection( i.getContext(), cn, Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE), - (i, pm) -> new ModuleInfoProvider(i.getContext(), pm.mIPackageManager), + (i, pm) -> new ModuleInfoProvider(i.getContext()), (i, pm) -> LegacyPermissionManagerService.create(i.getContext()), (i, pm) -> domainVerificationService, (i, pm) -> { @@ -1498,13 +1482,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService final CompatChange.ChangeListener selinuxChangeListener = packageName -> { synchronized (m.mInstallLock) { - final PackageStateInternal packageState = m.getPackageStateInternal(packageName); + final Computer snapshot = m.snapshotComputer(); + final PackageStateInternal packageState = + snapshot.getPackageStateInternal(packageName); if (packageState == null) { Slog.e(TAG, "Failed to find package setting " + packageName); return; } AndroidPackage pkg = packageState.getPkg(); - SharedUserApi sharedUser = m.mComputer.getSharedUser( + SharedUserApi sharedUser = snapshot.getSharedUser( packageState.getSharedUserAppId()); String oldSeInfo = AndroidPackageUtils.getSeInfo(pkg, packageState); @@ -1531,11 +1517,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService selinuxChangeListener); m.installAllowlistedSystemPackages(); - ServiceManager.addService("package", m.mIPackageManager); + IPackageManagerImpl iPackageManager = m.new IPackageManagerImpl(); + ServiceManager.addService("package", iPackageManager); final PackageManagerNative pmn = new PackageManagerNative(m); ServiceManager.addService("package_native", pmn); LocalManagerRegistry.addManager(PackageManagerLocal.class, m.new PackageManagerLocalImpl()); - return Pair.create(m, m.mIPackageManager); + return Pair.create(m, iPackageManager); } /** Install/uninstall system packages for all users based on their user-type, as applicable. */ @@ -1641,8 +1628,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPackageDexOptimizer = testParams.packageDexOptimizer; mPackageParserCallback = testParams.packageParserCallback; mPendingBroadcasts = testParams.pendingPackageBroadcasts; - mIPackageManager = new IPackageManagerImpl(); - mPmInternal = testParams.pmInternal; mTestUtilityService = testParams.testUtilityService; mProcessLoggingHandler = testParams.processLoggingHandler; mProtectedPackages = testParams.protectedPackages; @@ -1703,7 +1688,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService public PackageManagerService(PackageManagerServiceInjector injector, boolean onlyCore, boolean factoryTest, final String buildFingerprint, final boolean isEngBuild, final boolean isUserDebugBuild, final int sdkVersion, final String incrementalVersion) { - mIPackageManager = new IPackageManagerImpl(); mIsEngBuild = isEngBuild; mIsUserDebugBuild = isUserDebugBuild; mSdkVersion = sdkVersion; @@ -1734,10 +1718,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService t.traceBegin("createSubComponents"); // Expose private service for system components to use. - mPmInternal = new PackageManagerInternalImpl(); + LocalServices.addService(PackageManagerInternal.class, new PackageManagerInternalImpl()); LocalServices.addService(TestUtilityService.class, this); mTestUtilityService = LocalServices.getService(TestUtilityService.class); - LocalServices.addService(PackageManagerInternal.class, mPmInternal); mUserManager = injector.getUserManagerService(); mUserNeedsBadging = new UserNeedsBadgingCache(mUserManager); mComponentResolver = injector.getComponentResolver(); @@ -1755,7 +1738,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public boolean hasFeature(String feature) { - return PackageManagerService.this.mIPackageManager.hasSystemFeature(feature, 0); + return PackageManagerService.this.hasSystemFeature(feature, 0); } }; @@ -1885,9 +1868,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService final int dependencyCount = entry.dependencies.length; for (int j = 0; j < dependencyCount; j++) { final SharedLibraryInfo dependency = - getSharedLibraryInfo(entry.dependencies[j], undefinedVersion); + computer.getSharedLibraryInfo(entry.dependencies[j], undefinedVersion); if (dependency != null) { - getSharedLibraryInfo(name, undefinedVersion).addDependency(dependency); + computer.getSharedLibraryInfo(name, undefinedVersion) + .addDependency(dependency); } } } @@ -1899,7 +1883,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService t.traceEnd(); t.traceBegin("read user settings"); - mFirstBoot = !mSettings.readLPw(mLiveComputer, + mFirstBoot = !mSettings.readLPw(computer, mInjector.getUserManagerInternal().getUsers( /* excludePartial= */ true, /* excludeDying= */ false, @@ -1980,19 +1964,26 @@ public class PackageManagerService implements PackageSender, TestUtilityService // Resolve protected action filters. Only the setup wizard is allowed to // have a high priority filter for these actions. mSetupWizardPackage = getSetupWizardPackageNameImpl(computer); - mComponentResolver.fixProtectedFilterPriorities(mPmInternal.getSetupWizardPackageName()); + mComponentResolver.fixProtectedFilterPriorities(mSetupWizardPackage); - mDefaultTextClassifierPackage = mIPackageManager.getDefaultTextClassifierPackageName(); - mSystemTextClassifierPackageName = - mIPackageManager.getSystemTextClassifierPackageName(); - mConfiguratorPackage = getDeviceConfiguratorPackageName(); - mAppPredictionServicePackage = mIPackageManager.getAppPredictionServicePackageName(); - mIncidentReportApproverPackage = - mIPackageManager.getIncidentReportApproverPackageName(); + mDefaultTextClassifierPackage = ensureSystemPackageName(computer, + mContext.getString(R.string.config_servicesExtensionPackage)); + mSystemTextClassifierPackageName = ensureSystemPackageName(computer, + mContext.getString(R.string.config_defaultTextClassifierPackage)); + mConfiguratorPackage = ensureSystemPackageName(computer, + mContext.getString(R.string.config_deviceConfiguratorPackageName)); + mAppPredictionServicePackage = ensureSystemPackageName(computer, + getPackageFromComponentString(R.string.config_defaultAppPredictionService)); + mIncidentReportApproverPackage = ensureSystemPackageName(computer, + mContext.getString(R.string.config_incidentReportApproverPackage)); mRetailDemoPackage = getRetailDemoPackageName(); - mOverlayConfigSignaturePackage = getOverlayConfigSignaturePackageName(); - mRecentsPackage = getRecentsPackageName(); - mAmbientContextDetectionPackage = getAmbientContextDetectionPackageName(); + mOverlayConfigSignaturePackage = ensureSystemPackageName(computer, + mInjector.getSystemConfig().getOverlayConfigSignaturePackage()); + mRecentsPackage = ensureSystemPackageName(computer, + getPackageFromComponentString(R.string.config_recentsComponentName)); + mAmbientContextDetectionPackage = ensureSystemPackageName(computer, + getPackageFromComponentString( + R.string.config_defaultAmbientContextDetectionService)); // Now that we know all of the shared libraries, update all clients to have // the correct library paths. @@ -2126,8 +2117,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService mDomainVerificationManager.setProxy(domainVerificationProxy); - mServicesExtensionPackageName = getRequiredServicesExtensionPackageLPr(); - mSharedSystemSharedLibraryPackageName = getRequiredSharedLibrary( + mServicesExtensionPackageName = getRequiredServicesExtensionPackageLPr(computer); + mSharedSystemSharedLibraryPackageName = getRequiredSharedLibrary(computer, PackageManager.SYSTEM_SHARED_LIBRARY_SHARED, SharedLibraryInfo.VERSION_UNDEFINED); } else { @@ -2143,11 +2134,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService mRequiredPermissionControllerPackage = getRequiredPermissionControllerLPr(computer); mSettings.setPermissionControllerVersion( - mIPackageManager.getPackageInfo(mRequiredPermissionControllerPackage, 0, + computer.getPackageInfo(mRequiredPermissionControllerPackage, 0, UserHandle.USER_SYSTEM).getLongVersionCode()); // Resolve the sdk sandbox package - mRequiredSdkSandboxPackage = getRequiredSdkSandboxPackageName(); + mRequiredSdkSandboxPackage = getRequiredSdkSandboxPackageName(computer); // Initialize InstantAppRegistry's Instant App list for all users. for (AndroidPackage pkg : mPackages.values()) { @@ -2155,7 +2146,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService continue; } for (int userId : userIds) { - final PackageStateInternal ps = getPackageStateInternal(pkg.getPackageName()); + final PackageStateInternal ps = + computer.getPackageStateInternal(pkg.getPackageName()); if (ps == null || !ps.getUserStateOrDefault(userId).isInstantApp() || !ps.getUserStateOrDefault(userId).isInstalled()) { continue; @@ -2165,7 +2157,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } mInstallerService = mInjector.getPackageInstallerService(); - final ComponentName instantAppResolverComponent = getInstantAppResolver(); + final ComponentName instantAppResolverComponent = getInstantAppResolver(computer); if (instantAppResolverComponent != null) { if (DEBUG_INSTANT) { Slog.d(TAG, "Set ephemeral resolver: " + instantAppResolverComponent); @@ -2191,7 +2183,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService // scanning). final Map> userPackages = new HashMap<>(); for (int userId : userIds) { - userPackages.put(userId, mIPackageManager.getInstalledPackages(/*flags*/ 0, userId) + userPackages.put(userId, computer.getInstalledPackages(/*flags*/ 0, userId) .getList()); } mDexManager.load(userPackages); @@ -2202,7 +2194,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService SystemClock.uptimeMillis() - startTime); } - // Rebild the live computer since some attributes have been rebuilt. + // Rebuild the live computer since some attributes have been rebuilt. mLiveComputer = createLiveComputer(); } // synchronized (mLock) @@ -2210,6 +2202,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService // CHECKSTYLE:ON IndentationCheck mModuleInfoProvider = mInjector.getModuleInfoProvider(); + mInjector.getSystemWrapper().enablePackageCaches(); // Now after opening every single application zip, make sure they @@ -2281,8 +2274,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @NonNull - private String getRequiredSharedLibrary(@NonNull String name, int version) { - SharedLibraryInfo libraryInfo = getSharedLibraryInfo(name, version); + private String getRequiredSharedLibrary(@NonNull Computer snapshot, @NonNull String name, + int version) { + SharedLibraryInfo libraryInfo = snapshot.getSharedLibraryInfo(name, version); if (libraryInfo == null) { throw new IllegalStateException("Missing required shared library:" + name); } @@ -2294,9 +2288,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @NonNull - private String getRequiredServicesExtensionPackageLPr() { + private String getRequiredServicesExtensionPackageLPr(@NonNull Computer computer) { String servicesExtensionPackage = - ensureSystemPackageName( + ensureSystemPackageName(computer, mContext.getString(R.string.config_servicesExtensionPackage)); if (TextUtils.isEmpty(servicesExtensionPackage)) { throw new RuntimeException( @@ -2375,7 +2369,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService for (int i = 0; i < N; i++) { final ResolveInfo cur = matches.get(i); final String packageName = cur.getComponentInfo().packageName; - if (mIPackageManager.checkPermission( + if (checkPermission( android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT, packageName, UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) { continue; @@ -2405,7 +2399,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService for (int i = 0; i < N; i++) { final ResolveInfo cur = matches.get(i); final String packageName = cur.getComponentInfo().packageName; - if (mIPackageManager.checkPermission( + if (checkPermission( android.Manifest.permission.DOMAIN_VERIFICATION_AGENT, packageName, UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) { Slog.w(TAG, "Domain verification agent found but does not hold permission: " @@ -2414,7 +2408,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } if (best == null || cur.priority > best.priority) { - if (mComputer.isComponentEffectivelyEnabled(cur.getComponentInfo(), + if (computer.isComponentEffectivelyEnabled(cur.getComponentInfo(), UserHandle.USER_SYSTEM)) { best = cur; } else { @@ -2430,7 +2424,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService return null; } - private @Nullable ComponentName getInstantAppResolver() { + @Nullable ComponentName getInstantAppResolver(@NonNull Computer snapshot) { final String[] packageArray = mContext.getResources().getStringArray(R.array.config_ephemeralResolverPackage); if (packageArray.length == 0 && !Build.IS_DEBUGGABLE) { @@ -2446,7 +2440,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService | MATCH_DIRECT_BOOT_UNAWARE | (!Build.IS_DEBUGGABLE ? MATCH_SYSTEM_ONLY : 0); final Intent resolverIntent = new Intent(Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE); - List resolvers = queryIntentServicesInternal(resolverIntent, null, + List resolvers = snapshot.queryIntentServicesInternal(resolverIntent, null, resolveFlags, UserHandle.USER_SYSTEM, callingUid, false /*includeInstantApps*/); final int N = resolvers.size(); if (N == 0) { @@ -2519,7 +2513,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService Iterator iter = matches.iterator(); while (iter.hasNext()) { final ResolveInfo rInfo = iter.next(); - if (mIPackageManager.checkPermission( + if (checkPermission( Manifest.permission.INSTALL_PACKAGES, rInfo.activityInfo.packageName, 0) == PERMISSION_GRANTED || mIsEngBuild) { continue; @@ -2550,48 +2544,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService return matches.get(0).getComponentInfo().getComponentName(); } - /** - * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int) - */ - boolean shouldFilterApplication( - @Nullable PackageStateInternal ps, int callingUid, int userId) { - return mComputer.shouldFilterApplication( - ps, callingUid, userId); - } - - private @PackageStartability int getPackageStartability(String packageName, - int callingUid, int userId) { - return mComputer.getPackageStartability(mSafeMode, packageName, callingUid, userId); - } - - /** - * Returns whether or not a full application can see an instant application. - *

- * Currently, there are four cases in which this can occur: - *

    - *
  1. The calling application is a "special" process. Special processes - * are those with a UID < {@link Process#FIRST_APPLICATION_UID}.
  2. - *
  3. The calling application has the permission - * {@link android.Manifest.permission#ACCESS_INSTANT_APPS}.
  4. - *
  5. The calling application is the default launcher on the - * system partition.
  6. - *
  7. The calling application is the default app prediction service.
  8. - *
- */ - boolean canViewInstantApps(int callingUid, int userId) { - return mComputer.canViewInstantApps(callingUid, userId); - } - - private PackageInfo generatePackageInfo(@NonNull PackageStateInternal ps, - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - return mComputer.generatePackageInfo(ps, flags, userId); - } - - int getPackageUidInternal(String packageName, - @PackageManager.PackageInfoFlagsBits long flags, int userId, int callingUid) { - return mComputer.getPackageUidInternal(packageName, flags, userId, callingUid); - } - public PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) { // Because this is accessed via the package manager service AIDL, // go through the permission manager service AIDL @@ -2599,19 +2551,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService .getPermissionGroupInfo(groupName, flags); } - /** - * Important: The provided filterCallingUid is used exclusively to filter out applications - * that can be seen based on user state. It's typically the original caller uid prior - * to clearing. Because it can only be provided by trusted code, its value can be - * trusted and will be used as-is; unlike userId which will be validated by this method. - */ - private ApplicationInfo getApplicationInfoInternal(String packageName, - @PackageManager.ApplicationInfoFlagsBits long flags, - int filterCallingUid, int userId) { - return mComputer.getApplicationInfoInternal(packageName, flags, - filterCallingUid, userId); - } - /** * Blocking call to clear all cached app data above quota. */ @@ -2648,7 +2587,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService // 2. Consider preloaded data (after 1w honeymoon, unless aggressive) if (internalVolume && (aggressive || SystemProperties .getBoolean("persist.sys.preloads.file_cache_expired", false))) { - mIPackageManager.deletePreloadsFileCache(); + deletePreloadsFileCache(); if (file.getUsableSpace() >= bytes) return; } @@ -2769,43 +2708,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService return recommendedInstallLocation; } - /** - * Update given flags when being used to request {@link ResolveInfo}. - *

Instant apps are resolved specially, depending upon context. Minimally, - * {@code}flags{@code} must have the {@link PackageManager#MATCH_INSTANT} - * flag set. However, this flag is only honoured in three circumstances: - *

    - *
  • when called from a system process
  • - *
  • when the caller holds the permission {@code android.permission.ACCESS_INSTANT_APPS}
  • - *
  • when resolution occurs to start an activity with a {@code android.intent.action.VIEW} - * action and a {@code android.intent.category.BROWSABLE} category
  • - *
- */ - long updateFlagsForResolve(long flags, int userId, int callingUid, - boolean wantInstantApps, boolean isImplicitImageCaptureIntentAndNotSetByDpc) { - return mComputer.updateFlagsForResolve(flags, userId, callingUid, - wantInstantApps, isImplicitImageCaptureIntentAndNotSetByDpc); - } - - /** - * Important: The provided filterCallingUid is used exclusively to filter out activities - * that can be seen based on user state. It's typically the original caller uid prior - * to clearing. Because it can only be provided by trusted code, its value can be - * trusted and will be used as-is; unlike userId which will be validated by this method. - */ - private ActivityInfo getActivityInfoInternal(ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, int filterCallingUid, int userId) { - return mComputer.getActivityInfoInternal(component, flags, - filterCallingUid, userId); - } - - @Nullable - List getPackagesUsingSharedLibrary( - SharedLibraryInfo libInfo, @PackageManager.PackageInfoFlagsBits long flags, - int callingUid, int userId) { - return mComputer.getPackagesUsingSharedLibrary(libInfo, flags, callingUid, userId); - } - public ModuleInfo getModuleInfo(String packageName, @PackageManager.ModuleInfoFlags int flags) { return mModuleInfoProvider.getModuleInfo(packageName, flags); } @@ -2840,7 +2742,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mRequiredInstallerPackage; } - private void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj, + void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj, Intent origIntent, String resolvedType, String callingPackage, @Nullable String callingFeatureId, boolean isRequesterInstantApp, Bundle verificationBundle, int userId) { @@ -2852,31 +2754,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService mHandler.sendMessage(msg); } - /** - * From Android R, camera intents have to match system apps. The only exception to this is if - * the DPC has set the camera persistent preferred activity. This case was introduced - * because it is important that the DPC has the ability to set both system and non-system - * camera persistent preferred activities. - * - * @return {@code true} if the intent is a camera intent and the persistent preferred - * activity was not set by the DPC. - */ - @GuardedBy("mLock") - boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent, int userId, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags) { - return mComputer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, - resolvedType, flags); - } - - @GuardedBy("mLock") - ResolveInfo findPersistentPreferredActivityLP(Intent intent, - String resolvedType, - @PackageManager.ResolveInfoFlagsBits long flags, List query, boolean debug, - int userId) { - return mComputer.findPersistentPreferredActivityLP(intent, - resolvedType, flags, query, debug, userId); - } - // findPreferredActivityBody returns two items: a "things changed" flag and a // ResolveInfo, which is the preferred activity itself. static class FindPreferredActivityBodyResult { @@ -2884,24 +2761,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService ResolveInfo mPreferredResolveInfo; } - FindPreferredActivityBodyResult findPreferredActivityInternal( - Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, - List query, boolean always, - boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered) { - return mComputer.findPreferredActivityInternal( - intent, resolvedType, flags, - query, always, - removeMatches, debug, userId, queryMayBeFiltered); - } - - /** - * Returns the package name of the calling Uid if it's an instant app. If it isn't - * instant, returns {@code null}. - */ - String getInstantAppPackageName(int callingUid) { - return mComputer.getInstantAppPackageName(callingUid); - } - public @NonNull ParceledListSlice queryIntentReceivers(@NonNull Computer snapshot, Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, @UserIdInt int userId) { @@ -2909,24 +2768,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService snapshot, intent, resolvedType, flags, userId, Binder.getCallingUid())); } - @NonNull List queryIntentServicesInternal(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId, - int callingUid, boolean includeInstantApps) { - return mComputer.queryIntentServicesInternal(intent, - resolvedType, flags, userId, callingUid, - includeInstantApps); - } - - private boolean isInstantAppInternal(String packageName, @UserIdInt int userId, - int callingUid) { - return mComputer.isInstantAppInternal(packageName, userId, - callingUid); - } - - boolean isCallerSameApp(String packageName, int uid) { - return mComputer.isCallerSameApp(packageName, uid); - } - public static void reportSettingsProblem(int priority, String msg) { logCriticalInfo(priority, msg); } @@ -2943,39 +2784,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService return packageName + STATIC_SHARED_LIB_DELIMITER + libraryVersion; } - /** - * Enforces the request is from the system or an app that has INTERACT_ACROSS_USERS - * or INTERACT_ACROSS_USERS_FULL permissions, if the {@code userId} is not for the caller. - * - * @param checkShell whether to prevent shell from access if there's a debugging restriction - * @param message the message to log on security exception - */ - void enforceCrossUserPermission(int callingUid, @UserIdInt int userId, - boolean requireFullPermission, boolean checkShell, String message) { - mComputer.enforceCrossUserPermission(callingUid, userId, - requireFullPermission, checkShell, message); - } - - /** - * Checks if the request is from the system or an app that has the appropriate cross-user - * permissions defined as follows: - *
    - *
  • INTERACT_ACROSS_USERS_FULL if {@code requireFullPermission} is true.
  • - *
  • INTERACT_ACROSS_USERS if the given {@code userId} is in a different profile group - * to the caller.
  • - *
  • Otherwise, INTERACT_ACROSS_PROFILES if the given {@code userId} is in the same profile - * group as the caller.
  • - *
- * - * @param checkShell whether to prevent shell from access if there's a debugging restriction - * @param message the message to log on security exception - */ - private void enforceCrossUserOrProfilePermission(int callingUid, @UserIdInt int userId, - boolean requireFullPermission, boolean checkShell, String message) { - mComputer.enforceCrossUserOrProfilePermission(callingUid, userId, - requireFullPermission, checkShell, message); - } - public void performFstrimIfNeeded() { PackageManagerServiceUtils.enforceSystemOrRoot("Only the system can request fstrim"); @@ -3033,17 +2841,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mDexManager; } - @NonNull - List findSharedNonSystemLibraries( - @NonNull PackageStateInternal pkgSetting) { - return mComputer.findSharedNonSystemLibraries(pkgSetting); - } - - @Nullable - SharedLibraryInfo getSharedLibraryInfo(String name, long version) { - return mComputer.getSharedLibraryInfo(name, version); - } - public void shutdown() { mCompilerStats.writeNow(); mDexManager.writePackageDexUsageNow(); @@ -3141,14 +2938,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPackageObserverHelper.notifyRemoved(packageName, uid); } - void sendPackageAddedForUser(String packageName, @NonNull PackageStateInternal packageState, - int userId, int dataLoaderType) { + void sendPackageAddedForUser(@NonNull Computer snapshot, String packageName, + @NonNull PackageStateInternal packageState, int userId, int dataLoaderType) { final PackageUserStateInternal userState = packageState.getUserStateOrDefault(userId); final boolean isSystem = packageState.isSystem(); final boolean isInstantApp = userState.isInstantApp(); final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId }; final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY; - sendPackageAddedForNewUsers(packageName, isSystem /*sendBootCompleted*/, + sendPackageAddedForNewUsers(snapshot, packageName, isSystem /*sendBootCompleted*/, false /*startReceiver*/, packageState.getAppId(), userIds, instantUserIds, dataLoaderType); @@ -3160,15 +2957,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override - public void sendPackageAddedForNewUsers(String packageName, boolean sendBootCompleted, - boolean includeStopped, @AppIdInt int appId, int[] userIds, int[] instantUserIds, - int dataLoaderType) { + public void sendPackageAddedForNewUsers(@NonNull Computer snapshot, String packageName, + boolean sendBootCompleted, boolean includeStopped, @AppIdInt int appId, int[] userIds, + int[] instantUserIds, int dataLoaderType) { if (ArrayUtils.isEmpty(userIds) && ArrayUtils.isEmpty(instantUserIds)) { return; } SparseArray broadcastAllowList = mAppsFilter.getVisibilityAllowList( - getPackageStateInternal(packageName, Process.SYSTEM_UID), - userIds, getPackageStates()); + snapshot.getPackageStateInternal(packageName, Process.SYSTEM_UID), + userIds, snapshot.getPackageStates()); mHandler.post(() -> mBroadcastHelper.sendPackageAddedForNewUsers( packageName, appId, userIds, instantUserIds, dataLoaderType, broadcastAllowList)); if (sendBootCompleted && !ArrayUtils.isEmpty(userIds)) { @@ -3202,8 +2999,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService return false; } - private void enforceCanSetPackagesSuspendedAsUser(String callingPackage, int callingUid, - int userId, String callingMethod) { + private void enforceCanSetPackagesSuspendedAsUser(@NonNull Computer snapshot, + String callingPackage, int callingUid, int userId, String callingMethod) { if (callingUid == Process.ROOT_UID // Need to compare app-id to allow system dialogs access on secondary users || UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) { @@ -3212,7 +3009,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService final String ownerPackage = mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(userId); if (ownerPackage != null) { - final int ownerUid = mIPackageManager.getPackageUid(ownerPackage, 0, userId); + final int ownerUid = snapshot.getPackageUid(ownerPackage, 0, userId); if (ownerUid == callingUid) { return; } @@ -3221,7 +3018,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService mContext.enforceCallingOrSelfPermission(android.Manifest.permission.SUSPEND_APPS, callingMethod); - final int packageUid = mIPackageManager.getPackageUid(callingPackage, 0, userId); + final int packageUid = snapshot.getPackageUid(callingPackage, 0, userId); final boolean allowedPackageUid = packageUid == callingUid; // TODO(b/139383163): remove special casing for shell and enforce INTERACT_ACROSS_USERS_FULL final boolean allowedShell = callingUid == SHELL_UID @@ -3242,13 +3039,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService allPackages, suspendingPackage::equals, userId); } - private boolean isSuspendingAnyPackages(String suspendingPackage, int userId) { - return mComputer.isSuspendingAnyPackages(suspendingPackage, userId); - } - - void removeAllDistractingPackageRestrictions(int userId) { - final String[] allPackages = mComputer.getAllAvailablePackageNames(); - removeDistractingPackageRestrictions(allPackages, userId); + void removeAllDistractingPackageRestrictions(@NonNull Computer snapshot, int userId) { + final String[] allPackages = snapshot.getAllAvailablePackageNames(); + removeDistractingPackageRestrictions(snapshot, allPackages, userId); } /** @@ -3260,11 +3053,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService * @param packagesToChange The packages on which restrictions are to be removed. * @param userId the user for which changes are taking place. */ - private void removeDistractingPackageRestrictions(String[] packagesToChange, int userId) { + void removeDistractingPackageRestrictions(@NonNull Computer snapshot, + String[] packagesToChange, int userId) { final List changedPackages = new ArrayList<>(); final IntArray changedUids = new IntArray(); for (String packageName : packagesToChange) { - final PackageStateInternal ps = getPackageStateInternal(packageName); + final PackageStateInternal ps = snapshot.getPackageStateInternal(packageName); if (ps != null && ps.getUserStateOrDefault(userId).getDistractionFlags() != 0) { changedPackages.add(ps.getPackageName()); changedUids.add(UserHandle.getUid(userId, ps.getAppId())); @@ -3287,7 +3081,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - private void setEnableRollbackCode(int token, int enableRollbackCode) { + void setEnableRollbackCode(int token, int enableRollbackCode) { final Message msg = mHandler.obtainMessage(ENABLE_ROLLBACK_STATUS); msg.arg1 = token; msg.arg2 = enableRollbackCode; @@ -3334,7 +3128,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (DEBUG_BACKUP) { Slog.i(TAG, "Package " + packageName + " sending normal FIRST_LAUNCH"); } - final boolean isInstantApp = isInstantAppInternal( + final boolean isInstantApp = snapshotComputer().isInstantAppInternal( packageName, userId, Process.SYSTEM_UID); final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId }; final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY; @@ -3384,30 +3178,22 @@ public class PackageManagerService implements PackageSender, TestUtilityService versionedPackage, observer, userId, deleteFlags, false); } - private String resolveExternalPackageName(AndroidPackage pkg) { - return mComputer.resolveExternalPackageName(pkg); - } - - String resolveInternalPackageName(String packageName, long versionCode) { - return mComputer.resolveInternalPackageName(packageName, versionCode); - } - - boolean isCallerVerifier(int callingUid) { + boolean isCallerVerifier(@NonNull Computer snapshot, int callingUid) { final int callingUserId = UserHandle.getUserId(callingUid); - return mRequiredVerifierPackage != null && callingUid == mIPackageManager.getPackageUid( + return mRequiredVerifierPackage != null && callingUid == snapshot.getPackageUid( mRequiredVerifierPackage, 0, callingUserId); } - public boolean isPackageDeviceAdminOnAnyUser(String packageName) { + public boolean isPackageDeviceAdminOnAnyUser(@NonNull Computer snapshot, String packageName) { final int callingUid = Binder.getCallingUid(); - if (mIPackageManager.checkUidPermission(android.Manifest.permission.MANAGE_USERS, - callingUid) != PERMISSION_GRANTED) { + if (snapshot.checkUidPermission(android.Manifest.permission.MANAGE_USERS, callingUid) + != PERMISSION_GRANTED) { EventLog.writeEvent(0x534e4554, "128599183", -1, ""); throw new SecurityException(android.Manifest.permission.MANAGE_USERS + " permission is required to call this API"); } - if (getInstantAppPackageName(callingUid) != null - && !isCallerSameApp(packageName, callingUid)) { + if (snapshot.getInstantAppPackageName(callingUid) != null + && !snapshot.isCallerSameApp(packageName, callingUid)) { return false; } return isPackageDeviceAdmin(packageName, UserHandle.USER_ALL); @@ -3456,14 +3242,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mDevicePolicyManager; } - private boolean clearApplicationUserDataLIF(String packageName, int userId) { + private boolean clearApplicationUserDataLIF(@NonNull Computer snapshot, String packageName, + int userId) { if (packageName == null) { Slog.w(TAG, "Attempt to delete null packageName."); return false; } // Try finding details about the requested package - AndroidPackage pkg = getPackage(packageName); + AndroidPackage pkg = snapshot.getPackage(packageName); if (pkg == null) { Slog.w(TAG, "Package named '" + packageName + "' doesn't exist."); return false; @@ -3486,8 +3273,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService } else { flags = 0; } - mAppDataHelper.prepareAppDataContentsLIF(pkg, getPackageStateInternal(packageName), userId, - flags); + mAppDataHelper.prepareAppDataContentsLIF(pkg, snapshot.getPackageStateInternal(packageName), + userId, flags); return true; } @@ -3538,10 +3325,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - int getUidTargetSdkVersion(int uid) { - return mComputer.getUidTargetSdkVersion(uid); - } - void postPreferredActivityChangedBroadcast(int userId) { mHandler.post(() -> mBroadcastHelper.sendPreferredActivityChangedBroadcast(userId)); } @@ -3562,18 +3345,19 @@ public class PackageManagerService implements PackageSender, TestUtilityService // Persistent preferred activity might have came into effect due to this // install. - mPreferredActivityHelper.updateDefaultHomeNotLocked(userId); + mPreferredActivityHelper.updateDefaultHomeNotLocked(snapshotComputer(), userId); } /** * Variant that takes a {@link WatchedIntentFilter} */ - public void addCrossProfileIntentFilter(WatchedIntentFilter intentFilter, String ownerPackage, - int sourceUserId, int targetUserId, int flags) { + public void addCrossProfileIntentFilter(@NonNull Computer snapshot, + WatchedIntentFilter intentFilter, String ownerPackage, int sourceUserId, + int targetUserId, int flags) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); int callingUid = Binder.getCallingUid(); - enforceOwnerRights(ownerPackage, callingUid); + enforceOwnerRights(snapshot, ownerPackage, callingUid); PackageManagerServiceUtils.enforceShellRestriction(mInjector.getUserManagerInternal(), UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, sourceUserId); if (intentFilter.countActions() == 0) { @@ -3601,18 +3385,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService } // Enforcing that callingUid is owning pkg on userId - private void enforceOwnerRights(String pkg, int callingUid) { + private void enforceOwnerRights(@NonNull Computer snapshot, String pkg, int callingUid) { // The system owns everything. if (UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) { return; } - final String[] callerPackageNames = mIPackageManager.getPackagesForUid(callingUid); + final String[] callerPackageNames = snapshot.getPackagesForUid(callingUid); if (!ArrayUtils.contains(callerPackageNames, pkg)) { throw new SecurityException("Calling uid " + callingUid + " does not own package " + pkg); } final int callingUserId = UserHandle.getUserId(callingUid); - PackageInfo pi = mIPackageManager.getPackageInfo(pkg, 0, callingUserId); + PackageInfo pi = snapshot.getPackageInfo(pkg, 0, callingUserId); if (pi == null) { throw new IllegalArgumentException("Unknown package " + pkg + " on user " + callingUserId); @@ -3626,29 +3410,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService } final UserInfo parent = ums.getProfileParent(userId); final int launcherUid = (parent != null) ? parent.id : userId; - final ComponentName launcherComponent = getDefaultHomeActivity(launcherUid); + // TODO: Should this snapshot be moved further up? + final ComponentName launcherComponent = snapshotComputer() + .getDefaultHomeActivity(launcherUid); mBroadcastHelper.sendSessionCommitBroadcast(sessionInfo, userId, launcherUid, launcherComponent, mAppPredictionServicePackage); } - /** - * Report the 'Home' activity which is currently set as "always use this one". If non is set - * then reports the most likely home activity or null if there are more than one. - */ - private ComponentName getDefaultHomeActivity(int userId) { - return mComputer.getDefaultHomeActivity(userId); - } - - Intent getHomeIntent() { - return mComputer.getHomeIntent(); - } - - ComponentName getHomeActivitiesAsUser(List allHomeCandidates, - int userId) { - return mComputer.getHomeActivitiesAsUser(allHomeCandidates, - userId); - } - private @Nullable String getSetupWizardPackageNameImpl(@NonNull Computer computer) { final Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_SETUP_WIZARD); @@ -3682,10 +3450,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - private @NonNull String getRequiredSdkSandboxPackageName() { + @NonNull + private static String getRequiredSdkSandboxPackageName(@NonNull Computer computer) { final Intent intent = new Intent(SdkSandboxManagerLocal.SERVICE_INTERFACE); - final List matches = queryIntentServicesInternal( + final List matches = computer.queryIntentServicesInternal( intent, /* resolvedType= */ null, MATCH_SYSTEM_ONLY | MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, @@ -3700,22 +3469,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Nullable - private String getDeviceConfiguratorPackageName() { - return ensureSystemPackageName(mContext.getString( - R.string.config_deviceConfiguratorPackageName)); - } - - public @Nullable String getAmbientContextDetectionPackageName() { - return ensureSystemPackageName(getPackageFromComponentString( - R.string.config_defaultAmbientContextDetectionService)); - } - - public String getOverlayConfigSignaturePackageName() { - return ensureSystemPackageName(mInjector.getSystemConfig() - .getOverlayConfigSignaturePackage()); - } - @Nullable private String getRetailDemoPackageName() { final String predefinedPkgName = mContext.getString(R.string.config_retailDemoPackage); @@ -3752,14 +3505,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Nullable - private String getRecentsPackageName() { - return ensureSystemPackageName( - getPackageFromComponentString(R.string.config_recentsComponentName)); - - } - - @Nullable - private String getPackageFromComponentString(@StringRes int stringResId) { + String getPackageFromComponentString(@StringRes int stringResId) { final String componentString = mContext.getString(stringResId); if (TextUtils.isEmpty(componentString)) { return null; @@ -3772,16 +3518,17 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Nullable - private String ensureSystemPackageName(@Nullable String packageName) { + String ensureSystemPackageName(@NonNull Computer snapshot, + @Nullable String packageName) { if (packageName == null) { return null; } final long token = Binder.clearCallingIdentity(); try { - if (mIPackageManager.getPackageInfo(packageName, MATCH_FACTORY_ONLY, + if (snapshot.getPackageInfo(packageName, MATCH_FACTORY_ONLY, UserHandle.USER_SYSTEM) == null) { PackageInfo packageInfo = - mIPackageManager.getPackageInfo(packageName, 0, UserHandle.USER_SYSTEM); + snapshot.getPackageInfo(packageName, 0, UserHandle.USER_SYSTEM); if (packageInfo != null) { EventLog.writeEvent(0x534e4554, "145981139", packageInfo.applicationInfo.uid, ""); @@ -3863,8 +3610,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService private void setEnabledSettings(List settings, int userId, String callingPackage) { final int callingUid = Binder.getCallingUid(); - enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */, - true /* checkShell */, "set enabled"); + // TODO: This method is not properly snapshotified beyond this call + final Computer preLockSnapshot = snapshotComputer(); + preLockSnapshot.enforceCrossUserPermission(callingUid, userId, + false /* requireFullPermission */, true /* checkShell */, "set enabled"); final int targetSize = settings.size(); for (int i = 0; i < targetSize; i++) { @@ -3920,6 +3669,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService final Map pkgSettings = new ArrayMap<>(targetSize); // reader synchronized (mLock) { + final Computer snapshot = snapshotComputer(); // Checks for target packages for (int i = 0; i < targetSize; i++) { final ComponentEnabledSetting setting = settings.get(i); @@ -3929,13 +3679,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService continue; } final boolean isCallerTargetApp = ArrayUtils.contains( - mIPackageManager.getPackagesForUid(callingUid), packageName); + snapshot.getPackagesForUid(callingUid), packageName); final PackageSetting pkgSetting = mSettings.getPackageLPr(packageName); // Limit who can change which apps if (!isCallerTargetApp) { // Don't allow apps that don't have permission to modify other apps if (!allowedByPermission - || shouldFilterApplication(pkgSetting, callingUid, userId)) { + || snapshot.shouldFilterApplication(pkgSetting, callingUid, userId)) { throw new SecurityException("Attempt to change component state; " + "pid=" + Binder.getCallingPid() + ", uid=" + callingUid @@ -4108,12 +3858,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService final long callingId = Binder.clearCallingIdentity(); try { + final Computer newSnapshot = snapshotComputer(); for (int i = 0; i < sendNowBroadcasts.size(); i++) { final String packageName = sendNowBroadcasts.keyAt(i); final ArrayList components = sendNowBroadcasts.valueAt(i); final int packageUid = UserHandle.getUid( userId, pkgSettings.get(packageName).getAppId()); - sendPackageChangedBroadcast(packageName, false /* dontKillApp */, + sendPackageChangedBroadcast(newSnapshot, packageName, false /* dontKillApp */, components, packageUid, null /* reason */); } } finally { @@ -4137,13 +3888,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService pkgSetting.setEnabled(newState, userId, callingPackage); if ((newState == COMPONENT_ENABLED_STATE_DISABLED_USER || newState == COMPONENT_ENABLED_STATE_DISABLED) - && mIPackageManager.checkPermission(Manifest.permission.SUSPEND_APPS, - packageName, userId) == PERMISSION_GRANTED) { + && checkPermission(Manifest.permission.SUSPEND_APPS, packageName, userId) + == PERMISSION_GRANTED) { // This app should not generally be allowed to get disabled by the UI, but // if it ever does, we don't want to end up with some of the user's apps // permanently suspended. unsuspendForSuspendingPackage(computer, packageName, userId); - removeAllDistractingPackageRestrictions(userId); + removeAllDistractingPackageRestrictions(computer, userId); } success = true; } else { @@ -4194,25 +3945,20 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - void sendPackageChangedBroadcast(String packageName, + void sendPackageChangedBroadcast(@NonNull Computer snapshot, String packageName, boolean dontKillApp, ArrayList componentNames, int packageUid, String reason) { final int userId = UserHandle.getUserId(packageUid); - final boolean isInstantApp = isInstantAppInternal(packageName, userId, Process.SYSTEM_UID); + final boolean isInstantApp = + snapshot.isInstantAppInternal(packageName, userId, Process.SYSTEM_UID); final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId }; final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY; - final SparseArray broadcastAllowList = getBroadcastAllowList( + final SparseArray broadcastAllowList = snapshot.getBroadcastAllowList( packageName, userIds, isInstantApp); mHandler.post(() -> mBroadcastHelper.sendPackageChangedBroadcast( packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList)); } - @Nullable - private SparseArray getBroadcastAllowList(@NonNull String packageName, - @UserIdInt int[] userIds, boolean isInstantApp) { - return mComputer.getBroadcastAllowList(packageName, userIds, isInstantApp); - } - /** * Used by SystemServer */ @@ -4296,7 +4042,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService // Now that we're mostly running, clean up stale users and apps mUserManager.reconcileUsers(StorageManager.UUID_PRIVATE_INTERNAL); - storageEventHelper.reconcileApps(StorageManager.UUID_PRIVATE_INTERNAL); + storageEventHelper.reconcileApps(snapshotComputer(), StorageManager.UUID_PRIVATE_INTERNAL); mPermissionManager.onSystemReady(); @@ -4308,7 +4054,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService final int livingUserCount = livingUsers.size(); for (int i = 0; i < livingUserCount; i++) { final int userId = livingUsers.get(i).id; - if (mPmInternal.isPermissionUpgradeNeeded(userId)) { + if (mSettings.isPermissionUpgradeNeeded(userId)) { grantPermissionsUserIds = ArrayUtils.appendInt( grantPermissionsUserIds, userId); } @@ -4350,11 +4096,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (packageName == null) { return; } - AndroidPackage pkg = mPackages.get(packageName); + final Computer snapshot = snapshotComputer(); + AndroidPackage pkg = snapshot.getPackage(packageName); if (pkg == null) { return; } - sendPackageChangedBroadcast(pkg.getPackageName(), + sendPackageChangedBroadcast(snapshot, pkg.getPackageName(), true /* dontKillApp */, new ArrayList<>(Collections.singletonList(pkg.getPackageName())), pkg.getUid(), @@ -4407,14 +4154,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService mSnapshotStatistics.dump(pw, " ", now, hits, -1, isBrief); } - /** - * Dump package manager states to the file according to a given dumping type of - * {@link DumpState}. - */ - void dumpComputer(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) { - mComputer.dump(type, fd, pw, dumpState); - } - //TODO: b/111402650 private void disableSkuSpecificApps() { String[] apkList = mContext.getResources().getStringArray( @@ -4428,10 +4167,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (!TextUtils.isEmpty(sku) && ArrayUtils.contains(skuArray, sku)) { return; } + final Computer snapshot = snapshotComputer(); for (String packageName : apkList) { - mIPackageManager.setSystemAppHiddenUntilInstalled(packageName, true); + setSystemAppHiddenUntilInstalled(snapshot, packageName, true); for (UserInfo user : mInjector.getUserManagerInternal().getUsers(false)) { - mIPackageManager.setSystemAppInstallState(packageName, false, user.id); + setSystemAppInstallState(snapshot, packageName, false, user.id); } } } @@ -4524,7 +4264,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPermissionManager.writeLegacyPermissionStateTEMP(); mSettings.readPermissionStateForUserSyncLPr(userId); mPermissionManager.readLegacyPermissionStateTEMP(); - return mPmInternal.isPermissionUpgradeNeeded(userId); + return mSettings.isPermissionUpgradeNeeded(userId); } } @@ -4544,12 +4284,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - boolean userNeedsBadging(int userId) { - return mUserNeedsBadging.get(userId); - } - - private void deletePackageIfUnused(final String packageName) { - PackageStateInternal ps = getPackageStateInternal(packageName); + private void deletePackageIfUnused(@NonNull Computer snapshot, final String packageName) { + PackageStateInternal ps = snapshot.getPackageStateInternal(packageName); if (ps == null) { return; } @@ -4567,41 +4303,101 @@ public class PackageManagerService implements PackageSender, TestUtilityService 0, PackageManager.DELETE_ALL_USERS, true /*removedBySystem*/)); } - private AndroidPackage getPackage(String packageName) { - return mComputer.getPackage(packageName); + void deletePreloadsFileCache() { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CLEAR_APP_CACHE, + "deletePreloadsFileCache"); + File dir = Environment.getDataPreloadsFileCacheDirectory(); + Slog.i(PackageManagerService.TAG, "Deleting preloaded file cache " + dir); + FileUtils.deleteContents(dir); } - private AndroidPackage getPackage(int uid) { - return mComputer.getPackage(uid); + void setSystemAppHiddenUntilInstalled(@NonNull Computer snapshot, String packageName, + boolean hidden) { + final int callingUid = Binder.getCallingUid(); + final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID + || callingUid == Process.SYSTEM_UID; + if (!calledFromSystemOrPhone) { + mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, + "setSystemAppHiddenUntilInstalled"); + } + + final PackageStateInternal stateRead = snapshot.getPackageStateInternal(packageName); + if (stateRead == null || !stateRead.isSystem() || stateRead.getPkg() == null) { + return; + } + if (stateRead.getPkg().isCoreApp() && !calledFromSystemOrPhone) { + throw new SecurityException("Only system or phone callers can modify core apps"); + } + + commitPackageStateMutation(null, mutator -> { + mutator.forPackage(packageName) + .setHiddenUntilInstalled(hidden); + mutator.forDisabledSystemPackage(packageName) + .setHiddenUntilInstalled(hidden); + }); } - private SigningDetails getSigningDetails(@NonNull String packageName) { - return mComputer.getSigningDetails(packageName); + boolean setSystemAppInstallState(@NonNull Computer snapshot, String packageName, + boolean installed, int userId) { + final int callingUid = Binder.getCallingUid(); + final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID + || callingUid == Process.SYSTEM_UID; + if (!calledFromSystemOrPhone) { + mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, + "setSystemAppHiddenUntilInstalled"); + } + + final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); + // The target app should always be in system + if (packageState == null || !packageState.isSystem() || packageState.getPkg() == null) { + return false; + } + if (packageState.getPkg().isCoreApp() && !calledFromSystemOrPhone) { + throw new SecurityException("Only system or phone callers can modify core apps"); + } + // Check if the install state is the same + if (packageState.getUserStateOrDefault(userId).isInstalled() == installed) { + return false; + } + + final long callingId = Binder.clearCallingIdentity(); + try { + if (installed) { + // install the app from uninstalled state + mInstallPackageHelper.installExistingPackageAsUser( + packageName, + userId, + PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS, + PackageManager.INSTALL_REASON_DEVICE_SETUP, + null, + null); + return true; + } + + // uninstall the app from installed state + deletePackageVersioned( + new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST), + new PackageManager.LegacyPackageDeleteObserver(null).getBinder(), + userId, + PackageManager.DELETE_SYSTEM_APP); + return true; + } finally { + Binder.restoreCallingIdentity(callingId); + } } - private SigningDetails getSigningDetails(int uid) { - return mComputer.getSigningDetails(uid); - } + void finishPackageInstall(int token, boolean didLaunch) { + PackageManagerServiceUtils.enforceSystemOrRoot( + "Only the system is allowed to finish installs"); - private boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) { - return mComputer.filterAppAccess(pkg, callingUid, userId); - } + if (PackageManagerService.DEBUG_INSTALL) { + Slog.v(PackageManagerService.TAG, "BM finishing package install for " + token); + } + Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "restore", token); - private boolean filterAppAccess(String packageName, int callingUid, int userId) { - return mComputer.filterAppAccess(packageName, callingUid, userId); - } - - private boolean filterAppAccess(int uid, int callingUid) { - return mComputer.filterAppAccess(uid, callingUid); - } - - @Nullable - private int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId) { - return mComputer.getVisibilityAllowList(packageName, userId); - } - - boolean canQueryPackage(int callingUid, @Nullable String targetPackageName) { - return mComputer.canQueryPackage(callingUid, targetPackageName); + final Message msg = mHandler.obtainMessage(PackageManagerService.POST_INSTALL, token, + didLaunch ? 1 : 0); + mHandler.sendMessage(msg); } void checkPackageStartable(@NonNull Computer snapshot, @NonNull String packageName, @@ -4689,71 +4485,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - public class IPackageManagerImpl extends IPackageManager.Stub { + public class IPackageManagerImpl extends IPackageManagerBase { - @Override - public boolean activitySupportsIntent(ComponentName component, Intent intent, - String resolvedType) { - return mComputer.activitySupportsIntent(mResolveComponentName, component, intent, - resolvedType); - } - - @Override - public void addCrossProfileIntentFilter(IntentFilter intentFilter, String ownerPackage, - int sourceUserId, int targetUserId, int flags) { - PackageManagerService.this.addCrossProfileIntentFilter( - new WatchedIntentFilter(intentFilter), ownerPackage, sourceUserId, targetUserId, - flags); - } - - // NOTE: Can't remove due to unsupported app usage - @Override - public boolean addPermission(PermissionInfo info) { - // Because this is accessed via the package manager service AIDL, - // go through the permission manager service AIDL - return mContext.getSystemService(PermissionManager.class).addPermission(info, false); - } - - // NOTE: Can't remove due to unsupported app usage - @Override - public boolean addPermissionAsync(PermissionInfo info) { - // Because this is accessed via the package manager service AIDL, - // go through the permission manager service AIDL - return mContext.getSystemService(PermissionManager.class).addPermission(info, true); - } - - @Override - public void addPersistentPreferredActivity(IntentFilter filter, ComponentName activity, - int userId) { - mPreferredActivityHelper.addPersistentPreferredActivity(new WatchedIntentFilter(filter), - activity, userId); - } - - @Override - public void addPreferredActivity(IntentFilter filter, int match, - ComponentName[] set, ComponentName activity, int userId, boolean removeExisting) { - mPreferredActivityHelper.addPreferredActivity(new WatchedIntentFilter(filter), match, - set, activity, true, userId, "Adding preferred", removeExisting); - } - - /* - * Returns if intent can be forwarded from the sourceUserId to the targetUserId - */ - @Override - public boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType, - @UserIdInt int sourceUserId, @UserIdInt int targetUserId) { - return mComputer.canForwardTo(intent, resolvedType, sourceUserId, targetUserId); - } - - @Override - public boolean canRequestPackageInstalls(String packageName, int userId) { - return mComputer.canRequestPackageInstalls(packageName, Binder.getCallingUid(), userId, - true /* throwIfPermNotDeclared*/); - } - - @Override - public String[] canonicalToCurrentPackageNames(String[] names) { - return mComputer.canonicalToCurrentPackageNames(names); + public IPackageManagerImpl() { + super(PackageManagerService.this, mContext, mDexOptHelper, mModuleInfoProvider, + mPreferredActivityHelper, mResolveIntentHelper, mDomainVerificationManager, + mDomainVerificationConnection, mInstallerService, mPackageProperty, + mResolveComponentName, mInstantAppResolverSettingsComponent, + mRequiredSdkSandboxPackage, mServicesExtensionPackageName, + mSharedSystemSharedLibraryPackageName); } @Override @@ -4762,33 +4502,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService .checkPackageStartable(snapshotComputer(), packageName, userId); } - // NOTE: Can't remove due to unsupported app usage - @Override - public int checkPermission(String permName, String pkgName, int userId) { - return PackageManagerService.this.checkPermission(permName, pkgName, userId); - } - - @Override - public int checkSignatures(@NonNull String pkg1, @NonNull String pkg2) { - return mComputer.checkSignatures(pkg1, pkg2); - } - - @Override - public int checkUidPermission(String permName, int uid) { - return mComputer.checkUidPermission(permName, uid); - } - - @Override - public int checkUidSignatures(int uid1, int uid2) { - return mComputer.checkUidSignatures(uid1, uid2); - } - @Override public void clearApplicationProfileData(String packageName) { PackageManagerServiceUtils.enforceSystemOrRoot( "Only the system can clear all profile data"); - final AndroidPackage pkg = getPackage(packageName); + final Computer snapshot = snapshotComputer(); + final AndroidPackage pkg = snapshot.getPackage(packageName); try (PackageFreezer ignored = freezePackage(packageName, "clearApplicationProfileData")) { synchronized (mInstallLock) { mAppDataHelper.clearAppProfilesLIF(pkg); @@ -4803,10 +4523,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService android.Manifest.permission.CLEAR_APP_USER_DATA, null); final int callingUid = Binder.getCallingUid(); - enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, + final Computer snapshot = snapshotComputer(); + snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, false /* checkShell */, "clear application data"); - if (mComputer.getPackageStateFiltered(packageName, callingUid, userId) == null) { + if (snapshot.getPackageStateFiltered(packageName, callingUid, userId) == null) { if (observer != null) { mHandler.post(() -> { try { @@ -4831,7 +4552,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService try (PackageFreezer freezer = freezePackage(packageName, "clearApplicationUserData")) { synchronized (mInstallLock) { - succeeded = clearApplicationUserDataLIF(packageName, userId); + succeeded = clearApplicationUserDataLIF(snapshotComputer(), packageName, + userId); } mInstantAppRegistry.deleteInstantApplicationMetadata(packageName, userId); synchronized (mLock) { @@ -4849,8 +4571,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService } if (checkPermission(Manifest.permission.SUSPEND_APPS, packageName, userId) == PERMISSION_GRANTED) { - unsuspendForSuspendingPackage(snapshotComputer(), packageName, userId); - removeAllDistractingPackageRestrictions(userId); + final Computer snapshot = snapshotComputer(); + unsuspendForSuspendingPackage(snapshot, packageName, userId); + removeAllDistractingPackageRestrictions(snapshot, userId); flushPackageRestrictionsAsUserInternalLocked(userId); } } @@ -4870,7 +4593,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService mContext.enforceCallingOrSelfPermission( android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); final int callingUid = Binder.getCallingUid(); - enforceOwnerRights(ownerPackage, callingUid); + final Computer snapshot = snapshotComputer(); + enforceOwnerRights(snapshot, ownerPackage, callingUid); PackageManagerServiceUtils.enforceShellRestriction(mInjector.getUserManagerInternal(), UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, sourceUserId); synchronized (mLock) { @@ -4888,22 +4612,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override - public void clearPackagePersistentPreferredActivities(String packageName, int userId) { - mPreferredActivityHelper.clearPackagePersistentPreferredActivities(packageName, userId); - } - - @Override - public void clearPackagePreferredActivities(String packageName) { - mPreferredActivityHelper.clearPackagePreferredActivities(packageName); - } - - @Override - public String[] currentToCanonicalPackageNames(String[] names) { - return mComputer.currentToCanonicalPackageNames(names); - } - - @Override - public void deleteApplicationCacheFiles(final String packageName, + public final void deleteApplicationCacheFiles(final String packageName, final IPackageDataObserver observer) { final int userId = UserHandle.getCallingUserId(); deleteApplicationCacheFilesAsUser(packageName, userId, observer); @@ -4928,17 +4637,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService mContext.enforceCallingOrSelfPermission( android.Manifest.permission.INTERNAL_DELETE_CACHE_FILES, null); } - enforceCrossUserPermission(callingUid, userId, /* requireFullPermission= */ true, + final Computer snapshot = snapshotComputer(); + snapshot.enforceCrossUserPermission(callingUid, userId, /* requireFullPermission= */ true, /* checkShell= */ false, "delete application cache files"); final int hasAccessInstantApps = mContext.checkCallingOrSelfPermission( android.Manifest.permission.ACCESS_INSTANT_APPS); - final AndroidPackage pkg = getPackage(packageName); - // Queue up an async operation since the package deletion may take a little while. mHandler.post(() -> { - final PackageStateInternal ps = - pkg == null ? null : getPackageStateInternal(pkg.getPackageName()); + // Snapshot in the Handler Runnable since this may be deferred quite a bit + // TODO: Is this and the later mInstallLock re-snapshot necessary? + final Computer newSnapshot = snapshotComputer(); + final PackageStateInternal ps = newSnapshot.getPackageStateInternal(packageName); boolean doClearData = true; if (ps != null) { final boolean targetIsInstantApp = @@ -4949,6 +4659,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (doClearData) { synchronized (mInstallLock) { final int flags = FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL; + // Snapshot again after mInstallLock? + final AndroidPackage pkg = snapshotComputer().getPackage(packageName); // We're only clearing cache files, so we don't care if the // app is unfrozen and still able to run mAppDataHelper.clearAppDataLIF(pkg, userId, @@ -4967,48 +4679,19 @@ public class PackageManagerService implements PackageSender, TestUtilityService }); } - @Override - public void deleteExistingPackageAsUser(VersionedPackage versionedPackage, - final IPackageDeleteObserver2 observer, final int userId) { - PackageManagerService.this.deleteExistingPackageAsUser(versionedPackage, observer, - userId); - } - - @Override - public void deletePackageAsUser(String packageName, int versionCode, - IPackageDeleteObserver observer, int userId, int flags) { - deletePackageVersioned(new VersionedPackage(packageName, versionCode), - new PackageManager.LegacyPackageDeleteObserver(observer).getBinder(), userId, flags); - } - - @Override - public void deletePackageVersioned(VersionedPackage versionedPackage, - final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) { - PackageManagerService.this.deletePackageVersioned(versionedPackage, observer, - userId, deleteFlags); - } - - @Override - public void deletePreloadsFileCache() { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CLEAR_APP_CACHE, - "deletePreloadsFileCache"); - File dir = Environment.getDataPreloadsFileCacheDirectory(); - Slog.i(PackageManagerService.TAG, "Deleting preloaded file cache " + dir); - FileUtils.deleteContents(dir); - } - @Override public void dumpProfiles(String packageName) { /* Only the shell, root, or the app user should be able to dump profiles. */ final int callingUid = Binder.getCallingUid(); - final String[] callerPackageNames = getPackagesForUid(callingUid); + final Computer snapshot = snapshotComputer(); + final String[] callerPackageNames = snapshot.getPackagesForUid(callingUid); if (callingUid != Process.SHELL_UID && callingUid != Process.ROOT_UID && !ArrayUtils.contains(callerPackageNames, packageName)) { throw new SecurityException("dumpProfiles"); } - AndroidPackage pkg = mComputer.getPackage(packageName); + AndroidPackage pkg = snapshot.getPackage(packageName); if (pkg == null) { throw new IllegalArgumentException("Unknown package: " + packageName); } @@ -5062,46 +4745,25 @@ public class PackageManagerService implements PackageSender, TestUtilityService }); } - @Override - public ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) { - return mPreferredActivityHelper.findPersistentPreferredActivity(intent, userId); - } - - @Override - public void finishPackageInstall(int token, boolean didLaunch) { - PackageManagerServiceUtils.enforceSystemOrRoot( - "Only the system is allowed to finish installs"); - - if (PackageManagerService.DEBUG_INSTALL) { - Slog.v(PackageManagerService.TAG, "BM finishing package install for " + token); - } - Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "restore", token); - - final Message msg = mHandler.obtainMessage(PackageManagerService.POST_INSTALL, token, didLaunch ? 1 : 0); - mHandler.sendMessage(msg); - } - @WorkerThread @Override public void flushPackageRestrictionsAsUser(int userId) { - if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + final Computer snapshot = snapshotComputer(); + final int callingUid = Binder.getCallingUid(); + if (snapshot.getInstantAppPackageName(callingUid) != null) { return; } if (!mUserManager.exists(userId)) { return; } - enforceCrossUserPermission(Binder.getCallingUid(), userId, false /* requireFullPermission*/, - false /* checkShell */, "flushPackageRestrictions"); + snapshot.enforceCrossUserPermission(callingUid, userId, + false /* requireFullPermission*/, false /* checkShell */, + "flushPackageRestrictions"); synchronized (mLock) { flushPackageRestrictionsAsUserInternalLocked(userId); } } - @Override - public void forceDexOpt(String packageName) { - mDexOptHelper.forceDexOpt(packageName); - } - @Override public void freeStorage(final String volumeUuid, final long freeStorageSize, @@ -5149,84 +4811,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService }); } - @Override - public ActivityInfo getActivityInfo(ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, int userId) { - return mComputer.getActivityInfo(component, flags, userId); - } - - @NonNull - @Override - public ParceledListSlice getAllIntentFilters(@NonNull String packageName) { - return mComputer.getAllIntentFilters(packageName); - } - - @Override - public List getAllPackages() { - return mComputer.getAllPackages(); - } - - // NOTE: Can't remove due to unsupported app usage - @NonNull - @Override - public String[] getAppOpPermissionPackages(@NonNull String permissionName) { - return mComputer.getAppOpPermissionPackages(permissionName); - } - - @Override - public String getAppPredictionServicePackageName() { - return ensureSystemPackageName( - getPackageFromComponentString(R.string.config_defaultAppPredictionService)); - } - - @PackageManager.EnabledState - @Override - public int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId) { - return mComputer.getApplicationEnabledSetting(packageName, userId); - } - - /** - * Returns true if application is not found or there was an error. Otherwise it returns - * the hidden state of the package for the given user. - */ - @Override - public boolean getApplicationHiddenSettingAsUser(@NonNull String packageName, - @UserIdInt int userId) { - return mComputer.getApplicationHiddenSettingAsUser(packageName, userId); - } - - @Override - public ApplicationInfo getApplicationInfo(String packageName, - @PackageManager.ApplicationInfoFlagsBits long flags, int userId) { - return mComputer.getApplicationInfo(packageName, flags, userId); - } - - @Override - public IArtManager getArtManager() { - return mArtManagerService; - } - - @Override - public @Nullable String getAttentionServicePackageName() { - return ensureSystemPackageName( - getPackageFromComponentString(R.string.config_defaultAttentionService)); - } - - @Override - public boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId) { - return mComputer.getBlockUninstallForUser(packageName, userId); - } - @Override public ChangedPackages getChangedPackages(int sequenceNumber, int userId) { final int callingUid = Binder.getCallingUid(); - if (getInstantAppPackageName(callingUid) != null) { + final Computer snapshot = snapshotComputer(); + if (snapshot.getInstantAppPackageName(callingUid) != null) { return null; } if (!mUserManager.exists(userId)) { return null; } - enforceCrossUserPermission(callingUid, userId, false, false, "getChangedPackages"); + snapshot.enforceCrossUserPermission(callingUid, userId, false, false, + "getChangedPackages"); final ChangedPackages changedPackages = mChangedPackagesTracker.getChangedPackages( sequenceNumber, userId); @@ -5234,8 +4830,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService final List packageNames = changedPackages.getPackageNames(); for (int index = packageNames.size() - 1; index >= 0; index--) { // Filter out the changes if the calling package should not be able to see it. - final PackageSetting ps = mSettings.getPackageLPr(packageNames.get(index)); - if (shouldFilterApplication(ps, callingUid, userId)) { + final PackageStateInternal packageState = + snapshot.getPackageStateInternal(packageNames.get(index)); + if (snapshot.shouldFilterApplication(packageState, callingUid, userId)) { packageNames.remove(index); } } @@ -5244,41 +4841,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService return changedPackages; } - @Override - public int getComponentEnabledSetting(@NonNull ComponentName component, int userId) { - return mComputer.getComponentEnabledSetting(component, Binder.getCallingUid(), userId); - } - - @Override - public String getContentCaptureServicePackageName() { - return ensureSystemPackageName( - getPackageFromComponentString(R.string.config_defaultContentCaptureService)); - } - - @Nullable - @Override - public ParceledListSlice getDeclaredSharedLibraries( - @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, - @NonNull int userId) { - return mComputer.getDeclaredSharedLibraries(packageName, flags, userId); - } - - /** - * Non-Binder method, support for the backup/restore mechanism: write the - * default browser (etc) settings in its canonical XML format. Returns the default - * browser XML representation as a byte array, or null if there is none. - */ - @Override - public byte[] getDefaultAppsBackup(int userId) { - return mPreferredActivityHelper.getDefaultAppsBackup(userId); - } - - @Override - public String getDefaultTextClassifierPackageName() { - return ensureSystemPackageName( - mContext.getString(R.string.config_servicesExtensionPackage)); - } - @Override public byte[] getDomainVerificationBackup(int userId) { if (Binder.getCallingUid() != Process.SYSTEM_UID) { @@ -5300,17 +4862,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Override - public int getFlagsForUid(int uid) { - return mComputer.getFlagsForUid(uid); - } - - @Nullable - @Override - public CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId) { - return mComputer.getHarmfulAppWarning(packageName, userId); - } - @Override public IBinder getHoldLockToken() { if (!Build.IS_DEBUGGABLE) { @@ -5326,73 +4877,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService return token; } - @Override - public ComponentName getHomeActivities(List allHomeCandidates) { - if (getInstantAppPackageName(Binder.getCallingUid()) != null) { - return null; - } - return getHomeActivitiesAsUser(allHomeCandidates, UserHandle.getCallingUserId()); - } - - public String getIncidentReportApproverPackageName() { - return ensureSystemPackageName(mContext.getString( - R.string.config_incidentReportApproverPackage)); - } - - @Override - public int getInstallLocation() { - // allow instant app access - return android.provider.Settings.Global.getInt(mContext.getContentResolver(), - android.provider.Settings.Global.DEFAULT_INSTALL_LOCATION, - InstallLocationUtils.APP_INSTALL_AUTO); - } - - @PackageManager.InstallReason - @Override - public int getInstallReason(@NonNull String packageName, @UserIdInt int userId) { - return mComputer.getInstallReason(packageName, userId); - } - - @Override - @Nullable - public InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) { - return mComputer.getInstallSourceInfo(packageName); - } - - @Override - public ParceledListSlice getInstalledApplications( - @PackageManager.ApplicationInfoFlagsBits long flags, int userId) { - final int callingUid = Binder.getCallingUid(); - return new ParceledListSlice<>( - mComputer.getInstalledApplications(flags, userId, callingUid)); - } - - @Override - public List getInstalledModules(int flags) { - return mModuleInfoProvider.getInstalledModules(flags); - } - - @Override - public ParceledListSlice getInstalledPackages( - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - return mComputer.getInstalledPackages(flags, userId); - } - - @Nullable - @Override - public String getInstallerPackageName(@NonNull String packageName) { - return mComputer.getInstallerPackageName(packageName); - } - @Override public String getInstantAppAndroidId(String packageName, int userId) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_INSTANT_APPS, - "getInstantAppAndroidId"); - enforceCrossUserPermission(Binder.getCallingUid(), userId, + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.ACCESS_INSTANT_APPS, "getInstantAppAndroidId"); + final Computer snapshot = snapshotComputer(); + snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId, true /* requireFullPermission */, false /* checkShell */, "getInstantAppAndroidId"); // Make sure the target is an Instant App. - if (!isInstantApp(packageName, userId)) { + if (!snapshot.isInstantApp(packageName, userId)) { return null; } return mInstantAppRegistry.getInstantAppAndroidId(packageName, userId); @@ -5404,13 +4898,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService return null; } - enforceCrossUserPermission(Binder.getCallingUid(), userId, + final Computer snapshot = snapshotComputer(); + snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId, true /* requireFullPermission */, false /* checkShell */, "getInstantAppCookie"); - if (!isCallerSameApp(packageName, Binder.getCallingUid())) { + if (!snapshot.isCallerSameApp(packageName, Binder.getCallingUid())) { return null; } - PackageStateInternal packageState = getPackageStateInternal(packageName); + PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); if (packageState == null || packageState.getPkg() == null) { return null; } @@ -5423,88 +4918,44 @@ public class PackageManagerService implements PackageSender, TestUtilityService return null; } - if (!canViewInstantApps(Binder.getCallingUid(), userId)) { + final Computer snapshot = snapshotComputer(); + if (!snapshot.canViewInstantApps(Binder.getCallingUid(), userId)) { mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS, "getInstantAppIcon"); } - enforceCrossUserPermission(Binder.getCallingUid(), userId, + snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId, true /* requireFullPermission */, false /* checkShell */, "getInstantAppIcon"); return mInstantAppRegistry.getInstantAppIcon(packageName, userId); } - @Override - public ComponentName getInstantAppInstallerComponent() { - if (getInstantAppPackageName(Binder.getCallingUid()) != null) { - return null; - } - return mInstantAppInstallerActivity == null - ? null : mInstantAppInstallerActivity.getComponentName(); - } - - @Override - public @Nullable ComponentName getInstantAppResolverComponent() { - if (getInstantAppPackageName(Binder.getCallingUid()) != null) { - return null; - } - return getInstantAppResolver(); - } - - @Override - public ComponentName getInstantAppResolverSettingsComponent() { - return mInstantAppResolverSettingsComponent; - } - @Override public ParceledListSlice getInstantApps(int userId) { - if (PackageManagerService.HIDE_EPHEMERAL_APIS) { + if (HIDE_EPHEMERAL_APIS) { return null; } - if (!canViewInstantApps(Binder.getCallingUid(), userId)) { + + final Computer snapshot = snapshotComputer(); + if (!snapshot.canViewInstantApps(Binder.getCallingUid(), userId)) { mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS, "getEphemeralApplications"); } - enforceCrossUserPermission(Binder.getCallingUid(), userId, + snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId, true /* requireFullPermission */, false /* checkShell */, "getEphemeralApplications"); - Computer computer = snapshotComputer(); - List instantApps = mInstantAppRegistry.getInstantApps(computer, userId); + List instantApps = mInstantAppRegistry.getInstantApps(snapshot, userId); if (instantApps != null) { return new ParceledListSlice<>(instantApps); } return null; } - @Nullable - @Override - public InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags) { - return mComputer.getInstrumentationInfo(component, flags); - } - - @Deprecated - @Override - public @NonNull ParceledListSlice getIntentFilterVerifications( - String packageName) { - return ParceledListSlice.emptyList(); - } - - @Deprecated - @Override - public int getIntentVerificationStatus(String packageName, int userId) { - return mDomainVerificationManager.getLegacyState(packageName, userId); - } - - @Nullable - @Override - public KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) { - return mComputer.getKeySetByAlias(packageName, alias); - } - @Override public ResolveInfo getLastChosenActivity(Intent intent, String resolvedType, int flags) { - return mPreferredActivityHelper.getLastChosenActivity(intent, resolvedType, flags); + return mPreferredActivityHelper.getLastChosenActivity(snapshotComputer(), intent, + resolvedType, flags); } @Override @@ -5516,13 +4967,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public List getMimeGroup(String packageName, String mimeGroup) { - enforceOwnerRights(packageName, Binder.getCallingUid()); - return getMimeGroupInternal(packageName, mimeGroup); - } - - @Override - public ModuleInfo getModuleInfo(String packageName, @PackageManager.ModuleInfoFlags int flags) { - return PackageManagerService.this.getModuleInfo(packageName, flags); + final Computer snapshot = snapshotComputer(); + enforceOwnerRights(snapshot, packageName, Binder.getCallingUid()); + return getMimeGroupInternal(snapshot, packageName, mimeGroup); } @Override @@ -5532,99 +4979,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mMoveCallbacks.mLastStatus.get(moveId); } - @Nullable - @Override - public String getNameForUid(int uid) { - return mComputer.getNameForUid(uid); - } - - @Nullable - @Override - public String[] getNamesForUids(@NonNull int[] uids) { - return mComputer.getNamesForUids(uids); - } - - @Override - public int[] getPackageGids(String packageName, @PackageManager.PackageInfoFlagsBits long flags, - int userId) { - return mComputer.getPackageGids(packageName, flags, userId); - } - - @Override - public PackageInfo getPackageInfo(String packageName, - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - return mComputer.getPackageInfo(packageName, flags, userId); - } - - @Override - public PackageInfo getPackageInfoVersioned(VersionedPackage versionedPackage, - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - return mComputer.getPackageInfoInternal(versionedPackage.getPackageName(), - versionedPackage.getLongVersionCode(), flags, Binder.getCallingUid(), userId); - } - - @Override - public IPackageInstaller getPackageInstaller() { - // Return installer service for internal calls. - if (PackageManagerServiceUtils.isSystemOrRoot()) { - return mInstallerService; - } - // Return null for InstantApps. - if (snapshotComputer().getInstantAppPackageName(Binder.getCallingUid()) != null) { - return null; - } - return mInstallerService; - } - - @Override - public void getPackageSizeInfo(final String packageName, int userId, - final IPackageStatsObserver observer) { - throw new UnsupportedOperationException( - "Shame on you for calling the hidden API getPackageSizeInfo(). Shame!"); - } - - @Override - public int getPackageUid(@NonNull String packageName, - @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { - return mComputer.getPackageUid(packageName, flags, userId); - } - - /** - * IMPORTANT: Not all packages returned by this method may be known - * to the system. There are two conditions in which this may occur: - *
    - *
  1. The package is on adoptable storage and the device has been removed
  2. - *
  3. The package is being removed and the internal structures are partially updated
  4. - *
- * The second is an artifact of the current data structures and should be fixed. See - * b/111075456 for one such instance. - * This binder API is cached. If the algorithm in this method changes, - * or if the underlying objecs (as returned by getSettingLPr()) change - * then the logic that invalidates the cache must be revisited. See - * calls to invalidateGetPackagesForUidCache() to locate the points at - * which the cache is invalidated. - */ - @Override - public String[] getPackagesForUid(int uid) { - final int callingUid = Binder.getCallingUid(); - final int userId = UserHandle.getUserId(uid); - mComputer.enforceCrossUserOrProfilePermission(callingUid, userId, - /* requireFullPermission */ false, - /* checkShell */ false, "getPackagesForUid"); - return mComputer.getPackagesForUid(uid); - } - - @Override - public ParceledListSlice getPackagesHoldingPermissions( - @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags, - @UserIdInt int userId) { - return mComputer.getPackagesHoldingPermissions(permissions, flags, userId); - } - @Override public String getPermissionControllerPackageName() { final int callingUid = Binder.getCallingUid(); - if (mComputer.getPackageStateFiltered(mRequiredPermissionControllerPackage, + final Computer snapshot = snapshotComputer(); + if (snapshot.getPackageStateFiltered(mRequiredPermissionControllerPackage, callingUid, UserHandle.getUserId(callingUid)) != null) { return mRequiredPermissionControllerPackage; } @@ -5632,73 +4991,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService throw new IllegalStateException("PermissionController is not found"); } - // NOTE: Can't remove due to unsupported app usage - @Override - public PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) { - return PackageManagerService.this.getPermissionGroupInfo(groupName, flags); - } - - @Override - public @NonNull ParceledListSlice getPersistentApplications(int flags) { - if (getInstantAppPackageName(Binder.getCallingUid()) != null) { - return ParceledListSlice.emptyList(); - } - return new ParceledListSlice<>(mComputer.getPersistentApplications(mSafeMode, flags)); - } - - @Override - public int getPreferredActivities(List outFilters, - List outActivities, String packageName) { - return mPreferredActivityHelper.getPreferredActivities(outFilters, outActivities, - packageName, snapshotComputer()); - } - - /** - * Non-Binder method, support for the backup/restore mechanism: write the - * full set of preferred activities in its canonical XML format. Returns the - * XML output as a byte array, or null if there is none. - */ - @Override - public byte[] getPreferredActivityBackup(int userId) { - return mPreferredActivityHelper.getPreferredActivityBackup(userId); - } - - @Override - public int getPrivateFlagsForUid(int uid) { - return mComputer.getPrivateFlagsForUid(uid); - } - - @Override - public PackageManager.Property getProperty(String propertyName, String packageName, String className) { - Objects.requireNonNull(propertyName); - Objects.requireNonNull(packageName); - PackageStateInternal packageState = mComputer.getPackageStateFiltered(packageName, - Binder.getCallingUid(), UserHandle.getCallingUserId()); - if (packageState == null) { - return null; - } - return mPackageProperty.getProperty(propertyName, packageName, className); - } - - @Nullable - @Override - public ProviderInfo getProviderInfo(@NonNull ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { - return mComputer.getProviderInfo(component, flags, userId); - } - - @Override - public ActivityInfo getReceiverInfo(ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, int userId) { - return mComputer.getReceiverInfo(component, flags, userId); - } - - @Override - public @Nullable String getRotationResolverPackageName() { - return ensureSystemPackageName( - getPackageFromComponentString(R.string.config_defaultRotationResolverService)); - } - @Override public int getRuntimePermissionsVersion(@UserIdInt int userId) { Preconditions.checkArgumentNonnegative(userId); @@ -5707,65 +4999,25 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mSettings.getDefaultRuntimePermissionsVersion(userId); } - @Nullable - @Override - public ServiceInfo getServiceInfo(@NonNull ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { - return mComputer.getServiceInfo(component, flags, userId); - } - - @Override - public @NonNull String getServicesSystemSharedLibraryPackageName() { - return mServicesExtensionPackageName; - } - - @Override - public String getSetupWizardPackageName() { - if (Binder.getCallingUid() != Process.SYSTEM_UID) { - throw new SecurityException("Non-system caller"); - } - return mPmInternal.getSetupWizardPackageName(); - } - - @Override - public ParceledListSlice getSharedLibraries(String packageName, - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - return mComputer.getSharedLibraries(packageName, flags, userId); - } - - @Override - public @NonNull String getSharedSystemSharedLibraryPackageName() { - return mSharedSystemSharedLibraryPackageName; - } - - @Nullable - @Override - public KeySet getSigningKeySet(@NonNull String packageName) { - return mComputer.getSigningKeySet(packageName); - } - @Override public String getSplashScreenTheme(@NonNull String packageName, int userId) { - PackageStateInternal packageState = - getPackageStateInstalledFiltered(packageName, Binder.getCallingUid(), userId); + final Computer snapshot = snapshotComputer(); + PackageStateInternal packageState = filterPackageStateForInstalledAndFiltered(snapshot, + packageName, Binder.getCallingUid(), userId); return packageState == null ? null : packageState.getUserStateOrDefault(userId).getSplashScreenTheme(); } - @Override - public String getSdkSandboxPackageName() { - return mRequiredSdkSandboxPackage; - } - @Override public Bundle getSuspendedPackageAppExtras(String packageName, int userId) { final int callingUid = Binder.getCallingUid(); - if (getPackageUid(packageName, 0, userId) != callingUid) { + final Computer snapshot = snapshot(); + if (snapshot.getPackageUid(packageName, 0, userId) != callingUid) { throw new SecurityException("Calling package " + packageName + " does not belong to calling uid " + callingUid); } - return mSuspendPackageHelper.getSuspendedPackageAppExtras( - packageName, userId, callingUid); + return mSuspendPackageHelper + .getSuspendedPackageAppExtras(snapshot, packageName, userId, callingUid); } @Override @@ -5784,34 +5036,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService return new ParceledListSlice<>(res); } - @Override - public String getSystemCaptionsServicePackageName() { - return ensureSystemPackageName( - getPackageFromComponentString(R.string.config_defaultSystemCaptionsService)); - } - - @Nullable - @Override - public String[] getSystemSharedLibraryNames() { - return mComputer.getSystemSharedLibraryNames(); - } - - @Override - public String getSystemTextClassifierPackageName() { - return ensureSystemPackageName( - mContext.getString(R.string.config_defaultTextClassifierPackage)); - } - - @Override - public int getTargetSdkVersion(@NonNull String packageName) { - return mComputer.getTargetSdkVersion(packageName); - } - - @Override - public int getUidForSharedUser(@NonNull String sharedUserName) { - return mComputer.getUidForSharedUser(sharedUserName); - } - @Override public String[] getUnsuspendablePackagesForUser(String[] packageNames, int userId) { Objects.requireNonNull(packageNames, "packageNames cannot be null"); @@ -5837,18 +5061,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Override - public String getWellbeingPackageName() { - final long identity = Binder.clearCallingIdentity(); - try { - return CollectionUtils.firstOrNull( - mContext.getSystemService(RoleManager.class).getRoleHolders( - RoleManager.ROLE_SYSTEM_WELLBEING)); - } finally { - Binder.restoreCallingIdentity(identity); - } - } - @Override public void grantImplicitAccess(int recipientUid, @NonNull String visibleAuthority) { final Computer snapshot = snapshotComputer(); @@ -5864,38 +5076,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService false /*direct*/, false /* retainOnUpdate */); } - // NOTE: Can't remove due to unsupported app usage - @Override - public void grantRuntimePermission(String packageName, String permName, final int userId) { - // Because this is accessed via the package manager service AIDL, - // go through the permission manager service AIDL - mContext.getSystemService(PermissionManager.class) - .grantRuntimePermission(packageName, permName, UserHandle.of(userId)); - } - - @Override - public boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate, - @PackageManager.CertificateInputType int type) { - return mComputer.hasSigningCertificate(packageName, certificate, type); - } - - @Override - public boolean hasSystemFeature(String name, int version) { - return PackageManagerService.this.hasSystemFeature(name, version); - } - - @Override - public boolean hasSystemUidErrors() { - // allow instant applications - return false; - } - - @Override - public boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate, - @PackageManager.CertificateInputType int type) { - return mComputer.hasUidSigningCertificate(uid, certificate, type); - } - @Override public void holdLock(IBinder token, int durationMs) { mTestUtilityService.verifyHoldLockToken(token); @@ -5923,56 +5103,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mode == MODE_IGNORED; } - @Override - public boolean isDeviceUpgrading() { - return PackageManagerService.this.isDeviceUpgrading(); - } - - @Override - public boolean isFirstBoot() { - return PackageManagerService.this.isFirstBoot(); - } - - @Override - public boolean isInstantApp(String packageName, int userId) { - return mComputer.isInstantApp(packageName, userId); - } - - @Override - public boolean isOnlyCoreApps() { - return PackageManagerService.this.isOnlyCoreApps(); - } - - @Override - public boolean isPackageAvailable(String packageName, int userId) { - return mComputer.isPackageAvailable(packageName, userId); - } - - @Override - public boolean isPackageDeviceAdminOnAnyUser(String packageName) { - return PackageManagerService.this.isPackageDeviceAdminOnAnyUser(packageName); - } - - @Override - public boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) { - return mComputer.isPackageSignedByKeySet(packageName, ks); - } - - @Override - public boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks) { - return mComputer.isPackageSignedByKeySetExactly(packageName, ks); - } - @Override public boolean isPackageStateProtected(@NonNull String packageName, @UserIdInt int userId) { final int callingUid = Binder.getCallingUid(); final int callingAppId = UserHandle.getAppId(callingUid); - enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/, + final Computer snapshot = snapshotComputer(); + snapshot.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/, true /*checkShell*/, "isPackageStateProtected"); if (callingAppId != Process.SYSTEM_UID && callingAppId != Process.ROOT_UID - && checkUidPermission(MANAGE_DEVICE_ADMINS, callingUid) != PERMISSION_GRANTED) { + && snapshot.checkUidPermission(MANAGE_DEVICE_ADMINS, callingUid) + != PERMISSION_GRANTED) { throw new SecurityException("Caller must have the " + MANAGE_DEVICE_ADMINS + " permission."); } @@ -5980,11 +5122,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mProtectedPackages.isPackageStateProtected(userId, packageName); } - @Override - public boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId) { - return mComputer.isPackageSuspendedForUser(packageName, userId); - } - @Override public boolean isProtectedBroadcast(String actionName) { if (actionName != null) { @@ -6002,22 +5139,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Override - public boolean isSafeMode() { - // allow instant applications - return mSafeMode; - } - - @Override - public boolean isStorageLow() { - return PackageManagerService.this.isStorageLow(); - } - - @Override - public boolean isUidPrivileged(int uid) { - return mComputer.isUidPrivileged(uid); - } - /** * Logs process start information (including base APK hash) to the security log. * @hide @@ -6025,13 +5146,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public void logAppProcessStartIfNeeded(String packageName, String processName, int uid, String seinfo, String apkFile, int pid) { - if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + final Computer snapshot = snapshotComputer(); + if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { return; } if (!SecurityLog.isLoggingEnabled()) { return; } - mProcessLoggingHandler.logAppProcessStart(mContext, mPmInternal, apkFile, packageName, + mProcessLoggingHandler.logAppProcessStart(mContext, + LocalServices.getService(PackageManagerInternal.class), apkFile, packageName, processName, uid, seinfo, pid); } @@ -6083,25 +5206,29 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override - public void notifyDexLoad(String loadingPackageName, Map classLoaderContextMap, + public void notifyDexLoad(String loadingPackageName, + Map classLoaderContextMap, String loaderIsa) { int callingUid = Binder.getCallingUid(); - if (PackageManagerService.PLATFORM_PACKAGE_NAME.equals(loadingPackageName) && callingUid != Process.SYSTEM_UID) { - Slog.w(PackageManagerService.TAG, "Non System Server process reporting dex loads as system server. uid=" - + callingUid); + if (PackageManagerService.PLATFORM_PACKAGE_NAME.equals(loadingPackageName) + && callingUid != Process.SYSTEM_UID) { + Slog.w(PackageManagerService.TAG, + "Non System Server process reporting dex loads as system server. uid=" + + callingUid); // Do not record dex loads from processes pretending to be system server. // Only the system server should be assigned the package "android", so reject calls // that don't satisfy the constraint. // // notifyDexLoad is a PM API callable from the app process. So in theory, apps could - // craft calls to this API and pretend to be system server. Doing so poses no particular - // danger for dex load reporting or later dexopt, however it is a sensible check to do - // in order to verify the expectations. + // craft calls to this API and pretend to be system server. Doing so poses no + // particular danger for dex load reporting or later dexopt, however it is a + // sensible check to do in order to verify the expectations. return; } int userId = UserHandle.getCallingUserId(); - ApplicationInfo ai = getApplicationInfo(loadingPackageName, /*flags*/ 0, userId); + ApplicationInfo ai = snapshot().getApplicationInfo(loadingPackageName, /*flags*/ 0, + userId); if (ai == null) { Slog.w(PackageManagerService.TAG, "Loading a package that does not exist for the calling user. package=" + loadingPackageName + ", user=" + userId); @@ -6115,11 +5242,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService public void notifyPackageUse(String packageName, int reason) { final int callingUid = Binder.getCallingUid(); final int callingUserId = UserHandle.getUserId(callingUid); + Computer snapshot = snapshotComputer(); final boolean notify; - if (getInstantAppPackageName(callingUid) != null) { - notify = isCallerSameApp(packageName, callingUid); + if (snapshot.getInstantAppPackageName(callingUid) != null) { + notify = snapshot.isCallerSameApp(packageName, callingUid); } else { - notify = !isInstantAppInternal(packageName, callingUserId, Process.SYSTEM_UID); + notify = !snapshot.isInstantAppInternal(packageName, callingUserId, + Process.SYSTEM_UID); } if (!notify) { return; @@ -6137,102 +5266,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService updateComponentLabelIcon(componentName, nonLocalizedLabel, icon, userId); } - /** - * Ask the package manager to perform a dex-opt with the given compiler filter. - * - * Note: exposed only for the shell command to allow moving packages explicitly to a - * definite state. - */ - @Override - public boolean performDexOptMode(String packageName, - boolean checkProfiles, String targetCompilerFilter, boolean force, - boolean bootComplete, String splitName) { - return mDexOptHelper.performDexOptMode(packageName, checkProfiles, targetCompilerFilter, - force, bootComplete, splitName); - } - - /** - * Ask the package manager to perform a dex-opt with the given compiler filter on the - * secondary dex files belonging to the given package. - * - * Note: exposed only for the shell command to allow moving packages explicitly to a - * definite state. - */ - @Override - public boolean performDexOptSecondary(String packageName, String compilerFilter, - boolean force) { - return mDexOptHelper.performDexOptSecondary(packageName, compilerFilter, force); - } - - @NonNull - @Override - public ParceledListSlice queryContentProviders(@Nullable String processName, - int uid, @PackageManager.ComponentInfoFlagsBits long flags, - @Nullable String metaDataKey) { - return mComputer.queryContentProviders(processName, uid, flags, metaDataKey); - } - - @NonNull - @Override - public ParceledListSlice queryInstrumentation( - @NonNull String targetPackage, int flags) { - return mComputer.queryInstrumentation(targetPackage, flags); - } - - @Override - public @NonNull ParceledListSlice queryIntentActivities(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - try { - Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "queryIntentActivities"); - - return new ParceledListSlice<>(snapshotComputer().queryIntentActivitiesInternal(intent, - resolvedType, flags, userId)); - } finally { - Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); - } - } - - @Override - public @NonNull ParceledListSlice queryIntentActivityOptions(ComponentName caller, - Intent[] specifics, String[] specificTypes, Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - return new ParceledListSlice<>(mResolveIntentHelper.queryIntentActivityOptionsInternal( - snapshotComputer(), caller, specifics, specificTypes, intent, resolvedType, flags, - userId)); - } - - @Override - public @NonNull ParceledListSlice queryIntentContentProviders(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - return new ParceledListSlice<>(mResolveIntentHelper.queryIntentContentProvidersInternal( - snapshotComputer(), intent, resolvedType, flags, userId)); - } - - @Override - public @NonNull ParceledListSlice queryIntentReceivers(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - return new ParceledListSlice<>(mResolveIntentHelper.queryIntentReceiversInternal( - snapshotComputer(), intent, resolvedType, flags, userId, Binder.getCallingUid())); - } - - @Override - public @NonNull ParceledListSlice queryIntentServices(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - final int callingUid = Binder.getCallingUid(); - return new ParceledListSlice<>(snapshotComputer().queryIntentServicesInternal( - intent, resolvedType, flags, userId, callingUid, false /*includeInstantApps*/)); - } - @Override public ParceledListSlice queryProperty( String propertyName, @PackageManager.PropertyLocation int componentType) { Objects.requireNonNull(propertyName); final int callingUid = Binder.getCallingUid(); final int callingUserId = UserHandle.getCallingUserId(); + final Computer snapshot = snapshotComputer(); final List result = mPackageProperty.queryProperty(propertyName, componentType, packageName -> { - final PackageStateInternal ps = getPackageStateInternal(packageName); - return shouldFilterApplication(ps, callingUid, callingUserId); + final PackageStateInternal ps = + snapshot.getPackageStateInternal(packageName); + return snapshot.shouldFilterApplication(ps, callingUid, callingUserId); }); if (result == null) { return ParceledListSlice.emptyList(); @@ -6240,11 +5285,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService return new ParceledListSlice<>(result); } - @Deprecated - public void querySyncProviders(List outNames, List outInfo) { - mComputer.querySyncProviders(mSafeMode, outNames, outInfo); - } - /** * Reconcile the information we have about the secondary dex files belonging to * {@code packageName} and the actual dex files. For all dex files that were @@ -6252,9 +5292,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService */ @Override public void reconcileSecondaryDexFiles(String packageName) { - if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + final Computer snapshot = snapshotComputer(); + if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { return; - } else if (isInstantAppInternal( + } else if (snapshot.isInstantAppInternal( packageName, UserHandle.getCallingUserId(), Process.SYSTEM_UID)) { return; } @@ -6262,14 +5303,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override - public void registerDexModule(String packageName, String dexModulePath, boolean isSharedModule, + public void registerDexModule(String packageName, String dexModulePath, + boolean isSharedModule, IDexModuleRegisterCallback callback) { int userId = UserHandle.getCallingUserId(); - ApplicationInfo ai = getApplicationInfo(packageName, /*flags*/ 0, userId); + ApplicationInfo ai = snapshot().getApplicationInfo(packageName, /*flags*/ 0, userId); DexManager.RegisterDexModuleResult result; if (ai == null) { - Slog.w(PackageManagerService.TAG, "Registering a dex module for a package that does not exist for the" + - " calling user. package=" + packageName + ", user=" + userId); + Slog.w(PackageManagerService.TAG, + "Registering a dex module for a package that does not exist for the" + + " calling user. package=" + packageName + ", user=" + userId); result = new DexManager.RegisterDexModuleResult(false, "Package not installed"); } else { result = mDexManager.registerDexModule(ai, dexModulePath, isSharedModule, userId); @@ -6278,9 +5321,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (callback != null) { mHandler.post(() -> { try { - callback.onDexModuleRegistered(dexModulePath, result.success, result.message); + callback.onDexModuleRegistered(dexModulePath, result.success, + result.message); } catch (RemoteException e) { - Slog.w(PackageManagerService.TAG, "Failed to callback after module registration " + dexModulePath, e); + Slog.w(PackageManagerService.TAG, + "Failed to callback after module registration " + dexModulePath, e); } }); } @@ -6293,52 +5338,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService mMoveCallbacks.register(callback); } - // NOTE: Can't remove due to unsupported app usage - @Override - public void removePermission(String permName) { - // Because this is accessed via the package manager service AIDL, - // go through the permission manager service AIDL - mContext.getSystemService(PermissionManager.class).removePermission(permName); - } - - @Override - public void replacePreferredActivity(IntentFilter filter, int match, - ComponentName[] set, ComponentName activity, int userId) { - mPreferredActivityHelper.replacePreferredActivity(new WatchedIntentFilter(filter), - match, set, activity, userId); - } - - @Override - public void resetApplicationPreferences(int userId) { - mPreferredActivityHelper.resetApplicationPreferences(userId); - } - - @Override - public ProviderInfo resolveContentProvider(String name, - @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - return mComputer.resolveContentProvider(name, flags, userId, Binder.getCallingUid()); - } - - @Override - public ResolveInfo resolveIntent(Intent intent, String resolvedType, - @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - return mResolveIntentHelper.resolveIntentInternal(snapshotComputer(), intent, resolvedType, - flags, 0 /*privateResolveFlags*/, userId, false, Binder.getCallingUid()); - } - - @Override - public ResolveInfo resolveService(Intent intent, String resolvedType, - @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - final int callingUid = Binder.getCallingUid(); - return mResolveIntentHelper.resolveServiceInternal(snapshotComputer(), intent, resolvedType, - flags, userId, callingUid); - } - - @Override - public void restoreDefaultApps(byte[] backup, int userId) { - mPreferredActivityHelper.restoreDefaultApps(backup, userId); - } - @Override public void restoreDomainVerification(byte[] backup, int userId) { if (Binder.getCallingUid() != Process.SYSTEM_UID) { @@ -6365,11 +5364,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService updateComponentLabelIcon(componentName, null, null, userId); } - @Override - public void restorePreferredActivities(byte[] backup, int userId) { - mPreferredActivityHelper.restorePreferredActivities(backup, userId); - } - @Override public void sendDeviceCustomizationReadyBroadcast() { mContext.enforceCallingPermission(Manifest.permission.SEND_DEVICE_CUSTOMIZATION_READY, @@ -6386,16 +5380,17 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public void setApplicationCategoryHint(String packageName, int categoryHint, String callerPackageName) { - if (getInstantAppPackageName(Binder.getCallingUid()) != null) { - throw new SecurityException("Instant applications don't have access to this method"); - } - mInjector.getSystemService(AppOpsManager.class).checkPackage(Binder.getCallingUid(), - callerPackageName); - final PackageStateMutator.InitialState initialState = recordInitialState(); final FunctionalUtils.ThrowingFunction implementation = computer -> { + if (computer.getInstantAppPackageName(Binder.getCallingUid()) != null) { + throw new SecurityException( + "Instant applications don't have access to this method"); + } + mInjector.getSystemService(AppOpsManager.class) + .checkPackage(Binder.getCallingUid(), callerPackageName); + PackageStateInternal packageState = computer.getPackageStateFiltered(packageName, Binder.getCallingUid(), UserHandle.getCallingUserId()); if (packageState == null) { @@ -6447,7 +5442,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService int userId) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USERS, null); final int callingUid = Binder.getCallingUid(); - enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, + final Computer snapshot = snapshotComputer(); + snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, true /* checkShell */, "setApplicationHiddenSetting for user " + userId); if (hidden && isPackageDeviceAdmin(packageName, userId)) { @@ -6464,7 +5460,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService final long callingId = Binder.clearCallingIdentity(); try { final PackageStateInternal packageState = - mComputer.getPackageStateFiltered(packageName, callingUid, userId); + snapshot.getPackageStateFiltered(packageName, callingUid, userId); if (packageState == null) { return false; } @@ -6505,13 +5501,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService commitPackageStateMutation(null, packageName, packageState1 -> packageState1.userState(userId).setHidden(hidden)); - final PackageStateInternal newPackageState = getPackageStateInternal(packageName); + final Computer newSnapshot = snapshotComputer(); + final PackageStateInternal newPackageState = + newSnapshot.getPackageStateInternal(packageName); if (hidden) { killApplication(packageName, newPackageState.getAppId(), userId, "hiding pkg"); sendApplicationHiddenForUser(packageName, newPackageState, userId); } else { - sendPackageAddedForUser(packageName, newPackageState, userId, DataLoaderType.NONE); + sendPackageAddedForUser(newSnapshot, packageName, newPackageState, userId, + DataLoaderType.NONE); } scheduleWritePackageRestrictions(userId); @@ -6526,7 +5525,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService int userId) { mContext.enforceCallingOrSelfPermission( Manifest.permission.DELETE_PACKAGES, null); - PackageStateInternal packageState = getPackageStateInternal(packageName); + final Computer snapshot = snapshotComputer(); + PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); if (packageState != null && packageState.getPkg() != null) { AndroidPackage pkg = packageState.getPkg(); // Cannot block uninstall SDK libs as they are controlled by SDK manager. @@ -6584,8 +5584,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService + userId); } Objects.requireNonNull(packageNames, "packageNames cannot be null"); + final Computer snapshot = snapshotComputer(); if (restrictionFlags != 0 - && !mSuspendPackageHelper.isSuspendAllowedForUser(userId, callingUid)) { + && !mSuspendPackageHelper.isSuspendAllowedForUser(snapshot, userId, + callingUid)) { Slog.w(PackageManagerService.TAG, "Cannot restrict packages due to restrictions on user " + userId); return packageNames; } @@ -6595,16 +5597,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService final List unactionedPackages = new ArrayList<>(packageNames.length); ArraySet changesToCommit = new ArraySet<>(); - Computer computer = snapshotComputer(); final boolean[] canRestrict = (restrictionFlags != 0) - ? mSuspendPackageHelper.canSuspendPackageForUser(computer, packageNames, userId, + ? mSuspendPackageHelper.canSuspendPackageForUser(snapshot, packageNames, userId, callingUid) : null; for (int i = 0; i < packageNames.length; i++) { final String packageName = packageNames[i]; final PackageStateInternal packageState = - computer.getPackageStateInternal(packageName); + snapshot.getPackageStateInternal(packageName); if (packageState == null - || computer.shouldFilterApplication(packageState, callingUid, userId)) { + || snapshot.shouldFilterApplication(packageState, callingUid, userId)) { Slog.w(PackageManagerService.TAG, "Could not find package setting for package: " + packageName + ". Skipping..."); unactionedPackages.add(packageName); @@ -6648,11 +5649,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService final int callingUid = Binder.getCallingUid(); final int callingAppId = UserHandle.getAppId(callingUid); - enforceCrossUserPermission(callingUid, userId, true /*requireFullPermission*/, + final Computer snapshot = snapshotComputer(); + snapshot.enforceCrossUserPermission(callingUid, userId, true /*requireFullPermission*/, true /*checkShell*/, "setHarmfulAppInfo"); if (callingAppId != Process.SYSTEM_UID && callingAppId != Process.ROOT_UID && - checkUidPermission(SET_HARMFUL_APP_WARNINGS, callingUid) != PERMISSION_GRANTED) { + snapshot.checkUidPermission(SET_HARMFUL_APP_WARNINGS, callingUid) + != PERMISSION_GRANTED) { throw new SecurityException("Caller must have the " + SET_HARMFUL_APP_WARNINGS + " permission."); } @@ -6666,11 +5669,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService scheduleWritePackageRestrictions(userId); } - @Override - public void setHomeActivity(ComponentName comp, int userId) { - mPreferredActivityHelper.setHomeActivity(comp, userId); - } - @Override public boolean setInstallLocation(int loc) { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS, @@ -6693,24 +5691,24 @@ public class PackageManagerService implements PackageSender, TestUtilityService final int callingUid = Binder.getCallingUid(); final int callingUserId = UserHandle.getUserId(callingUid); final FunctionalUtils.ThrowingCheckedFunction - implementation = computer -> { - if (computer.getInstantAppPackageName(callingUid) != null) { + implementation = snapshot -> { + if (snapshot.getInstantAppPackageName(callingUid) != null) { return false; } PackageStateInternal targetPackageState = - computer.getPackageStateInternal(targetPackage); + snapshot.getPackageStateInternal(targetPackage); if (targetPackageState == null - || computer.shouldFilterApplication(targetPackageState, callingUid, + || snapshot.shouldFilterApplication(targetPackageState, callingUid, callingUserId)) { throw new IllegalArgumentException("Unknown target package: " + targetPackage); } PackageStateInternal installerPackageState = null; if (installerPackageName != null) { - installerPackageState = computer.getPackageStateInternal(installerPackageName); + installerPackageState = snapshot.getPackageStateInternal(installerPackageName); if (installerPackageState == null - || shouldFilterApplication( + || snapshot.shouldFilterApplication( installerPackageState, callingUid, callingUserId)) { throw new IllegalArgumentException("Unknown installer package: " + installerPackageName); @@ -6720,7 +5718,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService Signature[] callerSignature; final int appId = UserHandle.getAppId(callingUid); Pair either = - computer.getPackageOrSharedUser(appId); + snapshot.getPackageOrSharedUser(appId); if (either != null) { if (either.first != null) { callerSignature = either.first.getSigningDetails().getSignatures(); @@ -6748,7 +5746,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService String targetInstallerPackageName = targetPackageState.getInstallSource().installerPackageName; PackageStateInternal targetInstallerPkgSetting = targetInstallerPackageName == null - ? null : computer.getPackageStateInternal(targetInstallerPackageName); + ? null : snapshot.getPackageStateInternal(targetInstallerPackageName); if (targetInstallerPkgSetting != null) { if (compareSignatures(callerSignature, @@ -6804,7 +5802,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } } - targetPackageState = getPackageStateInternal(targetPackage); + targetPackageState = snapshotComputer().getPackageStateInternal(targetPackage); mSettings.addInstallerPackageNames(targetPackageState.getInstallSource()); } mAppsFilter.addPackage(targetPackageState); @@ -6818,14 +5816,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService return true; } - enforceCrossUserPermission(Binder.getCallingUid(), userId, + final Computer snapshot = snapshotComputer(); + snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId, true /* requireFullPermission */, true /* checkShell */, "setInstantAppCookie"); - if (!isCallerSameApp(packageName, Binder.getCallingUid())) { + if (!snapshot.isCallerSameApp(packageName, Binder.getCallingUid())) { return false; } - PackageStateInternal packageState = getPackageStateInternal(packageName); + PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); if (packageState == null || packageState.getPkg() == null) { return false; } @@ -6840,21 +5839,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService "setKeepUninstalledPackages requires KEEP_UNINSTALLED_PACKAGES permission"); Objects.requireNonNull(packageList); - setKeepUninstalledPackagesInternal(packageList); - } - - @Override - public void setLastChosenActivity(Intent intent, String resolvedType, int flags, - IntentFilter filter, int match, ComponentName activity) { - mPreferredActivityHelper.setLastChosenActivity(intent, resolvedType, flags, - new WatchedIntentFilter(filter), match, activity); + setKeepUninstalledPackagesInternal(snapshot(), packageList); } @Override public void setMimeGroup(String packageName, String mimeGroup, List mimeTypes) { - enforceOwnerRights(packageName, Binder.getCallingUid()); + final Computer snapshot = snapshotComputer(); + enforceOwnerRights(snapshot, packageName, Binder.getCallingUid()); mimeTypes = CollectionUtils.emptyIfNull(mimeTypes); - final PackageStateInternal packageState = getPackageStateInternal(packageName); + final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); Set existingMimeTypes = packageState.getMimeGroups().get(mimeGroup); if (existingMimeTypes == null) { throw new IllegalArgumentException("Unknown MIME group " + mimeGroup @@ -6889,11 +5882,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService PersistableBundle appExtras, PersistableBundle launcherExtras, SuspendDialogInfo dialogInfo, String callingPackage, int userId) { final int callingUid = Binder.getCallingUid(); - enforceCanSetPackagesSuspendedAsUser(callingPackage, callingUid, userId, + final Computer snapshot = snapshotComputer(); + enforceCanSetPackagesSuspendedAsUser(snapshot, callingPackage, callingUid, userId, "setPackagesSuspendedAsUser"); - return mSuspendPackageHelper.setPackagesSuspended(snapshotComputer(), packageNames, - suspended, appExtras, launcherExtras, dialogInfo, callingPackage, userId, - callingUid); + return mSuspendPackageHelper.setPackagesSuspended(snapshot, packageNames, suspended, + appExtras, launcherExtras, dialogInfo, callingPackage, userId, callingUid); } @Override @@ -6924,12 +5917,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService public void setSplashScreenTheme(@NonNull String packageName, @Nullable String themeId, int userId) { final int callingUid = Binder.getCallingUid(); - enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */, + final Computer snapshot = snapshotComputer(); + snapshot.enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */, false /* checkShell */, "setSplashScreenTheme"); - enforceOwnerRights(packageName, callingUid); + enforceOwnerRights(snapshot, packageName, callingUid); - PackageStateInternal packageState = getPackageStateInstalledFiltered(packageName, - callingUid, userId); + PackageStateInternal packageState = filterPackageStateForInstalledAndFiltered(snapshot, + packageName, callingUid, userId); if (packageState == null) { return; } @@ -6938,80 +5932,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService state.userState(userId).setSplashScreenTheme(themeId)); } - @Override - public void setSystemAppHiddenUntilInstalled(String packageName, boolean hidden) { - final int callingUid = Binder.getCallingUid(); - final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID - || callingUid == Process.SYSTEM_UID; - if (!calledFromSystemOrPhone) { - mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, - "setSystemAppHiddenUntilInstalled"); - } - - final PackageStateInternal stateRead = getPackageStateInternal(packageName); - if (stateRead == null || !stateRead.isSystem() || stateRead.getPkg() == null) { - return; - } - if (stateRead.getPkg().isCoreApp() && !calledFromSystemOrPhone) { - throw new SecurityException("Only system or phone callers can modify core apps"); - } - - commitPackageStateMutation(null, mutator -> { - mutator.forPackage(packageName) - .setHiddenUntilInstalled(hidden); - mutator.forDisabledSystemPackage(packageName) - .setHiddenUntilInstalled(hidden); - }); - } - - @Override - public boolean setSystemAppInstallState(String packageName, boolean installed, int userId) { - final int callingUid = Binder.getCallingUid(); - final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID - || callingUid == Process.SYSTEM_UID; - if (!calledFromSystemOrPhone) { - mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, - "setSystemAppHiddenUntilInstalled"); - } - - final PackageStateInternal packageState = getPackageStateInternal(packageName); - // The target app should always be in system - if (packageState == null || !packageState.isSystem() || packageState.getPkg() == null) { - return false; - } - if (packageState.getPkg().isCoreApp() && !calledFromSystemOrPhone) { - throw new SecurityException("Only system or phone callers can modify core apps"); - } - // Check if the install state is the same - if (packageState.getUserStateOrDefault(userId).isInstalled() == installed) { - return false; - } - - final long callingId = Binder.clearCallingIdentity(); - try { - if (installed) { - // install the app from uninstalled state - installExistingPackageAsUser( - packageName, - userId, - PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS, - PackageManager.INSTALL_REASON_DEVICE_SETUP, - null); - return true; - } - - // uninstall the app from installed state - deletePackageVersioned( - new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST), - new PackageManager.LegacyPackageDeleteObserver(null).getBinder(), - userId, - PackageManager.DELETE_SYSTEM_APP); - return true; - } finally { - Binder.restoreCallingIdentity(callingId); - } - } - @Override public void setUpdateAvailable(String packageName, boolean updateAvailable) { mContext.enforceCallingOrSelfPermission(Manifest.permission.INSTALL_PACKAGES, null); @@ -7026,19 +5946,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService mMoveCallbacks.unregister(callback); } - @Deprecated - @Override - public boolean updateIntentVerificationStatus(String packageName, int status, int userId) { - return mDomainVerificationManager.setLegacyUserState(packageName, userId, status); - } - - @Deprecated - @Override - public void verifyIntentFilter(int id, int verificationCode, List failedDomains) { - DomainVerificationProxyV1.queueLegacyVerifyResult(mContext, mDomainVerificationConnection, - id, verificationCode, failedDomains, Binder.getCallingUid()); - } - @Override public void verifyPendingInstall(int id, int verificationCode) throws RemoteException { mContext.enforceCallingOrSelfPermission( @@ -7059,9 +5966,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Checksum.TypeMask int optional, @Checksum.TypeMask int required, @Nullable List trustedInstallers, @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId) { - requestChecksumsInternal(packageName, includeSplits, optional, required, trustedInstallers, - onChecksumsReadyListener, userId, mInjector.getBackgroundExecutor(), - mInjector.getBackgroundHandler()); + requestChecksumsInternal(snapshotComputer(), packageName, includeSplits, optional, + required, trustedInstallers, onChecksumsReadyListener, userId, + mInjector.getBackgroundExecutor(), mInjector.getBackgroundHandler()); } @Override @@ -7073,12 +5980,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Override - public boolean canPackageQuery(@NonNull String sourcePackageName, - @NonNull String targetPackageName, @UserIdInt int userId) { - return mComputer.canPackageQuery(sourcePackageName, targetPackageName, userId); - } - @Override public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { @@ -7097,8 +5998,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, String[] args, ShellCallback callback, ResultReceiver resultReceiver) { - (new PackageManagerShellCommand(mIPackageManager, - mContext,mDomainVerificationManager.getShell())) + (new PackageManagerShellCommand(this, mContext, + mDomainVerificationManager.getShell())) .exec(this, in, out, err, args, callback, resultReceiver); } @@ -7113,17 +6014,81 @@ public class PackageManagerService implements PackageSender, TestUtilityService private class PackageManagerLocalImpl implements PackageManagerLocal { } - private class PackageManagerInternalImpl extends PackageManagerInternal { + private class PackageManagerInternalImpl extends PackageManagerInternalBase { + + public PackageManagerInternalImpl() { + super(PackageManagerService.this); + } + + @NonNull @Override - public List getInstalledApplications( - @PackageManager.ApplicationInfoFlagsBits long flags, int userId, int callingUid) { - return PackageManagerService.this.mComputer.getInstalledApplications(flags, userId, - callingUid); + protected Context getContext() { + return mContext; + } + + @NonNull + @Override + protected PermissionManagerServiceInternal getPermissionManager() { + return mPermissionManager; + } + + @NonNull + @Override + protected AppDataHelper getAppDataHelper() { + return mAppDataHelper; + } + + @NonNull + @Override + protected PackageObserverHelper getPackageObserverHelper() { + return mPackageObserverHelper; + } + + @NonNull + @Override + protected ResolveIntentHelper getResolveIntentHelper() { + return mResolveIntentHelper; + } + + @NonNull + @Override + protected SuspendPackageHelper getSuspendPackageHelper() { + return mSuspendPackageHelper; + } + + @NonNull + @Override + protected ProtectedPackages getProtectedPackages() { + return mProtectedPackages; + } + + @NonNull + @Override + protected UserNeedsBadgingCache getUserNeedsBadging() { + return mUserNeedsBadging; + } + + @NonNull + @Override + protected InstantAppRegistry getInstantAppRegistry() { + return mInstantAppRegistry; + } + + @NonNull + @Override + protected ApexManager getApexManager() { + return mApexManager; + } + + @NonNull + @Override + protected DexManager getDexManager() { + return mDexManager; } @Override public boolean isPlatformSigned(String packageName) { - PackageStateInternal packageState = getPackageStateInternal(packageName); + PackageStateInternal packageState = snapshot().getPackageStateInternal(packageName); if (packageState == null) { return false; } @@ -7135,7 +6100,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public boolean isDataRestoreSafe(byte[] restoringFromSigHash, String packageName) { - SigningDetails sd = getSigningDetails(packageName); + final Computer snapshot = snapshot(); + SigningDetails sd = snapshot.getSigningDetails(packageName); if (sd == null) { return false; } @@ -7145,7 +6111,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public boolean isDataRestoreSafe(Signature restoringFromSig, String packageName) { - SigningDetails sd = getSigningDetails(packageName); + final Computer snapshot = snapshot(); + SigningDetails sd = snapshot.getSigningDetails(packageName); if (sd == null) { return false; } @@ -7156,100 +6123,17 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public boolean hasSignatureCapability(int serverUid, int clientUid, @SigningDetails.CertCapabilities int capability) { - SigningDetails serverSigningDetails = getSigningDetails(serverUid); - SigningDetails clientSigningDetails = getSigningDetails(clientUid); + final Computer snapshot = snapshot(); + SigningDetails serverSigningDetails = snapshot.getSigningDetails(serverUid); + SigningDetails clientSigningDetails = snapshot.getSigningDetails(clientUid); return serverSigningDetails.checkCapability(clientSigningDetails, capability) || clientSigningDetails.hasAncestorOrSelf(serverSigningDetails); - - } - - private SigningDetails getSigningDetails(@NonNull String packageName) { - return PackageManagerService.this.getSigningDetails(packageName); - } - - private SigningDetails getSigningDetails(int uid) { - return PackageManagerService.this.getSigningDetails(uid); - } - - @Override - public boolean isInstantApp(String packageName, int userId) { - return PackageManagerService.this.mIPackageManager.isInstantApp(packageName, userId); - } - - @Override - public String getInstantAppPackageName(int uid) { - return PackageManagerService.this.getInstantAppPackageName(uid); - } - - @Override - public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) { - return PackageManagerService.this.filterAppAccess(pkg, callingUid, userId); - } - - @Override - public boolean filterAppAccess(String packageName, int callingUid, int userId) { - return PackageManagerService.this.filterAppAccess(packageName, callingUid, userId); - } - - @Override - public boolean filterAppAccess(int uid, int callingUid) { - return PackageManagerService.this.filterAppAccess(uid, callingUid); - } - - @Nullable - @Override - public int[] getVisibilityAllowList(@NonNull String packageName, int userId) { - return PackageManagerService.this.getVisibilityAllowList(packageName, userId); - } - - @Override - public boolean canQueryPackage(int callingUid, @Nullable String packageName) { - return PackageManagerService.this.canQueryPackage(callingUid, packageName); - } - - @Override - public AndroidPackage getPackage(String packageName) { - return PackageManagerService.this.getPackage(packageName); - } - - @Nullable - @Override - public AndroidPackageApi getAndroidPackage(@NonNull String packageName) { - return PackageManagerService.this.getPackage(packageName); - } - - @Override - public AndroidPackage getPackage(int uid) { - return PackageManagerService.this.getPackage(uid); - } - - @Override - public List getPackagesForAppId(int appId) { - return mComputer.getPackagesForAppId(appId); - } - - @Nullable - @Override - public PackageStateInternal getPackageStateInternal(String packageName) { - return PackageManagerService.this.getPackageStateInternal(packageName); - } - - @Nullable - @Override - public PackageState getPackageState(@NonNull String packageName) { - return PackageManagerService.this.getPackageState(packageName); - } - - @NonNull - @Override - public ArrayMap getPackageStates() { - return PackageManagerService.this.getPackageStates(); } @Override public PackageList getPackageList(@Nullable PackageListObserver observer) { final ArrayList list = new ArrayList<>(); - forEachPackageState(packageState -> { + PackageManagerService.this.forEachPackageState(snapshot(), packageState -> { AndroidPackage pkg = packageState.getPkg(); if (pkg != null) { list.add(pkg.getPackageName()); @@ -7262,72 +6146,26 @@ public class PackageManagerService implements PackageSender, TestUtilityService return packageList; } - @Override - public void removePackageListObserver(PackageListObserver observer) { - mPackageObserverHelper.removeObserver(observer); - } - - @Override - public PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) { - return snapshotComputer().getDisabledSystemPackage(packageName); - } - @Override public @Nullable String getDisabledSystemPackageName(@NonNull String packageName) { - PackageStateInternal disabledPkgSetting = getDisabledSystemPackage( + PackageStateInternal disabledPkgSetting = snapshot().getDisabledSystemPackage( packageName); AndroidPackage disabledPkg = disabledPkgSetting == null ? null : disabledPkgSetting.getPkg(); return disabledPkg == null ? null : disabledPkg.getPackageName(); } - @Override - public @NonNull String[] getKnownPackageNames(int knownPackage, int userId) { - return PackageManagerService.this.getKnownPackageNamesInternal(knownPackage, userId); - } - - @Override - public boolean isSameApp(@Nullable String packageName, int callingUid, int userId) { - if (packageName == null) { - return false; - } - - if (Process.isSdkSandboxUid(callingUid)) { - return packageName.equals(getSdkSandboxPackageName()); - } - int uid = getPackageUid(packageName, 0, userId); - return UserHandle.isSameApp(uid, callingUid); - } - @Override public boolean isResolveActivityComponent(ComponentInfo component) { return mResolveActivity.packageName.equals(component.packageName) && mResolveActivity.name.equals(component.name); } - @Override - public void setKeepUninstalledPackages(final List packageList) { - PackageManagerService.this.setKeepUninstalledPackagesInternal(packageList); - } - - @Override - public boolean isPermissionsReviewRequired(String packageName, int userId) { - return mPermissionManager.isPermissionsReviewRequired(packageName, userId); - } - - @Override - public PackageInfo getPackageInfo( - String packageName, @PackageManager.PackageInfoFlagsBits long flags, - int filterCallingUid, int userId) { - return PackageManagerService.this.mComputer - .getPackageInfoInternal(packageName, PackageManager.VERSION_CODE_HIGHEST, - flags, filterCallingUid, userId); - } - @Override public long getCeDataInode(String packageName, int userId) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); + final PackageStateInternal packageState = + snapshot().getPackageStateInternal(packageName); if (packageState == null) { return 0; } else { @@ -7335,18 +6173,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Override - public Bundle getSuspendedPackageLauncherExtras(String packageName, int userId) { - return mSuspendPackageHelper.getSuspendedPackageLauncherExtras( - packageName, userId, Binder.getCallingUid()); - } - - @Override - public boolean isPackageSuspended(String packageName, int userId) { - return mSuspendPackageHelper.isPackageSuspended( - packageName, userId, Binder.getCallingUid()); - } - @Override public void removeAllNonSystemPackageSuspensions(int userId) { final Computer computer = snapshotComputer(); @@ -7356,14 +6182,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService userId); } - @Override - public void removeNonSystemPackageSuspensions(String packageName, int userId) { - mSuspendPackageHelper.removeSuspensionsBySuspendingPackage(snapshotComputer(), - new String[]{packageName}, - (suspendingPackage) -> !PLATFORM_PACKAGE_NAME.equals(suspendingPackage), - userId); - } - @Override public void flushPackageRestrictions(int userId) { synchronized (mLock) { @@ -7371,103 +6189,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Override - public void removeDistractingPackageRestrictions(String packageName, int userId) { - PackageManagerService.this.removeDistractingPackageRestrictions( - new String[]{packageName}, userId); - } - - @Override - public void removeAllDistractingPackageRestrictions(int userId) { - PackageManagerService.this.removeAllDistractingPackageRestrictions(userId); - } - - @Override - public String getSuspendingPackage(String suspendedPackage, int userId) { - return mSuspendPackageHelper.getSuspendingPackage( - suspendedPackage, userId, Binder.getCallingUid()); - } - - @Override - public SuspendDialogInfo getSuspendedDialogInfo(String suspendedPackage, - String suspendingPackage, int userId) { - return mSuspendPackageHelper.getSuspendedDialogInfo( - suspendedPackage, suspendingPackage, userId, Binder.getCallingUid()); - } - - @Override - public int getDistractingPackageRestrictions(String packageName, int userId) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); - return (packageState == null) ? RESTRICTION_NONE - : packageState.getUserStateOrDefault(userId).getDistractionFlags(); - } - - @Override - public int getPackageUid(String packageName, - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - return PackageManagerService.this - .getPackageUidInternal(packageName, flags, userId, Process.SYSTEM_UID); - } - - @Override - public ApplicationInfo getApplicationInfo( - String packageName, @PackageManager.ApplicationInfoFlagsBits long flags, - int filterCallingUid, int userId) { - return PackageManagerService.this - .getApplicationInfoInternal(packageName, flags, filterCallingUid, userId); - } - - @Override - public ActivityInfo getActivityInfo( - ComponentName component, @PackageManager.ComponentInfoFlagsBits long flags, - int filterCallingUid, int userId) { - return PackageManagerService.this - .getActivityInfoInternal(component, flags, filterCallingUid, userId); - } - - @Override - public List queryIntentActivities( - Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, - int filterCallingUid, int userId) { - return snapshotComputer().queryIntentActivitiesInternal(intent, resolvedType, flags, - userId); - } - - @Override - public List queryIntentReceivers(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, - int filterCallingUid, int userId) { - return PackageManagerService.this.mResolveIntentHelper.queryIntentReceiversInternal( - snapshotComputer(), intent, resolvedType, flags, userId, filterCallingUid); - } - - @Override - public List queryIntentServices( - Intent intent, @PackageManager.ResolveInfoFlagsBits long flags, int callingUid, - int userId) { - final String resolvedType = intent.resolveTypeIfNeeded(mContext.getContentResolver()); - return PackageManagerService.this - .queryIntentServicesInternal(intent, resolvedType, flags, userId, callingUid, - false); - } - - @Override - public ComponentName getHomeActivitiesAsUser(List allHomeCandidates, - int userId) { - return PackageManagerService.this.getHomeActivitiesAsUser(allHomeCandidates, userId); - } - - @Override - public ComponentName getDefaultHomeActivity(int userId) { - return PackageManagerService.this.getDefaultHomeActivity(userId); - } - - @Override - public ComponentName getSystemUiServiceComponent() { - return ComponentName.unflattenFromString(mContext.getResources().getString( - com.android.internal.R.string.config_systemUIServiceComponent)); - } - @Override public void setDeviceAndProfileOwnerPackages( int deviceOwnerUserId, String deviceOwnerPackage, @@ -7486,118 +6207,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Override - public void setDeviceOwnerProtectedPackages( - String deviceOwnerPackageName, List packageNames) { - mProtectedPackages.setDeviceOwnerProtectedPackages( - deviceOwnerPackageName, packageNames); - } - - @Override - public boolean isPackageDataProtected(int userId, String packageName) { - return mProtectedPackages.isPackageDataProtected(userId, packageName); - } - - @Override - public boolean isPackageStateProtected(String packageName, int userId) { - return mProtectedPackages.isPackageStateProtected(userId, packageName); - } - - @Override - public boolean isPackageEphemeral(int userId, String packageName) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); - return packageState != null - && packageState.getUserStateOrDefault(userId).isInstantApp(); - } - - @Override - public boolean wasPackageEverLaunched(String packageName, int userId) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); - if (packageState == null) { - throw new IllegalArgumentException("Unknown package: " + packageName); - } - return !packageState.getUserStateOrDefault(userId).isNotLaunched(); - } - - @Override - public boolean isEnabledAndMatches(ParsedMainComponent component, long flags, int userId) { - return PackageStateUtils.isEnabledAndMatches( - getPackageStateInternal(component.getPackageName()), component, flags, userId); - } - - @Override - public boolean userNeedsBadging(int userId) { - synchronized (mLock) { - return PackageManagerService.this.userNeedsBadging(userId); - } - } - - @Override - public String getNameForUid(int uid) { - return mIPackageManager.getNameForUid(uid); - } - - @Override - public void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj, - Intent origIntent, String resolvedType, String callingPackage, - @Nullable String callingFeatureId, boolean isRequesterInstantApp, - Bundle verificationBundle, int userId) { - PackageManagerService.this.requestInstantAppResolutionPhaseTwo(responseObj, origIntent, - resolvedType, callingPackage, callingFeatureId, isRequesterInstantApp, - verificationBundle, userId); - } - - @Override - public void grantImplicitAccess(int userId, Intent intent, - int recipientAppId, int visibleUid, boolean direct) { - grantImplicitAccess(userId, intent, recipientAppId, visibleUid, direct, - false /* retainOnUpdate */); - } - - @Override - public void grantImplicitAccess(int userId, Intent intent, - int recipientAppId, int visibleUid, boolean direct, boolean retainOnUpdate) { - Computer computer = snapshotComputer(); - final AndroidPackage visiblePackage = computer.getPackage(visibleUid); - final int recipientUid = UserHandle.getUid(userId, recipientAppId); - if (visiblePackage == null || computer.getPackage(recipientUid) == null) { - return; - } - - final boolean instantApp = computer.isInstantAppInternal( - visiblePackage.getPackageName(), userId, visibleUid); - final boolean accessGranted; - if (instantApp) { - if (!direct) { - // if the interaction that lead to this granting access to an instant app - // was indirect (i.e.: URI permission grant), do not actually execute the - // grant. - return; - } - accessGranted = mInstantAppRegistry.grantInstantAccess(userId, intent, - recipientAppId, UserHandle.getAppId(visibleUid) /*instantAppId*/); - } else { - accessGranted = mAppsFilter.grantImplicitAccess(recipientUid, visibleUid, - retainOnUpdate); - } - - if (accessGranted) { - ApplicationPackageManager.invalidateGetPackagesForUidCache(); - } - } - - @Override - public boolean isInstantAppInstallerComponent(ComponentName component) { - final ActivityInfo instantAppInstallerActivity = mInstantAppInstallerActivity; - return instantAppInstallerActivity != null - && instantAppInstallerActivity.getComponentName().equals(component); - } - - @Override - public void pruneInstantApps() { - mInstantAppRegistry.pruneInstantApps(snapshotComputer()); - } - @Override public void pruneCachedApksInApex(@NonNull List apexPackages) { if (mCacheDir == null) { @@ -7606,11 +6215,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService final PackageCacher cacher = new PackageCacher(mCacheDir); synchronized (mLock) { + final Computer snapshot = snapshot(); for (int i = 0, size = apexPackages.size(); i < size; i++) { final List apkNames = mApexManager.getApksInApex(apexPackages.get(i).packageName); for (int j = 0, apksInApex = apkNames.size(); j < apksInApex; j++) { - final AndroidPackage pkg = getPackage(apkNames.get(j)); + final AndroidPackage pkg = snapshot.getPackage(apkNames.get(j)); cacher.cleanCachedResult(new File(pkg.getPath())); } } @@ -7618,10 +6228,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override - public String getSetupWizardPackageName() { - return mSetupWizardPackage; - } - public void setExternalSourcesPolicy(ExternalSourcesPolicy policy) { if (policy != null) { mExternalSourcesPolicy = policy; @@ -7630,7 +6236,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public boolean isPackagePersistent(String packageName) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); + final PackageStateInternal packageState = + snapshot().getPackageStateInternal(packageName); if (packageState == null) { return false; } @@ -7641,16 +6248,20 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public List getOverlayPackages(int userId) { + final Computer snapshot = snapshotComputer(); final ArrayList overlayPackages = new ArrayList<>(); - forEachPackageState(packageState -> { + final ArrayMap packageStates = + snapshot.getPackageStates(); + for (int index = 0; index < packageStates.size(); index++) { + final PackageStateInternal packageState = packageStates.valueAt(index); final AndroidPackage pkg = packageState.getPkg(); if (pkg != null && pkg.getOverlayTarget() != null) { - PackageInfo pkgInfo = generatePackageInfo(packageState, 0, userId); + PackageInfo pkgInfo = snapshot.generatePackageInfo(packageState, 0, userId); if (pkgInfo != null) { overlayPackages.add(pkgInfo); } } - }); + } return overlayPackages; } @@ -7658,7 +6269,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public List getTargetPackageNames(int userId) { List targetPackages = new ArrayList<>(); - forEachPackageState(packageState -> { + PackageManagerService.this.forEachPackageState(snapshot(), packageState -> { final AndroidPackage pkg = packageState.getPkg(); if (pkg != null && !pkg.isOverlay()) { targetPackages.add(pkg.getPackageName()); @@ -7675,30 +6286,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService overlayPaths, outUpdatedPackageNames); } - @Override - public ResolveInfo resolveIntent(Intent intent, String resolvedType, - @PackageManager.ResolveInfoFlagsBits long flags, - @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags, int userId, - boolean resolveForStart, int filterCallingUid) { - return mResolveIntentHelper.resolveIntentInternal(snapshotComputer(), - intent, resolvedType, flags, privateResolveFlags, userId, resolveForStart, - filterCallingUid); - } - - @Override - public ResolveInfo resolveService(Intent intent, String resolvedType, - @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) { - return mResolveIntentHelper.resolveServiceInternal(snapshotComputer(), intent, - resolvedType, flags, userId, callingUid); - } - - @Override - public ProviderInfo resolveContentProvider(String name, - @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) { - return PackageManagerService.this.mComputer - .resolveContentProvider(name, flags, userId,callingUid); - } - @Override public void addIsolatedUid(int isolatedUid, int ownerUid) { synchronized (mLock) { @@ -7713,36 +6300,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Override - public int getUidTargetSdkVersion(int uid) { - return PackageManagerService.this.getUidTargetSdkVersion(uid); - } - - @Override - public int getPackageTargetSdkVersion(String packageName) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); - if (packageState != null && packageState.getPkg() != null) { - return packageState.getPkg().getTargetSdkVersion(); - } - return Build.VERSION_CODES.CUR_DEVELOPMENT; - } - - @Override - public boolean canAccessInstantApps(int callingUid, int userId) { - return PackageManagerService.this.canViewInstantApps(callingUid, userId); - } - - @Override - public boolean canAccessComponent(int callingUid, @NonNull ComponentName component, - @UserIdInt int userId) { - return mComputer.canAccessComponent(callingUid, component, userId); - } - - @Override - public boolean hasInstantApplicationMetadata(String packageName, int userId) { - return mInstantAppRegistry.hasInstantApplicationMetadata(packageName, userId); - } - @Override public void notifyPackageUse(String packageName, int reason) { synchronized (mLock) { @@ -7750,110 +6307,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Override - public void onPackageProcessKilledForUninstall(String packageName) { - mHandler.post(() -> PackageManagerService.this.notifyInstallObserver(packageName, - true /* killApp */)); - } - - @Override - public SparseArray getAppsWithSharedUserIds() { - return mComputer.getAppsWithSharedUserIds(); - } - - @Override - @NonNull - public String[] getSharedUserPackagesForPackage(String packageName, int userId) { - return mComputer.getSharedUserPackagesForPackage(packageName, userId); - } - - @Override - public ArrayMap getProcessesForUid(int uid) { - return mComputer.getProcessesForUid(uid); - } - - @Override - public int[] getPermissionGids(String permissionName, int userId) { - return mPermissionManager.getPermissionGids(permissionName, userId); - } - - @Override - public boolean isOnlyCoreApps() { - return mIPackageManager.isOnlyCoreApps(); - } - - @Override - public void freeStorage(String volumeUuid, long bytes, - @StorageManager.AllocateFlags int flags) throws IOException { - PackageManagerService.this.freeStorage(volumeUuid, bytes, flags); - } - - @Override - public void freeAllAppCacheAboveQuota(@NonNull String volumeUuid) throws IOException { - PackageManagerService.this.freeAllAppCacheAboveQuota(volumeUuid); - } - - @Override - public void forEachPackageSetting(Consumer actionLocked) { - PackageManagerService.this.forEachPackageSetting(actionLocked); - } - - @Override - public void forEachPackageState(Consumer action) { - PackageManagerService.this.forEachPackageState(action); - } - - @Override - public void forEachPackage(Consumer action) { - PackageManagerService.this.forEachPackage(action); - } - - @Override - public void forEachInstalledPackage(@NonNull Consumer action, - @UserIdInt int userId) { - PackageManagerService.this.forEachInstalledPackage(action, userId); - } - - @Override - public ArraySet getEnabledComponents(String packageName, int userId) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); - if (packageState == null) { - return new ArraySet<>(); - } - return packageState.getUserStateOrDefault(userId).getEnabledComponents(); - } - - @Override - public ArraySet getDisabledComponents(String packageName, int userId) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); - if (packageState == null) { - return new ArraySet<>(); - } - return packageState.getUserStateOrDefault(userId).getDisabledComponents(); - } - - @Override - public @PackageManager.EnabledState int getApplicationEnabledState( - String packageName, int userId) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); - if (packageState == null) { - return COMPONENT_ENABLED_STATE_DEFAULT; - } - return packageState.getUserStateOrDefault(userId).getEnabledState(); - } - - @Override - public @PackageManager.EnabledState int getComponentEnabledSetting( - @NonNull ComponentName componentName, int callingUid, int userId) { - return PackageManagerService.this.mComputer.getComponentEnabledSettingInternal( - componentName, callingUid, userId); - } - - @Override - public void setEnableRollbackCode(int token, int enableRollbackCode) { - PackageManagerService.this.setEnableRollbackCode(token, enableRollbackCode); - } - /** * Ask the package manager to compile layouts in the given package. */ @@ -7869,11 +6322,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mArtManagerService.compileLayouts(pkg); } - @Override - public void finishPackageInstall(int token, boolean didLaunch) { - mIPackageManager.finishPackageInstall(token, didLaunch); - } - @Nullable @Override public String removeLegacyDefaultBrowserPackageName(int userId) { @@ -7882,16 +6330,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Override - public boolean isApexPackage(String packageName) { - return PackageManagerService.this.mApexManager.isApexPackage(packageName); - } - - @Override - public List getApksInApex(String apexPackageName) { - return PackageManagerService.this.mApexManager.getApksInApex(apexPackageName); - } - @Override public void uninstallApex(String packageName, long versionCode, int userId, IntentSender intentSender, int flags) { @@ -7966,11 +6404,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Override - public boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) { - return mComputer.isCallerInstallerOfRecord(pkg, callingUid); - } - @Override public boolean isPermissionUpgradeNeeded(int userId) { return mSettings.isPermissionUpgradeNeeded(userId); @@ -7984,26 +6417,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService mHandler.sendMessage(msg); } - @Override - public List getMimeGroup(String packageName, String mimeGroup) { - return PackageManagerService.this.getMimeGroupInternal(packageName, mimeGroup); - } - @Override public void setVisibilityLogging(String packageName, boolean enable) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); + final PackageStateInternal packageState = + snapshot().getPackageStateInternal(packageName); if (packageState == null) { throw new IllegalStateException("No package found for " + packageName); } mAppsFilter.getFeatureConfig().enableLogging(packageState.getAppId(), enable); } - @Override - public boolean isSystemPackage(@NonNull String packageName) { - return packageName.equals( - PackageManagerService.this.ensureSystemPackageName(packageName)); - } - @Override public void clearBlockUninstallForUser(@UserIdInt int userId) { synchronized (mLock) { @@ -8012,22 +6435,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Override - public void unsuspendForSuspendingPackage(final String packageName, int affectedUser) { - PackageManagerService.this.unsuspendForSuspendingPackage(snapshotComputer(), - packageName, affectedUser); - } - - @Override - public boolean isSuspendingAnyPackages(String suspendingPackage, int userId) { - return PackageManagerService.this.isSuspendingAnyPackages(suspendingPackage, userId); - } - @Override public boolean registerInstalledLoadingProgressCallback(String packageName, PackageManagerInternal.InstalledLoadingProgressCallback callback, int userId) { - final PackageStateInternal ps = - getPackageStateInstalledFiltered(packageName, Binder.getCallingUid(), userId); + final Computer snapshot = snapshotComputer(); + final PackageStateInternal ps = filterPackageStateForInstalledAndFiltered(snapshot, + packageName, Binder.getCallingUid(), userId); if (ps == null) { return false; } @@ -8048,8 +6461,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public IncrementalStatesInfo getIncrementalStatesInfo( @NonNull String packageName, int filterCallingUid, int userId) { - final PackageStateInternal ps = - getPackageStateInstalledFiltered(packageName, filterCallingUid, userId); + final Computer snapshot = snapshotComputer(); + final PackageStateInternal ps = filterPackageStateForInstalledAndFiltered(snapshot, + packageName, filterCallingUid, userId); if (ps == null) { return null; } @@ -8057,74 +6471,23 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override - public void requestChecksums(@NonNull String packageName, boolean includeSplits, - @Checksum.TypeMask int optional, @Checksum.TypeMask int required, - @Nullable List trustedInstallers, - @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId, - @NonNull Executor executor, @NonNull Handler handler) { - requestChecksumsInternal(packageName, includeSplits, optional, required, - trustedInstallers, onChecksumsReadyListener, userId, executor, handler); + public boolean isSameApp(@Nullable String packageName, int callingUid, int userId) { + if (packageName == null) { + return false; + } + + if (Process.isSdkSandboxUid(callingUid)) { + return packageName.equals(mRequiredSdkSandboxPackage); + } + Computer snapshot = snapshot(); + int uid = snapshot.getPackageUid(packageName, 0, userId); + return UserHandle.isSameApp(uid, callingUid); } @Override - public boolean isPackageFrozen(@NonNull String packageName, - int callingUid, int userId) { - return PackageManagerService.this.getPackageStartability( - packageName, callingUid, userId) == PACKAGE_STARTABILITY_FROZEN; - } - - @Override - public long deleteOatArtifactsOfPackage(String packageName) { - return PackageManagerService.this.deleteOatArtifactsOfPackage(packageName); - } - - @Override - public void reconcileAppsData(int userId, @StorageManager.StorageFlags int flags, - boolean migrateAppsData) { - PackageManagerService.this.mAppDataHelper.reconcileAppsData(userId, flags, - migrateAppsData); - } - - @Override - @NonNull - public ArraySet getSharedUserPackages(int sharedUserAppId) { - return PackageManagerService.this.mComputer.getSharedUserPackages(sharedUserAppId); - } - - @Override - @Nullable - public SharedUserApi getSharedUserApi(int sharedUserAppId) { - return mComputer.getSharedUser(sharedUserAppId); - } - - @NonNull - @Override - public PackageStateMutator.InitialState recordInitialState() { - return PackageManagerService.this.recordInitialState(); - } - - @Nullable - @Override - public PackageStateMutator.Result commitPackageStateMutation( - @Nullable PackageStateMutator.InitialState state, - @NonNull Consumer consumer) { - return PackageManagerService.this.commitPackageStateMutation(state, consumer); - } - - @NonNull - @Override - public Computer snapshot() { - return snapshotComputer(); - } - - @Override - public void shutdown() { - PackageManagerService.this.shutdown(); - } - - @Override - public DynamicCodeLogger getDynamicCodeLogger() { - return PackageManagerService.this.getDexManager().getDynamicCodeLogger(); + public void onPackageProcessKilledForUninstall(String packageName) { + mHandler.post(() -> PackageManagerService.this.notifyInstallObserver(packageName, + true /* killApp */)); } } @@ -8239,24 +6602,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mSettings.getDisabledSystemPkgLPr(packageName); } - @VisibleForTesting(visibility = Visibility.PRIVATE) - @Nullable - PackageStateInternal getPackageStateInternal(String packageName) { - return mComputer.getPackageStateInternal(packageName); - } - - @Nullable - PackageStateInternal getPackageStateInternal(String packageName, int callingUid) { - return mComputer.getPackageStateInternal(packageName, callingUid); - } - - @Nullable - PackageStateInternal getPackageStateInstalledFiltered(@NonNull String packageName, - int callingUid, @UserIdInt int userId) { - return filterPackageStateForInstalledAndFiltered(mComputer, packageName, callingUid, - userId); - } - @Nullable private PackageStateInternal filterPackageStateForInstalledAndFiltered( @NonNull Computer computer, @NonNull String packageName, int callingUid, @@ -8272,22 +6617,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Nullable - private PackageState getPackageState(String packageName) { - return mComputer.getPackageStateCopied(packageName); - } - - @NonNull - ArrayMap getPackageStates() { - Computer computer = snapshotComputer(); - if (computer == mLiveComputer) { - return new ArrayMap<>(computer.getPackageStates()); - } else { - return computer.getPackageStates(); - } - } - - private void forEachPackageSetting(Consumer actionLocked) { + @Deprecated + void forEachPackageSetting(Consumer actionLocked) { synchronized (mLock) { int size = mSettings.getPackagesLocked().size(); for (int index = 0; index < size; index++) { @@ -8296,13 +6627,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - void forEachPackageState(Consumer consumer) { - forEachPackageState(mComputer.getPackageStates(), consumer); + void forEachPackageState(@NonNull Computer snapshot, Consumer consumer) { + forEachPackageState(snapshot.getPackageStates(), consumer); } - void forEachPackage(Consumer consumer) { + void forEachPackage(@NonNull Computer snapshot, Consumer consumer) { final ArrayMap packageStates = - mComputer.getPackageStates(); + snapshot.getPackageStates(); int size = packageStates.size(); for (int index = 0; index < size; index++) { PackageStateInternal packageState = packageStates.valueAt(index); @@ -8322,7 +6653,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - void forEachInstalledPackage(@NonNull Consumer action, + void forEachInstalledPackage(@NonNull Computer snapshot, @NonNull Consumer action, @UserIdInt int userId) { Consumer actionWrapped = packageState -> { if (packageState.getPkg() != null @@ -8330,7 +6661,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService action.accept(packageState.getPkg()); } }; - forEachPackageState(mComputer.getPackageStates(), actionWrapped); + forEachPackageState(snapshot.getPackageStates(), actionWrapped); } boolean isHistoricalPackageUsageAvailable() { @@ -8345,15 +6676,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mCompilerStats.getOrCreatePackageStats(pkgName); } - /** - * Returns true if the system or user is explicitly preventing an otherwise valid installer to - * complete an install. This includes checks like unknown sources and user restrictions. - */ - public boolean isInstallDisabledForPackage(String packageName, int uid, int userId) { - return mComputer.isInstallDisabledForPackage(packageName, uid, userId); - } - - private void grantImplicitAccess(@NonNull Computer snapshot, @UserIdInt int userId, + void grantImplicitAccess(@NonNull Computer snapshot, @UserIdInt int userId, Intent intent, @AppIdInt int recipientAppId, int visibleUid, boolean direct, boolean retainOnUpdate) { final AndroidPackage visiblePackage = snapshot.getPackage(visibleUid); @@ -8384,8 +6707,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - boolean canHaveOatDir(String packageName) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); + boolean canHaveOatDir(@NonNull Computer snapshot, String packageName) { + final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); if (packageState == null || packageState.getPkg() == null) { return false; } @@ -8393,8 +6716,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService packageState.getTransientState().isUpdatedSystemApp()); } - long deleteOatArtifactsOfPackage(String packageName) { - PackageStateInternal packageState = getPackageStateInternal(packageName); + long deleteOatArtifactsOfPackage(@NonNull Computer snapshot, String packageName) { + PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); if (packageState == null || packageState.getPkg() == null) { return -1; // error code of deleteOptimizedFiles } @@ -8402,13 +6725,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService ArtUtils.createArtPackageInfo(packageState.getPkg(), packageState)); } - @NonNull - Set getUnusedPackages(long downgradeTimeThresholdMillis) { - return mComputer.getUnusedPackages(downgradeTimeThresholdMillis); - } - - private List getMimeGroupInternal(String packageName, String mimeGroup) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); + List getMimeGroupInternal(@NonNull Computer snapshot, String packageName, + String mimeGroup) { + final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); if (packageState == null) { return Collections.emptyList(); } @@ -8473,16 +6792,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService * Returns the array containing per-uid timeout configuration. * This is derived from DeviceConfig flags. */ - public @NonNull PerUidReadTimeouts[] getPerUidReadTimeouts() { + public @NonNull PerUidReadTimeouts[] getPerUidReadTimeouts(@NonNull Computer snapshot) { PerUidReadTimeouts[] result = mPerUidReadTimeoutsCache; if (result == null) { - result = parsePerUidReadTimeouts(); + result = parsePerUidReadTimeouts(snapshot); mPerUidReadTimeoutsCache = result; } return result; } - private @NonNull PerUidReadTimeouts[] parsePerUidReadTimeouts() { + private @NonNull PerUidReadTimeouts[] parsePerUidReadTimeouts(@NonNull Computer snapshot) { final String defaultTimeouts = getDefaultTimeouts(); final String knownDigestersList = getKnownDigestersList(); final List perPackageReadTimeouts = @@ -8496,7 +6815,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService final List result = new ArrayList<>(perPackageReadTimeouts.size()); for (int i = 0, size = perPackageReadTimeouts.size(); i < size; ++i) { final PerPackageReadTimeouts perPackage = perPackageReadTimeouts.get(i); - final PackageStateInternal ps = getPackageStateInternal(perPackage.packageName); + final PackageStateInternal ps = + snapshot.getPackageStateInternal(perPackage.packageName); if (ps == null) { if (DEBUG_PER_UID_READ_TIMEOUTS) { Slog.i(TAG, "PerUidReadTimeouts: package not found = " @@ -8546,7 +6866,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService return result.toArray(new PerUidReadTimeouts[result.size()]); } - private void setKeepUninstalledPackagesInternal(List packageList) { + void setKeepUninstalledPackagesInternal(@NonNull Computer snapshot, List packageList) { Preconditions.checkNotNull(packageList); synchronized (mKeepUninstalledPackages) { List toRemove = new ArrayList<>(mKeepUninstalledPackages); @@ -8556,7 +6876,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService mKeepUninstalledPackages.addAll(packageList); for (int i = 0; i < toRemove.size(); i++) { - deletePackageIfUnused(toRemove.get(i)); + deletePackageIfUnused(snapshot, toRemove.get(i)); } } } @@ -8603,43 +6923,44 @@ public class PackageManagerService implements PackageSender, TestUtilityService mInstrumentation.put(name, instrumentation); } - String[] getKnownPackageNamesInternal(int knownPackage, int userId) { + String[] getKnownPackageNamesInternal(@NonNull Computer snapshot, int knownPackage, + int userId) { switch (knownPackage) { case PackageManagerInternal.PACKAGE_BROWSER: return new String[] { mDefaultAppProvider.getDefaultBrowser(userId) }; case PackageManagerInternal.PACKAGE_INSTALLER: - return mComputer.filterOnlySystemPackages(mRequiredInstallerPackage); + return snapshot.filterOnlySystemPackages(mRequiredInstallerPackage); case PackageManagerInternal.PACKAGE_UNINSTALLER: - return mComputer.filterOnlySystemPackages(mRequiredUninstallerPackage); + return snapshot.filterOnlySystemPackages(mRequiredUninstallerPackage); case PackageManagerInternal.PACKAGE_SETUP_WIZARD: - return mComputer.filterOnlySystemPackages(mSetupWizardPackage); + return snapshot.filterOnlySystemPackages(mSetupWizardPackage); case PackageManagerInternal.PACKAGE_SYSTEM: return new String[]{"android"}; case PackageManagerInternal.PACKAGE_VERIFIER: - return mComputer.filterOnlySystemPackages(mRequiredVerifierPackage); + return snapshot.filterOnlySystemPackages(mRequiredVerifierPackage); case PackageManagerInternal.PACKAGE_SYSTEM_TEXT_CLASSIFIER: - return mComputer.filterOnlySystemPackages( + return snapshot.filterOnlySystemPackages( mDefaultTextClassifierPackage, mSystemTextClassifierPackageName); case PackageManagerInternal.PACKAGE_PERMISSION_CONTROLLER: - return mComputer.filterOnlySystemPackages(mRequiredPermissionControllerPackage); + return snapshot.filterOnlySystemPackages(mRequiredPermissionControllerPackage); case PackageManagerInternal.PACKAGE_CONFIGURATOR: - return mComputer.filterOnlySystemPackages(mConfiguratorPackage); + return snapshot.filterOnlySystemPackages(mConfiguratorPackage); case PackageManagerInternal.PACKAGE_INCIDENT_REPORT_APPROVER: - return mComputer.filterOnlySystemPackages(mIncidentReportApproverPackage); + return snapshot.filterOnlySystemPackages(mIncidentReportApproverPackage); case PackageManagerInternal.PACKAGE_AMBIENT_CONTEXT_DETECTION: - return mComputer.filterOnlySystemPackages(mAmbientContextDetectionPackage); + return snapshot.filterOnlySystemPackages(mAmbientContextDetectionPackage); case PackageManagerInternal.PACKAGE_APP_PREDICTOR: - return mComputer.filterOnlySystemPackages(mAppPredictionServicePackage); + return snapshot.filterOnlySystemPackages(mAppPredictionServicePackage); case PackageManagerInternal.PACKAGE_COMPANION: - return mComputer.filterOnlySystemPackages(COMPANION_PACKAGE_NAME); + return snapshot.filterOnlySystemPackages(COMPANION_PACKAGE_NAME); case PackageManagerInternal.PACKAGE_RETAIL_DEMO: return TextUtils.isEmpty(mRetailDemoPackage) ? ArrayUtils.emptyArray(String.class) : new String[] {mRetailDemoPackage}; case PackageManagerInternal.PACKAGE_OVERLAY_CONFIG_SIGNATURE: - return mComputer.filterOnlySystemPackages(getOverlayConfigSignaturePackageName()); + return snapshot.filterOnlySystemPackages(mOverlayConfigSignaturePackage); case PackageManagerInternal.PACKAGE_RECENTS: - return mComputer.filterOnlySystemPackages(mRecentsPackage); + return snapshot.filterOnlySystemPackages(mRecentsPackage); default: return ArrayUtils.emptyArray(String.class); } @@ -8659,10 +6980,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService mDefaultAppProvider.setDefaultBrowser(packageName, async, userId); } - ResolveInfo getInstantAppInstallerInfo() { - return mInstantAppInstallerInfo; - } - PackageUsage getPackageUsage() { return mPackageUsage; } @@ -8754,10 +7071,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - ResolveInfo getResolveInfo() { - return mResolveInfo; - } - ApplicationInfo getCoreAndroidApplication() { return mAndroidApplication; } diff --git a/services/core/java/com/android/server/pm/PackageSender.java b/services/core/java/com/android/server/pm/PackageSender.java index d380098d44b3..656d5962e1a9 100644 --- a/services/core/java/com/android/server/pm/PackageSender.java +++ b/services/core/java/com/android/server/pm/PackageSender.java @@ -16,6 +16,7 @@ package com.android.server.pm; +import android.annotation.NonNull; import android.annotation.Nullable; import android.content.IIntentReceiver; import android.os.Bundle; @@ -30,9 +31,9 @@ interface PackageSender { Bundle extras, int flags, String targetPkg, IIntentReceiver finishedReceiver, int[] userIds, int[] instantUserIds, @Nullable SparseArray broadcastAllowList, @Nullable Bundle bOptions); - void sendPackageAddedForNewUsers(String packageName, boolean sendBootCompleted, - boolean includeStopped, int appId, int[] userIds, int[] instantUserIds, - int dataLoaderType); + void sendPackageAddedForNewUsers(@NonNull Computer snapshot, String packageName, + boolean sendBootCompleted, boolean includeStopped, int appId, int[] userIds, + int[] instantUserIds, int dataLoaderType); void notifyPackageAdded(String packageName, int uid); void notifyPackageChanged(String packageName, int uid); void notifyPackageRemoved(String packageName, int uid); diff --git a/services/core/java/com/android/server/pm/PreferredActivityHelper.java b/services/core/java/com/android/server/pm/PreferredActivityHelper.java index 7253ae4e7cb0..9befd6e09eb4 100644 --- a/services/core/java/com/android/server/pm/PreferredActivityHelper.java +++ b/services/core/java/com/android/server/pm/PreferredActivityHelper.java @@ -25,6 +25,7 @@ import static com.android.server.pm.PackageManagerService.DEBUG_PREFERRED; import static com.android.server.pm.PackageManagerService.TAG; import android.annotation.NonNull; +import android.annotation.UserIdInt; import android.content.ComponentName; import android.content.Intent; import android.content.IntentFilter; @@ -74,17 +75,18 @@ final class PreferredActivityHelper { mPm = pm; } - private ResolveInfo findPreferredActivityNotLocked(Intent intent, String resolvedType, - @PackageManager.ResolveInfoFlagsBits long flags, List query, - boolean always, boolean removeMatches, boolean debug, int userId) { - return findPreferredActivityNotLocked( - intent, resolvedType, flags, query, always, removeMatches, debug, userId, + private ResolveInfo findPreferredActivityNotLocked(@NonNull Computer snapshot, Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, + List query, boolean always, boolean removeMatches, boolean debug, + @UserIdInt int userId) { + return findPreferredActivityNotLocked(snapshot, intent, resolvedType, flags, query, always, + removeMatches, debug, userId, UserHandle.getAppId(Binder.getCallingUid()) >= Process.FIRST_APPLICATION_UID); } // TODO: handle preferred activities missing while user has amnesia /** must not hold {@link PackageManagerService.mLock} */ - public ResolveInfo findPreferredActivityNotLocked( + public ResolveInfo findPreferredActivityNotLocked(@NonNull Computer snapshot, Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, List query, boolean always, boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered) { @@ -95,7 +97,7 @@ final class PreferredActivityHelper { if (!mPm.mUserManager.exists(userId)) return null; PackageManagerService.FindPreferredActivityBodyResult body = - mPm.findPreferredActivityInternal( + snapshot.findPreferredActivityInternal( intent, resolvedType, flags, query, always, removeMatches, debug, userId, queryMayBeFiltered); if (body.mChanged) { @@ -117,7 +119,7 @@ final class PreferredActivityHelper { mPm.clearPackagePreferredActivitiesLPw(packageName, changedUsers, userId); } if (changedUsers.size() > 0) { - updateDefaultHomeNotLocked(changedUsers); + updateDefaultHomeNotLocked(mPm.snapshotComputer(), changedUsers); mPm.postPreferredActivityChangedBroadcast(userId); mPm.scheduleWritePackageRestrictions(userId); } @@ -128,7 +130,7 @@ final class PreferredActivityHelper { * * @return Whether the ACTION_PREFERRED_ACTIVITY_CHANGED broadcast has been scheduled. */ - public boolean updateDefaultHomeNotLocked(int userId) { + public boolean updateDefaultHomeNotLocked(@NonNull Computer snapshot, @UserIdInt int userId) { if (Thread.holdsLock(mPm.mLock)) { Slog.wtf(TAG, "Calling thread " + Thread.currentThread().getName() + " is holding mLock", new Throwable()); @@ -139,10 +141,10 @@ final class PreferredActivityHelper { // before that. return false; } - final Intent intent = mPm.getHomeIntent(); - final List resolveInfos = mPm.snapshotComputer().queryIntentActivitiesInternal( + final Intent intent = snapshot.getHomeIntent(); + final List resolveInfos = snapshot.queryIntentActivitiesInternal( intent, null, MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, userId); - final ResolveInfo preferredResolveInfo = findPreferredActivityNotLocked( + final ResolveInfo preferredResolveInfo = findPreferredActivityNotLocked(snapshot, intent, null, 0, resolveInfos, true, false, false, userId); final String packageName = preferredResolveInfo != null && preferredResolveInfo.activityInfo != null @@ -151,8 +153,7 @@ final class PreferredActivityHelper { if (TextUtils.equals(currentPackageName, packageName)) { return false; } - final String[] callingPackages = mPm.mIPackageManager - .getPackagesForUid(Binder.getCallingUid()); + final String[] callingPackages = snapshot.getPackagesForUid(Binder.getCallingUid()); if (callingPackages != null && ArrayUtils.contains(callingPackages, mPm.mRequiredPermissionControllerPackage)) { // PermissionController manages default home directly. @@ -174,23 +175,21 @@ final class PreferredActivityHelper { /** * Variant that takes a {@link WatchedIntentFilter} */ - public void addPreferredActivity(WatchedIntentFilter filter, int match, - ComponentName[] set, ComponentName activity, boolean always, int userId, + public void addPreferredActivity(@NonNull Computer snapshot, WatchedIntentFilter filter, + int match, ComponentName[] set, ComponentName activity, boolean always, int userId, String opname, boolean removeExisting) { // writer int callingUid = Binder.getCallingUid(); - mPm.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, + snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, false /* checkShell */, "add preferred activity"); if (mPm.mContext.checkCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS) != PackageManager.PERMISSION_GRANTED) { - synchronized (mPm.mLock) { - if (mPm.getUidTargetSdkVersion(callingUid) - < Build.VERSION_CODES.FROYO) { - Slog.w(TAG, "Ignoring addPreferredActivity() from uid " - + callingUid); - return; - } + if (snapshot.getUidTargetSdkVersion(callingUid) + < Build.VERSION_CODES.FROYO) { + Slog.w(TAG, "Ignoring addPreferredActivity() from uid " + + callingUid); + return; } mPm.mContext.enforceCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null); @@ -214,7 +213,8 @@ final class PreferredActivityHelper { new PreferredActivity(filter, match, set, activity, always)); mPm.scheduleWritePackageRestrictions(userId); } - if (!(isHomeFilter(filter) && updateDefaultHomeNotLocked(userId))) { + // Re-snapshot after mLock + if (!(isHomeFilter(filter) && updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId))) { mPm.postPreferredActivityChangedBroadcast(userId); } } @@ -222,8 +222,8 @@ final class PreferredActivityHelper { /** * Variant that takes a {@link WatchedIntentFilter} */ - public void replacePreferredActivity(WatchedIntentFilter filter, int match, - ComponentName[] set, ComponentName activity, int userId) { + public void replacePreferredActivity(@NonNull Computer snapshot, WatchedIntentFilter filter, + int match, ComponentName[] set, ComponentName activity, int userId) { if (filter.countActions() != 1) { throw new IllegalArgumentException( "replacePreferredActivity expects filter to have only 1 action."); @@ -238,13 +238,14 @@ final class PreferredActivityHelper { } final int callingUid = Binder.getCallingUid(); - mPm.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, + snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, false /* checkShell */, "replace preferred activity"); if (mPm.mContext.checkCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS) != PackageManager.PERMISSION_GRANTED) { synchronized (mPm.mLock) { - if (mPm.getUidTargetSdkVersion(callingUid) + // TODO: Remove lock? + if (mPm.snapshotComputer().getUidTargetSdkVersion(callingUid) < Build.VERSION_CODES.FROYO) { Slog.w(TAG, "Ignoring replacePreferredActivity() from uid " + Binder.getCallingUid()); @@ -296,21 +297,23 @@ final class PreferredActivityHelper { } } } - addPreferredActivity(filter, match, set, activity, true, userId, + + // Retake a snapshot after editing with lock held + addPreferredActivity(mPm.snapshotComputer(), filter, match, set, activity, true, userId, "Replacing preferred", false); } - public void clearPackagePreferredActivities(String packageName) { + public void clearPackagePreferredActivities(@NonNull Computer snapshot, String packageName) { final int callingUid = Binder.getCallingUid(); - if (mPm.getInstantAppPackageName(callingUid) != null) { + if (snapshot.getInstantAppPackageName(callingUid) != null) { return; } - final PackageStateInternal packageState = mPm.getPackageStateInternal(packageName); - if (packageState == null || !mPm.isCallerSameApp(packageName, callingUid)) { + final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); + if (packageState == null || !snapshot.isCallerSameApp(packageName, callingUid)) { if (mPm.mContext.checkCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS) != PackageManager.PERMISSION_GRANTED) { - if (mPm.getUidTargetSdkVersion(callingUid) + if (snapshot.getUidTargetSdkVersion(callingUid) < Build.VERSION_CODES.FROYO) { Slog.w(TAG, "Ignoring clearPackagePreferredActivities() from uid " + callingUid); @@ -320,7 +323,7 @@ final class PreferredActivityHelper { android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null); } } - if (packageState != null && mPm.shouldFilterApplication(packageState, callingUid, + if (packageState != null && snapshot.shouldFilterApplication(packageState, callingUid, UserHandle.getUserId(callingUid))) { return; } @@ -329,23 +332,23 @@ final class PreferredActivityHelper { } /** must not hold {@link #PackageManagerService.mLock} */ - void updateDefaultHomeNotLocked(SparseBooleanArray userIds) { + void updateDefaultHomeNotLocked(@NonNull Computer snapshot, SparseBooleanArray userIds) { if (Thread.holdsLock(mPm.mLock)) { Slog.wtf(TAG, "Calling thread " + Thread.currentThread().getName() + " is holding mLock", new Throwable()); } for (int i = userIds.size() - 1; i >= 0; --i) { final int userId = userIds.keyAt(i); - updateDefaultHomeNotLocked(userId); + updateDefaultHomeNotLocked(snapshot, userId); } } - public void setHomeActivity(ComponentName comp, int userId) { - if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) { + public void setHomeActivity(@NonNull Computer snapshot, ComponentName comp, int userId) { + if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { return; } ArrayList homeActivities = new ArrayList<>(); - mPm.getHomeActivitiesAsUser(homeActivities, userId); + snapshot.getHomeActivitiesAsUser(homeActivities, userId); boolean found = false; @@ -364,7 +367,7 @@ final class PreferredActivityHelper { throw new IllegalArgumentException("Component " + comp + " cannot be home on user " + userId); } - replacePreferredActivity(getHomeFilter(), IntentFilter.MATCH_CATEGORY_EMPTY, + replacePreferredActivity(snapshot, getHomeFilter(), IntentFilter.MATCH_CATEGORY_EMPTY, set, comp, userId); } @@ -401,7 +404,7 @@ final class PreferredActivityHelper { mPm.scheduleWritePackageRestrictions(userId); } if (isHomeFilter(filter)) { - updateDefaultHomeNotLocked(userId); + updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId); } mPm.postPreferredActivityChangedBroadcast(userId); } @@ -417,7 +420,7 @@ final class PreferredActivityHelper { changed = mPm.mSettings.clearPackagePersistentPreferredActivities(packageName, userId); } if (changed) { - updateDefaultHomeNotLocked(userId); + updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId); mPm.postPreferredActivityChangedBroadcast(userId); mPm.scheduleWritePackageRestrictions(userId); } @@ -506,7 +509,7 @@ final class PreferredActivityHelper { synchronized (mPm.mLock) { mPm.mSettings.readPreferredActivitiesLPw(readParser, readUserId); } - updateDefaultHomeNotLocked(readUserId); + updateDefaultHomeNotLocked(mPm.snapshotComputer(), readUserId); }); } catch (Exception e) { if (DEBUG_BACKUP) { @@ -598,7 +601,7 @@ final class PreferredActivityHelper { mPm.mPermissionManager.resetRuntimePermissions(pkg, userId); } } - updateDefaultHomeNotLocked(userId); + updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId); resetNetworkPolicies(userId); mPm.scheduleWritePackageRestrictions(userId); } finally { @@ -610,12 +613,11 @@ final class PreferredActivityHelper { mPm.mInjector.getLocalService(NetworkPolicyManagerInternal.class).resetUserState(userId); } - // TODO: This method should not touch the Computer directly - public int getPreferredActivities(List outFilters, - List outActivities, String packageName, Computer computer) { + public int getPreferredActivities(@NonNull Computer snapshot, List outFilters, + List outActivities, String packageName) { List temp = WatchedIntentFilter.toWatchedIntentFilterList(outFilters); - int result = getPreferredActivitiesInternal(temp, outActivities, packageName, computer); + int result = getPreferredActivitiesInternal(snapshot, temp, outActivities, packageName); outFilters.clear(); for (int i = 0; i < temp.size(); i++) { outFilters.add(temp.get(i).getIntentFilter()); @@ -626,16 +628,17 @@ final class PreferredActivityHelper { /** * Variant that takes a {@link WatchedIntentFilter} */ - private int getPreferredActivitiesInternal(List outFilters, - List outActivities, String packageName, Computer computer) { + private int getPreferredActivitiesInternal(@NonNull Computer snapshot, + List outFilters, List outActivities, + String packageName) { final int callingUid = Binder.getCallingUid(); - if (mPm.getInstantAppPackageName(callingUid) != null) { + if (snapshot.getInstantAppPackageName(callingUid) != null) { return 0; } int num = 0; final int userId = UserHandle.getCallingUserId(); - PreferredIntentResolver pir = computer.getPreferredActivities(userId); + PreferredIntentResolver pir = snapshot.getPreferredActivities(userId); if (pir != null) { final Iterator it = pir.filterIterator(); while (it.hasNext()) { @@ -643,8 +646,9 @@ final class PreferredActivityHelper { final String prefPackageName = pa.mPref.mComponent.getPackageName(); if (packageName == null || (prefPackageName.equals(packageName) && pa.mPref.mAlways)) { - if (mPm.shouldFilterApplication( - mPm.getPackageStateInternal(prefPackageName), callingUid, userId)) { + if (snapshot.shouldFilterApplication( + snapshot.getPackageStateInternal(prefPackageName), callingUid, + userId)) { continue; } if (outFilters != null) { @@ -660,7 +664,8 @@ final class PreferredActivityHelper { return num; } - public ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) { + public ResolveInfo findPersistentPreferredActivity(@NonNull Computer snapshot, Intent intent, + int userId) { if (!UserHandle.isSameApp(Binder.getCallingUid(), Process.SYSTEM_UID)) { throw new SecurityException( "findPersistentPreferredActivity can only be run by the system"); @@ -671,24 +676,23 @@ final class PreferredActivityHelper { final int callingUid = Binder.getCallingUid(); intent = PackageManagerServiceUtils.updateIntentForResolve(intent); final String resolvedType = intent.resolveTypeIfNeeded(mPm.mContext.getContentResolver()); - final long flags = mPm.updateFlagsForResolve( + final long flags = snapshot.updateFlagsForResolve( 0, userId, callingUid, false /*includeInstantApps*/, - mPm.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType, + snapshot.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, resolvedType, 0)); - final List query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent, + final List query = snapshot.queryIntentActivitiesInternal(intent, resolvedType, flags, userId); - synchronized (mPm.mLock) { - return mPm.findPersistentPreferredActivityLP(intent, resolvedType, flags, query, false, - userId); - } + return snapshot.findPersistentPreferredActivity(intent, resolvedType, flags, query, false, + userId); } /** * Variant that takes a {@link WatchedIntentFilter} */ - public void setLastChosenActivity(Intent intent, String resolvedType, int flags, - WatchedIntentFilter filter, int match, ComponentName activity) { - if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) { + public void setLastChosenActivity(@NonNull Computer snapshot, Intent intent, + String resolvedType, int flags, WatchedIntentFilter filter, int match, + ComponentName activity) { + if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { return; } final int userId = UserHandle.getCallingUserId(); @@ -702,25 +706,26 @@ final class PreferredActivityHelper { filter.dump(new PrintStreamPrinter(System.out), " "); } intent.setComponent(null); - final List query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent, + final List query = snapshot.queryIntentActivitiesInternal(intent, resolvedType, flags, userId); // Find any earlier preferred or last chosen entries and nuke them - findPreferredActivityNotLocked( - intent, resolvedType, flags, query, false, true, false, userId); + findPreferredActivityNotLocked(snapshot, intent, resolvedType, flags, query, false, true, + false, userId); // Add the new activity as the last chosen for this filter - addPreferredActivity(filter, match, null, activity, false, userId, + addPreferredActivity(snapshot, filter, match, null, activity, false, userId, "Setting last chosen", false); } - public ResolveInfo getLastChosenActivity(Intent intent, String resolvedType, int flags) { - if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) { + public ResolveInfo getLastChosenActivity(@NonNull Computer snapshot, Intent intent, + String resolvedType, int flags) { + if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { return null; } final int userId = UserHandle.getCallingUserId(); if (DEBUG_PREFERRED) Log.v(TAG, "Querying last chosen activity for " + intent); - final List query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent, + final List query = snapshot.queryIntentActivitiesInternal(intent, resolvedType, flags, userId); - return findPreferredActivityNotLocked( - intent, resolvedType, flags, query, false, false, false, userId); + return findPreferredActivityNotLocked(snapshot, intent, resolvedType, flags, query, false, + false, false, userId); } } diff --git a/services/core/java/com/android/server/pm/PreferredComponent.java b/services/core/java/com/android/server/pm/PreferredComponent.java index 4ec042f79052..2a1ca2c41e64 100644 --- a/services/core/java/com/android/server/pm/PreferredComponent.java +++ b/services/core/java/com/android/server/pm/PreferredComponent.java @@ -57,7 +57,6 @@ public class PreferredComponent { private String mParseError; private final Callbacks mCallbacks; - private final String mSetupWizardPackageName; public interface Callbacks { public boolean onReadTag(String tagName, TypedXmlPullParser parser) @@ -72,7 +71,6 @@ public class PreferredComponent { mAlways = always; mShortComponent = component.flattenToShortString(); mParseError = null; - mSetupWizardPackageName = null; if (set != null) { final int N = set.length; String[] myPackages = new String[N]; @@ -174,8 +172,6 @@ public class PreferredComponent { mSetPackages = myPackages; mSetClasses = myClasses; mSetComponents = myComponents; - final PackageManagerInternal packageManagerInternal = LocalServices.getService(PackageManagerInternal.class); - mSetupWizardPackageName = packageManagerInternal.getSetupWizardPackageName(); } public String getParseError() { @@ -209,6 +205,7 @@ public class PreferredComponent { final int NQ = query.size(); final int NS = mSetPackages.length; final PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class); + String setupWizardPackageName = pmi.getSetupWizardPackageName(); int numMatch = 0; for (int i=0; i 0) { final PreferredActivityHelper preferredActivityHelper = new PreferredActivityHelper(mPm); - preferredActivityHelper.updateDefaultHomeNotLocked(changedUsers); + preferredActivityHelper.updateDefaultHomeNotLocked(mPm.snapshotComputer(), + changedUsers); mPm.postPreferredActivityChangedBroadcast(UserHandle.USER_ALL); } } diff --git a/services/core/java/com/android/server/pm/ResolveIntentHelper.java b/services/core/java/com/android/server/pm/ResolveIntentHelper.java index 25356a489217..b74670b77a11 100644 --- a/services/core/java/com/android/server/pm/ResolveIntentHelper.java +++ b/services/core/java/com/android/server/pm/ResolveIntentHelper.java @@ -115,7 +115,7 @@ final class ResolveIntentHelper { if (!mUserManager.exists(userId)) return null; final int callingUid = Binder.getCallingUid(); flags = computer.updateFlagsForResolve(flags, userId, filterCallingUid, resolveForStart, - computer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, + computer.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, resolvedType, flags)); computer.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/, false /*checkShell*/, "resolve intent"); @@ -170,9 +170,9 @@ final class ResolveIntentHelper { } // If we have saved a preference for a preferred activity for // this Intent, use that. - ResolveInfo ri = mPreferredActivityHelper.findPreferredActivityNotLocked(intent, - resolvedType, flags, query, true, false, debug, userId, - queryMayBeFiltered); + ResolveInfo ri = mPreferredActivityHelper.findPreferredActivityNotLocked(computer, + intent, resolvedType, flags, query, true, false, debug, + userId, queryMayBeFiltered); if (ri != null) { return ri; } @@ -317,7 +317,7 @@ final class ResolveIntentHelper { final String instantAppPkgName = computer.getInstantAppPackageName(filterCallingUid); flags = computer.updateFlagsForResolve(flags, userId, filterCallingUid, false /*includeInstantApps*/, - computer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, + computer.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, resolvedType, flags)); Intent originalIntent = null; ComponentName comp = intent.getComponent(); @@ -562,7 +562,7 @@ final class ResolveIntentHelper { final int callingUid = Binder.getCallingUid(); flags = computer.updateFlagsForResolve(flags, userId, callingUid, false /*includeInstantApps*/, - computer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, + computer.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, resolvedType, flags)); computer.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/, false /*checkShell*/, "query intent activity options"); diff --git a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java index 3fe079034cf2..479a404c88bf 100644 --- a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java +++ b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java @@ -741,9 +741,11 @@ public final class SharedLibrariesImpl implements SharedLibrariesRead, Watchable } SharedLibraryInfo libraryInfo = versionedLib.valueAt(libIdx); + final Computer snapshot = mPm.snapshotComputer(); + // Remove the shared library overlays from its dependent packages. for (int currentUserId : mPm.mUserManager.getUserIds()) { - final List dependents = mPm.getPackagesUsingSharedLibrary( + final List dependents = snapshot.getPackagesUsingSharedLibrary( libraryInfo, 0, Process.SYSTEM_UID, currentUserId); if (dependents == null) { continue; diff --git a/services/core/java/com/android/server/pm/StorageEventHelper.java b/services/core/java/com/android/server/pm/StorageEventHelper.java index bb7e55a4bf40..df19d3e58bfd 100644 --- a/services/core/java/com/android/server/pm/StorageEventHelper.java +++ b/services/core/java/com/android/server/pm/StorageEventHelper.java @@ -26,13 +26,13 @@ import static com.android.server.pm.PackageManagerService.SCAN_INITIAL; import static com.android.server.pm.PackageManagerService.TAG; import static com.android.server.pm.PackageManagerServiceUtils.logCriticalInfo; +import android.annotation.NonNull; import android.app.ResourcesManager; import android.content.IIntentReceiver; import android.content.pm.PackageManager; import android.content.pm.PackagePartitions; import android.content.pm.UserInfo; import android.content.pm.VersionedPackage; -import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import android.os.Environment; import android.os.FileUtils; import android.os.UserHandle; @@ -48,6 +48,7 @@ import android.util.Slog; import com.android.internal.policy.AttributeCache; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; +import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import java.io.File; import java.util.ArrayList; @@ -78,7 +79,7 @@ public final class StorageEventHelper extends StorageEventListener { // Clean up any users or apps that were removed or recreated // while this volume was missing mPm.mUserManager.reconcileUsers(volumeUuid); - reconcileApps(volumeUuid); + reconcileApps(mPm.snapshotComputer(), volumeUuid); // Clean up any install sessions that expired or were // cancelled while this volume was missing @@ -299,8 +300,8 @@ public final class StorageEventHelper extends StorageEventListener { * aren't expected, either due to uninstallation or reinstallation on * another volume. */ - public void reconcileApps(String volumeUuid) { - List absoluteCodePaths = collectAbsoluteCodePaths(); + public void reconcileApps(@NonNull Computer snapshot, String volumeUuid) { + List absoluteCodePaths = collectAbsoluteCodePaths(snapshot); List filesToDelete = null; final File[] files = FileUtils.listFilesOrEmpty( @@ -345,10 +346,10 @@ public final class StorageEventHelper extends StorageEventListener { } } - private List collectAbsoluteCodePaths() { + private List collectAbsoluteCodePaths(@NonNull Computer snapshot) { List codePaths = new ArrayList<>(); final ArrayMap packageStates = - mPm.getPackageStates(); + snapshot.getPackageStates(); final int packageCount = packageStates.size(); for (int i = 0; i < packageCount; i++) { final PackageStateInternal ps = packageStates.valueAt(i); diff --git a/services/core/java/com/android/server/pm/SuspendPackageHelper.java b/services/core/java/com/android/server/pm/SuspendPackageHelper.java index 3ef5599385ce..588dfaf6db78 100644 --- a/services/core/java/com/android/server/pm/SuspendPackageHelper.java +++ b/services/core/java/com/android/server/pm/SuspendPackageHelper.java @@ -100,14 +100,14 @@ public final class SuspendPackageHelper { * @return The names of failed packages. */ @Nullable - String[] setPackagesSuspended(@NonNull Computer computer, @Nullable String[] packageNames, + String[] setPackagesSuspended(@NonNull Computer snapshot, @Nullable String[] packageNames, boolean suspended, @Nullable PersistableBundle appExtras, @Nullable PersistableBundle launcherExtras, @Nullable SuspendDialogInfo dialogInfo, @NonNull String callingPackage, @UserIdInt int userId, int callingUid) { if (ArrayUtils.isEmpty(packageNames)) { return packageNames; } - if (suspended && !isSuspendAllowedForUser(userId, callingUid)) { + if (suspended && !isSuspendAllowedForUser(snapshot, userId, callingUid)) { Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId); return packageNames; } @@ -123,7 +123,7 @@ public final class SuspendPackageHelper { ArraySet modifiedPackages = new ArraySet<>(); final boolean[] canSuspend = suspended - ? canSuspendPackageForUser(computer, packageNames, userId, callingUid) : null; + ? canSuspendPackageForUser(snapshot, packageNames, userId, callingUid) : null; for (int i = 0; i < packageNames.length; i++) { final String packageName = packageNames[i]; if (callingPackage.equals(packageName)) { @@ -133,9 +133,9 @@ public final class SuspendPackageHelper { continue; } final PackageStateInternal packageState = - computer.getPackageStateInternal(packageName); + snapshot.getPackageStateInternal(packageName); if (packageState == null - || computer.shouldFilterApplication(packageState, callingUid, userId)) { + || snapshot.shouldFilterApplication(packageState, callingUid, userId)) { Slog.w(TAG, "Could not find package setting for package: " + packageName + ". Skipping suspending/un-suspending."); unmodifiablePackages.add(packageName); @@ -191,9 +191,11 @@ public final class SuspendPackageHelper { } }); + final Computer newSnapshot = mPm.snapshotComputer(); + if (!changedPackagesList.isEmpty()) { final String[] changedPackages = changedPackagesList.toArray(new String[0]); - sendPackagesSuspendedForUser( + sendPackagesSuspendedForUser(newSnapshot, suspended ? Intent.ACTION_PACKAGES_SUSPENDED : Intent.ACTION_PACKAGES_UNSUSPENDED, changedPackages, changedUids.toArray(), userId); @@ -202,7 +204,7 @@ public final class SuspendPackageHelper { } // Send the suspension changed broadcast to ensure suspension state is not stale. if (!modifiedPackages.isEmpty()) { - sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, + sendPackagesSuspendedForUser(newSnapshot, Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, modifiedPackages.toArray(new String[0]), modifiedUids.toArray(), userId); } return unmodifiablePackages.toArray(new String[0]); @@ -217,14 +219,14 @@ public final class SuspendPackageHelper { * @return The names of packages which are Unsuspendable. */ @NonNull - String[] getUnsuspendablePackagesForUser(@NonNull Computer computer, + String[] getUnsuspendablePackagesForUser(@NonNull Computer snapshot, @NonNull String[] packageNames, @UserIdInt int userId, int callingUid) { - if (!isSuspendAllowedForUser(userId, callingUid)) { + if (!isSuspendAllowedForUser(snapshot, userId, callingUid)) { Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId); return packageNames; } final ArraySet unactionablePackages = new ArraySet<>(); - final boolean[] canSuspend = canSuspendPackageForUser(computer, packageNames, userId, + final boolean[] canSuspend = canSuspendPackageForUser(snapshot, packageNames, userId, callingUid); for (int i = 0; i < packageNames.length; i++) { if (!canSuspend[i]) { @@ -232,7 +234,7 @@ public final class SuspendPackageHelper { continue; } final PackageStateInternal packageState = - computer.getPackageStateFiltered(packageNames[i], callingUid, userId); + snapshot.getPackageStateFiltered(packageNames[i], callingUid, userId); if (packageState == null) { Slog.w(TAG, "Could not find package setting for package: " + packageNames[i]); unactionablePackages.add(packageNames[i]); @@ -250,8 +252,9 @@ public final class SuspendPackageHelper { * @return The app extras of the suspended package. */ @Nullable - Bundle getSuspendedPackageAppExtras(@NonNull String packageName, int userId, int callingUid) { - final PackageStateInternal ps = mPm.getPackageStateInternal(packageName, callingUid); + Bundle getSuspendedPackageAppExtras(@NonNull Computer snapshot, @NonNull String packageName, + int userId, int callingUid) { + final PackageStateInternal ps = snapshot.getPackageStateInternal(packageName, callingUid); if (ps == null) { return null; } @@ -329,12 +332,14 @@ public final class SuspendPackageHelper { } }); + final Computer newSnapshot = mPm.snapshotComputer(); + mPm.scheduleWritePackageRestrictions(userId); if (!unsuspendedPackages.isEmpty()) { final String[] packageArray = unsuspendedPackages.toArray( new String[unsuspendedPackages.size()]); sendMyPackageSuspendedOrUnsuspended(packageArray, false, userId); - sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_UNSUSPENDED, + sendPackagesSuspendedForUser(newSnapshot, Intent.ACTION_PACKAGES_UNSUSPENDED, packageArray, unsuspendedUids.toArray(), userId); } } @@ -348,10 +353,10 @@ public final class SuspendPackageHelper { * @return The launcher extras. */ @Nullable - Bundle getSuspendedPackageLauncherExtras(@NonNull String packageName, int userId, - int callingUid) { - final PackageStateInternal packageState = mPm.getPackageStateInternal( - packageName, callingUid); + Bundle getSuspendedPackageLauncherExtras(@NonNull Computer snapshot, + @NonNull String packageName, int userId, int callingUid) { + final PackageStateInternal packageState = + snapshot.getPackageStateInternal(packageName, callingUid); if (packageState == null) { return null; } @@ -376,9 +381,10 @@ public final class SuspendPackageHelper { * @param callingUid The caller's uid. * @return {@code true}, if the given package is suspended. */ - boolean isPackageSuspended(@NonNull String packageName, int userId, int callingUid) { - final PackageStateInternal packageState = mPm.getPackageStateInternal( - packageName, callingUid); + boolean isPackageSuspended(@NonNull Computer snapshot, @NonNull String packageName, int userId, + int callingUid) { + final PackageStateInternal packageState = + snapshot.getPackageStateInternal(packageName, callingUid); return packageState != null && packageState.getUserStateOrDefault(userId) .isSuspended(); } @@ -392,8 +398,9 @@ public final class SuspendPackageHelper { * @return The name of suspending package. */ @Nullable - String getSuspendingPackage(@NonNull String suspendedPackage, int userId, int callingUid) { - final PackageStateInternal packageState = mPm.getPackageStateInternal( + String getSuspendingPackage(@NonNull Computer snapshot, @NonNull String suspendedPackage, + int userId, int callingUid) { + final PackageStateInternal packageState = snapshot.getPackageStateInternal( suspendedPackage, callingUid); if (packageState == null) { return null; @@ -424,9 +431,10 @@ public final class SuspendPackageHelper { * @return The dialog info. */ @Nullable - SuspendDialogInfo getSuspendedDialogInfo(@NonNull String suspendedPackage, - @NonNull String suspendingPackage, int userId, int callingUid) { - final PackageStateInternal packageState = mPm.getPackageStateInternal( + SuspendDialogInfo getSuspendedDialogInfo(@NonNull Computer snapshot, + @NonNull String suspendedPackage, @NonNull String suspendingPackage, int userId, + int callingUid) { + final PackageStateInternal packageState = snapshot.getPackageStateInternal( suspendedPackage, callingUid); if (packageState == null) { return null; @@ -454,9 +462,9 @@ public final class SuspendPackageHelper { * @param callingUid The caller's uid. * @return {@code true} if the user is allowed to suspend packages by the caller. */ - boolean isSuspendAllowedForUser(int userId, int callingUid) { + boolean isSuspendAllowedForUser(@NonNull Computer snapshot, int userId, int callingUid) { final UserManagerService userManager = mInjector.getUserManagerService(); - return isCallerDeviceOrProfileOwner(userId, callingUid) + return isCallerDeviceOrProfileOwner(snapshot, userId, callingUid) || (!userManager.hasUserRestriction(UserManager.DISALLOW_APPS_CONTROL, userId) && !userManager.hasUserRestriction(UserManager.DISALLOW_UNINSTALL_APPS, userId)); } @@ -471,21 +479,23 @@ public final class SuspendPackageHelper { * @return An array containing results of the checks */ @NonNull - boolean[] canSuspendPackageForUser(@NonNull Computer computer, @NonNull String[] packageNames, + boolean[] canSuspendPackageForUser(@NonNull Computer snapshot, @NonNull String[] packageNames, int userId, int callingUid) { final boolean[] canSuspend = new boolean[packageNames.length]; - final boolean isCallerOwner = isCallerDeviceOrProfileOwner(userId, callingUid); + final boolean isCallerOwner = isCallerDeviceOrProfileOwner(snapshot, userId, callingUid); final long token = Binder.clearCallingIdentity(); try { final DefaultAppProvider defaultAppProvider = mInjector.getDefaultAppProvider(); final String activeLauncherPackageName = defaultAppProvider.getDefaultHome(userId); final String dialerPackageName = defaultAppProvider.getDefaultDialer(userId); - final String requiredInstallerPackage = getKnownPackageName(PACKAGE_INSTALLER, userId); + final String requiredInstallerPackage = + getKnownPackageName(snapshot, PACKAGE_INSTALLER, userId); final String requiredUninstallerPackage = - getKnownPackageName(PACKAGE_UNINSTALLER, userId); - final String requiredVerifierPackage = getKnownPackageName(PACKAGE_VERIFIER, userId); + getKnownPackageName(snapshot, PACKAGE_UNINSTALLER, userId); + final String requiredVerifierPackage = + getKnownPackageName(snapshot, PACKAGE_VERIFIER, userId); final String requiredPermissionControllerPackage = - getKnownPackageName(PACKAGE_PERMISSION_CONTROLLER, userId); + getKnownPackageName(snapshot, PACKAGE_PERMISSION_CONTROLLER, userId); for (int i = 0; i < packageNames.length; i++) { canSuspend[i] = false; final String packageName = packageNames[i]; @@ -530,7 +540,7 @@ public final class SuspendPackageHelper { + "\": protected package"); continue; } - if (!isCallerOwner && computer.getBlockUninstall(userId, packageName)) { + if (!isCallerOwner && snapshot.getBlockUninstall(userId, packageName)) { Slog.w(TAG, "Cannot suspend package \"" + packageName + "\": blocked by admin"); continue; @@ -539,7 +549,7 @@ public final class SuspendPackageHelper { // Cannot suspend static shared libs as they are considered // a part of the using app (emulating static linking). Also // static libs are installed always on internal storage. - PackageStateInternal packageState = computer.getPackageStateInternal(packageName); + PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); AndroidPackage pkg = packageState == null ? null : packageState.getPkg(); if (pkg != null) { // Cannot suspend SDK libs as they are controlled by SDK manager. @@ -580,8 +590,8 @@ public final class SuspendPackageHelper { * @param userId The user where packages reside. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) - void sendPackagesSuspendedForUser(@NonNull String intent, @NonNull String[] pkgList, - @NonNull int[] uidList, int userId) { + void sendPackagesSuspendedForUser(@NonNull Computer snapshot, @NonNull String intent, + @NonNull String[] pkgList, @NonNull int[] uidList, int userId) { final List> pkgsToSend = new ArrayList(pkgList.length); final List uidsToSend = new ArrayList(pkgList.length); final List> allowListsToSend = new ArrayList(pkgList.length); @@ -592,8 +602,8 @@ public final class SuspendPackageHelper { final String pkgName = pkgList[i]; final int uid = uidList[i]; SparseArray allowList = mInjector.getAppsFilter().getVisibilityAllowList( - mPm.getPackageStateInternal(pkgName, SYSTEM_UID), - userIds, mPm.getPackageStates()); + snapshot.getPackageStateInternal(pkgName, SYSTEM_UID), + userIds, snapshot.getPackageStates()); if (allowList == null) { allowList = new SparseArray<>(0); } @@ -628,19 +638,22 @@ public final class SuspendPackageHelper { } } - private String getKnownPackageName(@KnownPackage int knownPackage, int userId) { - final String[] knownPackages = mPm.getKnownPackageNamesInternal(knownPackage, userId); + private String getKnownPackageName(@NonNull Computer snapshot, @KnownPackage int knownPackage, + int userId) { + final String[] knownPackages = + mPm.getKnownPackageNamesInternal(snapshot, knownPackage, userId); return knownPackages.length > 0 ? knownPackages[0] : null; } - private boolean isCallerDeviceOrProfileOwner(int userId, int callingUid) { + private boolean isCallerDeviceOrProfileOwner(@NonNull Computer snapshot, int userId, + int callingUid) { if (callingUid == SYSTEM_UID) { return true; } final String ownerPackage = mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(userId); if (ownerPackage != null) { - return callingUid == mPm.getPackageUidInternal( - ownerPackage, 0, userId, callingUid); + return callingUid == snapshot.getPackageUidInternal(ownerPackage, 0, userId, + callingUid); } return false; } @@ -659,9 +672,10 @@ public final class SuspendPackageHelper { return; } final int[] targetUserIds = new int[] {userId}; + final Computer snapshot = mPm.snapshotComputer(); for (String packageName : affectedPackages) { final Bundle appExtras = suspended - ? getSuspendedPackageAppExtras(packageName, userId, SYSTEM_UID) + ? getSuspendedPackageAppExtras(snapshot, packageName, userId, SYSTEM_UID) : null; final Bundle intentExtras; if (appExtras != null) { diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index a8d24fad2598..84be151bdbcf 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -4148,11 +4148,11 @@ public class UserManagerService extends IUserManager.Stub { continue; } if (filter.direction == DefaultCrossProfileIntentFilter.Direction.TO_PARENT) { - mPm.addCrossProfileIntentFilter( + mPm.addCrossProfileIntentFilter(mPm.snapshotComputer(), filter.filter, mContext.getOpPackageName(), profileUserId, parentUserId, filter.flags); } else { - mPm.addCrossProfileIntentFilter( + mPm.addCrossProfileIntentFilter(mPm.snapshotComputer(), filter.filter, mContext.getOpPackageName(), parentUserId, profileUserId, filter.flags); } diff --git a/services/core/java/com/android/server/pm/WatchedIntentFilter.java b/services/core/java/com/android/server/pm/WatchedIntentFilter.java index 30f276e8386a..5d7a2a3bd426 100644 --- a/services/core/java/com/android/server/pm/WatchedIntentFilter.java +++ b/services/core/java/com/android/server/pm/WatchedIntentFilter.java @@ -84,7 +84,7 @@ public class WatchedIntentFilter } // Convert an {@link IntentFilter} to a {@link WatchedIntentFilter} - protected WatchedIntentFilter(IntentFilter f) { + public WatchedIntentFilter(IntentFilter f) { mFilter = new IntentFilter(f); } diff --git a/services/core/java/com/android/server/pm/dex/ArtManagerService.java b/services/core/java/com/android/server/pm/dex/ArtManagerService.java index e28a6ea8ea6b..7e4da945709b 100644 --- a/services/core/java/com/android/server/pm/dex/ArtManagerService.java +++ b/services/core/java/com/android/server/pm/dex/ArtManagerService.java @@ -31,13 +31,13 @@ import android.content.pm.dex.ArtManagerInternal; import android.content.pm.dex.DexMetadataHelper; import android.content.pm.dex.ISnapshotRuntimeProfileCallback; import android.content.pm.dex.PackageOptimizationInfo; -import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils; import android.os.Binder; import android.os.Build; import android.os.Handler; import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.RemoteException; +import android.os.ServiceManager; import android.os.SystemProperties; import android.os.UserHandle; import android.system.Os; @@ -55,6 +55,7 @@ import com.android.server.pm.Installer; import com.android.server.pm.Installer.InstallerException; import com.android.server.pm.PackageManagerServiceCompilerMapping; import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils; import dalvik.system.DexFile; import dalvik.system.VMRuntime; @@ -92,7 +93,7 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub { private static final String BOOT_IMAGE_PROFILE_NAME = "android.prof"; private final Context mContext; - private final IPackageManager mPackageManager; + private IPackageManager mPackageManager; private final Object mInstallLock; @GuardedBy("mInstallLock") private final Installer mInstaller; @@ -103,10 +104,9 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub { verifyTronLoggingConstants(); } - public ArtManagerService(Context context, IPackageManager pm, Installer installer, + public ArtManagerService(Context context, Installer installer, Object installLock) { mContext = context; - mPackageManager = pm; mInstaller = installer; mInstallLock = installLock; mHandler = new Handler(BackgroundThread.getHandler().getLooper()); @@ -114,6 +114,15 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub { LocalServices.addService(ArtManagerInternal.class, new ArtManagerInternalImpl()); } + @NonNull + private IPackageManager getPackageManager() { + if (mPackageManager == null) { + mPackageManager = IPackageManager.Stub.asInterface( + ServiceManager.getService("package")); + } + return mPackageManager; + } + private boolean checkAndroidPermissions(int callingUid, String callingPackage) { // Callers always need this permission mContext.enforceCallingOrSelfPermission( @@ -157,7 +166,7 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub { } PackageInfo info = null; try { - info = mPackageManager.getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0); + info = getPackageManager().getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0); } catch (RemoteException ignored) { // Should not happen. } @@ -221,7 +230,7 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub { // TODO(calin): consider adding an API to PMS which can retrieve the // PackageParser.Package. - info = mPackageManager.getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0); + info = getPackageManager().getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0); } catch (RemoteException ignored) { // Should not happen. } diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java index 5371454db43c..17109e97ddf1 100644 --- a/services/core/java/com/android/server/pm/dex/DexManager.java +++ b/services/core/java/com/android/server/pm/dex/DexManager.java @@ -23,6 +23,8 @@ import static com.android.server.pm.dex.PackageDexUsage.PackageUseInfo; import static java.util.function.Function.identity; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; @@ -33,6 +35,7 @@ import android.os.BatteryManager; import android.os.FileUtils; import android.os.PowerManager; import android.os.RemoteException; +import android.os.ServiceManager; import android.os.SystemProperties; import android.os.UserHandle; import android.os.storage.StorageManager; @@ -109,7 +112,7 @@ public class DexManager { // record class loaders or ISAs.) private final DynamicCodeLogger mDynamicCodeLogger; - private final IPackageManager mPackageManager; + private IPackageManager mPackageManager; private final PackageDexOptimizer mPackageDexOptimizer; private final Object mInstallLock; @GuardedBy("mInstallLock") @@ -128,16 +131,22 @@ public class DexManager { private static int DEX_SEARCH_FOUND_SPLIT = 2; // dex file is a split apk private static int DEX_SEARCH_FOUND_SECONDARY = 3; // dex file is a secondary dex - public DexManager(Context context, IPackageManager pms, PackageDexOptimizer pdo, - Installer installer, Object installLock) { + public DexManager(Context context, PackageDexOptimizer pdo, Installer installer, + Object installLock) { + this(context, pdo, installer, installLock, null); + } + + @VisibleForTesting + public DexManager(Context context, PackageDexOptimizer pdo, Installer installer, + Object installLock, @Nullable IPackageManager packageManager) { mContext = context; mPackageCodeLocationsCache = new HashMap<>(); mPackageDexUsage = new PackageDexUsage(); - mPackageManager = pms; mPackageDexOptimizer = pdo; mInstaller = installer; mInstallLock = installLock; - mDynamicCodeLogger = new DynamicCodeLogger(pms, installer); + mDynamicCodeLogger = new DynamicCodeLogger(installer); + mPackageManager = packageManager; // This is currently checked to handle tests that pass in a null context. // TODO(b/174783329): Modify the tests to pass in a mocked Context, PowerManager, @@ -157,6 +166,15 @@ public class DexManager { } } + @NonNull + private IPackageManager getPackageManager() { + if (mPackageManager == null) { + mPackageManager = IPackageManager.Stub.asInterface( + ServiceManager.getService("package")); + } + return mPackageManager; + } + public DynamicCodeLogger getDynamicCodeLogger() { return mDynamicCodeLogger; } @@ -529,7 +547,7 @@ public class DexManager { PackageInfo pkg; try { - pkg = mPackageManager.getPackageInfo(packageName, /*flags*/0, + pkg = getPackageManager().getPackageInfo(packageName, /*flags*/0, dexUseInfo.getOwnerUserId()); } catch (RemoteException e) { throw new AssertionError(e); @@ -673,7 +691,7 @@ public class DexManager { // to get back the real app uid and its storage kind. These are only used // to perform extra validation in installd. // TODO(calin): maybe a bit overkill. - pkg = mPackageManager.getPackageInfo(packageName, /*flags*/0, + pkg = getPackageManager().getPackageInfo(packageName, /*flags*/0, dexUseInfo.getOwnerUserId()); } catch (RemoteException ignore) { // Can't happen, DexManager is local. diff --git a/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java b/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java index 75b4e38e42f5..9b94e993f967 100644 --- a/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java +++ b/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java @@ -19,11 +19,13 @@ package com.android.server.pm.dex; import static com.android.server.pm.dex.PackageDynamicCodeLoading.FILE_TYPE_DEX; import static com.android.server.pm.dex.PackageDynamicCodeLoading.FILE_TYPE_NATIVE; +import android.annotation.NonNull; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.os.FileUtils; import android.os.RemoteException; +import android.os.ServiceManager; import android.os.UserHandle; import android.os.storage.StorageManager; import android.util.EventLog; @@ -58,20 +60,30 @@ public class DynamicCodeLogger { private static final String DCL_DEX_SUBTAG = "dcl"; private static final String DCL_NATIVE_SUBTAG = "dcln"; - private final IPackageManager mPackageManager; + private IPackageManager mPackageManager; private final PackageDynamicCodeLoading mPackageDynamicCodeLoading; private final Installer mInstaller; - DynamicCodeLogger(IPackageManager pms, Installer installer) { - this(pms, installer, new PackageDynamicCodeLoading()); + DynamicCodeLogger(Installer installer) { + mInstaller = installer; + mPackageDynamicCodeLoading = new PackageDynamicCodeLoading(); } @VisibleForTesting - DynamicCodeLogger(IPackageManager pms, Installer installer, - PackageDynamicCodeLoading packageDynamicCodeLoading) { - mPackageManager = pms; - mPackageDynamicCodeLoading = packageDynamicCodeLoading; + DynamicCodeLogger(@NonNull IPackageManager packageManager, @NonNull Installer installer, + @NonNull PackageDynamicCodeLoading packageDynamicCodeLoading) { + mPackageManager = packageManager; mInstaller = installer; + mPackageDynamicCodeLoading = packageDynamicCodeLoading; + } + + @NonNull + private IPackageManager getPackageManager() { + if (mPackageManager == null) { + mPackageManager = IPackageManager.Stub.asInterface( + ServiceManager.getService("package")); + } + return mPackageManager; } public Set getAllPackagesWithDynamicCodeLoading() { @@ -104,7 +116,7 @@ public class DynamicCodeLogger { try { PackageInfo ownerInfo = - mPackageManager.getPackageInfo(packageName, /*flags*/ 0, userId); + getPackageManager().getPackageInfo(packageName, /*flags*/ 0, userId); appInfo = ownerInfo == null ? null : ownerInfo.applicationInfo; } catch (RemoteException ignored) { // Can't happen, we're local. @@ -167,7 +179,7 @@ public class DynamicCodeLogger { loadingUid = appInfo.uid; } else { try { - loadingUid = mPackageManager.getPackageUid(loadingPackageName, /*flags*/ 0, + loadingUid = getPackageManager().getPackageUid(loadingPackageName, /*flags*/ 0, userId); } catch (RemoteException ignored) { // Can't happen, we're local. @@ -223,7 +235,7 @@ public class DynamicCodeLogger { public void recordNative(int loadingUid, String path) { String[] packages; try { - packages = mPackageManager.getPackagesForUid(loadingUid); + packages = getPackageManager().getPackagesForUid(loadingUid); if (packages == null || packages.length == 0) { return; } diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java index 8223b8c86c5b..6f503c7dd941 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java @@ -116,7 +116,7 @@ public final class BackgroundDexOptServiceUnitTest { when(mInjector.getDataDirStorageLowBytes()).thenReturn(STORAGE_LOW_BYTES); when(mInjector.getDexOptThermalCutoff()).thenReturn(PowerManager.THERMAL_STATUS_CRITICAL); when(mInjector.getCurrentThermalStatus()).thenReturn(PowerManager.THERMAL_STATUS_NONE); - when(mDexOptHelper.getOptimizablePackages()).thenReturn(DEFAULT_PACKAGE_LIST); + when(mDexOptHelper.getOptimizablePackages(any())).thenReturn(DEFAULT_PACKAGE_LIST); when(mDexOptHelper.performDexOptWithStatus(any())).thenReturn( PackageDexOptimizer.DEX_OPT_PERFORMED); @@ -158,7 +158,7 @@ public final class BackgroundDexOptServiceUnitTest { @Test public void testNoExecutionForNoOptimizablePackages() { initUntilBootCompleted(); - when(mDexOptHelper.getOptimizablePackages()).thenReturn(EMPTY_PACKAGE_LIST); + when(mDexOptHelper.getOptimizablePackages(any())).thenReturn(EMPTY_PACKAGE_LIST); assertThat(mService.onStartJob(mJobServiceForPostBoot, mJobParametersForPostBoot)).isFalse(); diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt b/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt index 13199032a223..537a0280e24b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt @@ -157,7 +157,7 @@ class PackageManagerServiceHibernationTests { rule.system().validateFinalState() whenever(appHibernationManager.isHibernatingGlobally(TEST_PACKAGE_2_NAME)).thenReturn(true) - val optimizablePkgs = DexOptHelper(pm).optimizablePackages + val optimizablePkgs = DexOptHelper(pm).getOptimizablePackages(pm.snapshotComputer()) assertTrue(optimizablePkgs.contains(TEST_PACKAGE_NAME)) assertFalse(optimizablePkgs.contains(TEST_PACKAGE_2_NAME)) diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt index b063d22de2bb..1515282812c2 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt @@ -85,6 +85,7 @@ class SharedLibrariesImplTest { private lateinit var mSharedLibrariesImpl: SharedLibrariesImpl private lateinit var mPms: PackageManagerService private lateinit var mSettings: Settings + private lateinit var mComputer: Computer @Mock private lateinit var mDeletePackageHelper: DeletePackageHelper @@ -114,22 +115,16 @@ class SharedLibrariesImplTest { mSharedLibrariesImpl.setDeletePackageHelper(mDeletePackageHelper) addExistingSharedLibraries() + mComputer = mock { + whenever(sharedLibraries) { mSharedLibrariesImpl.sharedLibraries } + whenever(resolveInternalPackageName(anyString(), anyLong())) { arguments[0] } + } + whenever(mSettings.getPackageLPr(any())) { mExistingSettings[arguments[0]] } whenever(mRule.mocks().injector.getSystemService(StorageManager::class.java)) .thenReturn(mStorageManager) whenever(mStorageManager.findPathForUuid(nullable())).thenReturn(mFile) - doAnswer { it.arguments[0] }.`when`(mPms).resolveInternalPackageName(any(), any()) - doAnswer { - mockThrowOnUnmocked { - whenever(sharedLibraries) { mSharedLibrariesImpl.sharedLibraries } - whenever(resolveInternalPackageName(anyString(), anyLong())) { - mPms.resolveInternalPackageName(getArgument(0), getArgument(1)) - } - whenever(getPackageStateInternal(anyString())) { - mPms.getPackageStateInternal(getArgument(0)) - } - } - }.`when`(mPms).snapshotComputer() + doAnswer { mComputer }.`when`(mPms).snapshotComputer() whenever(mDeletePackageHelper.deletePackageX(any(), any(), any(), any(), any())) .thenReturn(PackageManager.DELETE_SUCCEEDED) whenever(mRule.mocks().injector.compatibility).thenReturn(mPlatformCompat) @@ -189,7 +184,8 @@ class SharedLibrariesImplTest { @Test fun removeSharedLibrary() { - doAnswer { mutableListOf(VersionedPackage(CONSUMER_PACKAGE_NAME, 1L)) }.`when`(mPms) + doAnswer { mutableListOf(VersionedPackage(CONSUMER_PACKAGE_NAME, 1L)) } + .`when`(mComputer) .getPackagesUsingSharedLibrary(any(), any(), any(), any()) val staticInfo = mSharedLibrariesImpl .getSharedLibraryInfo(STATIC_LIB_NAME, STATIC_LIB_VERSION)!! diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt index 5230ea7304c8..4818573e9ae5 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt @@ -104,9 +104,9 @@ class SuspendPackageHelperTest { pms, rule.mocks().injector, broadcastHelper, protectedPackages) defaultAppProvider = rule.mocks().defaultAppProvider testHandler = rule.mocks().handler - packageSetting1 = pms.getPackageStateInternal(TEST_PACKAGE_1)!! - packageSetting2 = pms.getPackageStateInternal(TEST_PACKAGE_2)!! - ownerSetting = pms.getPackageStateInternal(DEVICE_OWNER_PACKAGE)!! + packageSetting1 = pms.snapshotComputer().getPackageStateInternal(TEST_PACKAGE_1)!! + packageSetting2 = pms.snapshotComputer().getPackageStateInternal(TEST_PACKAGE_2)!! + ownerSetting = pms.snapshotComputer().getPackageStateInternal(DEVICE_OWNER_PACKAGE)!! deviceOwnerUid = UserHandle.getUid(TEST_USER_ID, ownerSetting.appId) packagesToSuspend = arrayOf(TEST_PACKAGE_1, TEST_PACKAGE_2) uidsToSuspend = intArrayOf(packageSetting1.appId, packageSetting2.appId) @@ -270,7 +270,7 @@ class SuspendPackageHelperTest { testHandler.flush() assertThat(failedNames).isEmpty() - val result = suspendPackageHelper.getSuspendedPackageAppExtras( + val result = suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(), TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)!! assertThat(result.getString(TEST_PACKAGE_1)).isEqualTo(TEST_PACKAGE_1) @@ -286,13 +286,13 @@ class SuspendPackageHelperTest { null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid) testHandler.flush() assertThat(failedNames).isEmpty() - assertThat(suspendPackageHelper.getSuspendingPackage( + assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE) - assertThat(suspendPackageHelper.getSuspendingPackage( + assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE) - assertThat(suspendPackageHelper.getSuspendedPackageAppExtras( + assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(), TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isNotNull() - assertThat(suspendPackageHelper.getSuspendedPackageAppExtras( + assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(), TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isNotNull() suspendPackageHelper.removeSuspensionsBySuspendingPackage(pms.snapshotComputer(), @@ -311,13 +311,13 @@ class SuspendPackageHelperTest { nullable(), nullable(), any(), eq(TEST_PACKAGE_2), nullable(), any(), any(), nullable(), nullable()) - assertThat(suspendPackageHelper.getSuspendingPackage( + assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isNull() - assertThat(suspendPackageHelper.getSuspendingPackage( + assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isNull() - assertThat(suspendPackageHelper.getSuspendedPackageAppExtras( + assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(), TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isNull() - assertThat(suspendPackageHelper.getSuspendedPackageAppExtras( + assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(), TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isNull() } @@ -331,7 +331,7 @@ class SuspendPackageHelperTest { testHandler.flush() assertThat(failedNames).isEmpty() - val result = suspendPackageHelper.getSuspendedPackageLauncherExtras( + val result = suspendPackageHelper.getSuspendedPackageLauncherExtras(pms.snapshotComputer(), TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)!! assertThat(result.getString(TEST_PACKAGE_2)).isEqualTo(TEST_PACKAGE_2) @@ -346,7 +346,7 @@ class SuspendPackageHelperTest { testHandler.flush() assertThat(failedNames).isEmpty() - assertThat(suspendPackageHelper.isPackageSuspended( + assertThat(suspendPackageHelper.isPackageSuspended(pms.snapshotComputer(), TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isTrue() } @@ -360,7 +360,7 @@ class SuspendPackageHelperTest { testHandler.flush() assertThat(failedNames).isEmpty() - assertThat(suspendPackageHelper.getSuspendingPackage( + assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE) } @@ -375,7 +375,7 @@ class SuspendPackageHelperTest { testHandler.flush() assertThat(failedNames).isEmpty() - val result = suspendPackageHelper.getSuspendedDialogInfo( + val result = suspendPackageHelper.getSuspendedDialogInfo(pms.snapshotComputer(), TEST_PACKAGE_1, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)!! assertThat(result.title).isEqualTo(TEST_PACKAGE_1) @@ -387,8 +387,8 @@ class SuspendPackageHelperTest { mockAllowList(packageSetting1, allowList(10001, 10002, 10003)) mockAllowList(packageSetting2, allowList(10001, 10002, 10003)) - suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENDED, - packagesToSuspend, uidsToSuspend, TEST_USER_ID) + suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(), + Intent.ACTION_PACKAGES_SUSPENDED, packagesToSuspend, uidsToSuspend, TEST_USER_ID) testHandler.flush() verify(broadcastHelper).sendPackageBroadcast(any(), nullable(), bundleCaptor.capture(), anyInt(), nullable(), nullable(), any(), nullable(), any(), nullable()) @@ -406,8 +406,8 @@ class SuspendPackageHelperTest { mockAllowList(packageSetting1, allowList(10001, 10002, 10003)) mockAllowList(packageSetting2, allowList(10001, 10002, 10007)) - suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENDED, - packagesToSuspend, uidsToSuspend, TEST_USER_ID) + suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(), + Intent.ACTION_PACKAGES_SUSPENDED, packagesToSuspend, uidsToSuspend, TEST_USER_ID) testHandler.flush() verify(broadcastHelper, times(2)).sendPackageBroadcast( any(), nullable(), bundleCaptor.capture(), anyInt(), nullable(), nullable(), any(), @@ -429,8 +429,8 @@ class SuspendPackageHelperTest { mockAllowList(packageSetting1, allowList(10001, 10002, 10003)) mockAllowList(packageSetting2, null) - suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENDED, - packagesToSuspend, uidsToSuspend, TEST_USER_ID) + suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(), + Intent.ACTION_PACKAGES_SUSPENDED, packagesToSuspend, uidsToSuspend, TEST_USER_ID) testHandler.flush() verify(broadcastHelper, times(2)).sendPackageBroadcast( any(), nullable(), bundleCaptor.capture(), anyInt(), nullable(), nullable(), any(), @@ -449,8 +449,9 @@ class SuspendPackageHelperTest { @Test @Throws(Exception::class) fun sendPackagesSuspendModifiedForUser() { - suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, - packagesToSuspend, uidsToSuspend, TEST_USER_ID) + suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(), + Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, packagesToSuspend, uidsToSuspend, + TEST_USER_ID) testHandler.flush() verify(broadcastHelper).sendPackageBroadcast( eq(Intent.ACTION_PACKAGES_SUSPENSION_CHANGED), nullable(), bundleCaptor.capture(), @@ -483,13 +484,13 @@ class SuspendPackageHelperTest { Mockito.doReturn(DIALER_PACKAGE).`when`(defaultAppProvider) .getDefaultDialer(eq(TEST_USER_ID)) Mockito.doReturn(arrayOf(INSTALLER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal( - eq(PackageManagerInternal.PACKAGE_INSTALLER), eq(TEST_USER_ID)) + any(), eq(PackageManagerInternal.PACKAGE_INSTALLER), eq(TEST_USER_ID)) Mockito.doReturn(arrayOf(UNINSTALLER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal( - eq(PackageManagerInternal.PACKAGE_UNINSTALLER), eq(TEST_USER_ID)) + any(), eq(PackageManagerInternal.PACKAGE_UNINSTALLER), eq(TEST_USER_ID)) Mockito.doReturn(arrayOf(VERIFIER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal( - eq(PackageManagerInternal.PACKAGE_VERIFIER), eq(TEST_USER_ID)) + any(), eq(PackageManagerInternal.PACKAGE_VERIFIER), eq(TEST_USER_ID)) Mockito.doReturn(arrayOf(PERMISSION_CONTROLLER_PACKAGE)).`when`(pms) - .getKnownPackageNamesInternal( + .getKnownPackageNamesInternal(any(), eq(PackageManagerInternal.PACKAGE_PERMISSION_CONTROLLER), eq(TEST_USER_ID)) } diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java b/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java index 8abe46fab1d6..9d269719db64 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java @@ -159,8 +159,8 @@ public class DexManagerTests { .when(mockContext) .getSystemService(PowerManager.class); - mDexManager = new DexManager(mockContext, mPM, /*PackageDexOptimizer*/ null, - mInstaller, mInstallLock); + mDexManager = new DexManager(mockContext, /*PackageDexOptimizer*/ null, + mInstaller, mInstallLock, mPM); // Foo and Bar are available to user0. // Only Bar is available to user1; diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java index 050b224bf7f7..946108d607db 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java @@ -23,11 +23,10 @@ import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.fail; import static java.lang.reflect.Modifier.isFinal; -import static java.lang.reflect.Modifier.isPrivate; -import static java.lang.reflect.Modifier.isProtected; import static java.lang.reflect.Modifier.isPublic; import static java.lang.reflect.Modifier.isStatic; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppGlobals; import android.content.IIntentReceiver; @@ -63,7 +62,6 @@ import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.regex.Pattern; @@ -101,7 +99,7 @@ public class PackageManagerServiceTest { @Nullable Bundle bOptions) { } - public void sendPackageAddedForNewUsers(String packageName, + public void sendPackageAddedForNewUsers(@NonNull Computer snapshot, String packageName, boolean sendBootComplete, boolean includeStopped, int appId, int[] userIds, int[] instantUserIds, int dataLoaderType) { } @@ -456,147 +454,6 @@ public class PackageManagerServiceTest { return null; } - // Return the boolean locked value. A null return means the annotation was not - // found. This method will fail if the annotation is found but is not one of the - // known constants. - private Boolean getOverride(Method m) { - final String name = "Computer." + displayName(m); - final Computer.LiveImplementation annotation = - m.getAnnotation(Computer.LiveImplementation.class); - if (annotation == null) { - return null; - } - final int override = annotation.override(); - if (override == Computer.LiveImplementation.MANDATORY) { - return true; - } else if (override == Computer.LiveImplementation.NOT_ALLOWED) { - return false; - } else { - flag(name, "invalid Live value: " + override); - return null; - } - } - - @Test - public void testComputerStructure() { - // Verify that Copmuter methods are properly annotated and that ComputerLocked is - // properly populated per annotations. - // Call PackageManagerService.validateComputer(); - Class base = Computer.class; - - HashMap methodType = new HashMap<>(); - - // Verify that all Computer methods are annotated and that the annotation - // parameter locked() is valid. - for (Method m : base.getDeclaredMethods()) { - final String name = "Computer." + displayName(m); - Boolean override = getOverride(m); - if (override == null) { - flag(name, "missing required Live annotation"); - } - methodType.put(m, override); - } - - Class coreClass = ComputerEngine.class; - final Method[] coreMethods = coreClass.getDeclaredMethods(); - - // Examine every method in the core. If it inherits from a base method it must be - // "public final" if the base is NOT_ALLOWED or "public" if the base is MANDATORY. - // If the core method does not inherit from the base then it must be either - // private or protected. - for (Method m : base.getDeclaredMethods()) { - String name = "Computer." + displayName(m); - final boolean locked = methodType.get(m); - final Method core = matchMethod(m, coreMethods); - if (core == null) { - flag(name, "not overridden in ComputerEngine"); - continue; - } - name = "ComputerEngine." + displayName(m); - final int modifiers = core.getModifiers(); - if (!locked) { - if (!isPublic(modifiers)) { - flag(name, "is not public"); - } - if (!isFinal(modifiers)) { - flag(name, "is not final"); - } - } - } - // Any methods left in the coreMethods array must be private or protected. - // Protected methods must be overridden (and final) in the live list. - Method[] coreHelpers = new Method[coreMethods.length]; - int coreIndex = 0; - for (Method m : coreMethods) { - if (m != null) { - final String name = "ComputerEngine." + displayName(m); - if (name.contains(".lambda$static")) { - // skip static lambda function - continue; - } - - final int modifiers = m.getModifiers(); - if (isPrivate(modifiers)) { - // Okay - } else if (isProtected(modifiers)) { - coreHelpers[coreIndex++] = m; - } else { - flag(name, "is neither private nor protected"); - } - } - } - - Class liveClass = ComputerLocked.class; - final Method[] liveMethods = liveClass.getDeclaredMethods(); - - // Examine every method in the live list. Every method must be final and must - // inherit either from base or core. If the method inherits from a base method - // then the base must be MANDATORY. - for (Method m : base.getDeclaredMethods()) { - String name = "Computer." + displayName(m); - final boolean locked = methodType.get(m); - final Method live = matchMethod(m, liveMethods); - if (live == null) { - if (locked) { - flag(name, "not overridden in ComputerLocked"); - } - continue; - } - if (!locked) { - flag(name, "improperly overridden in ComputerLocked"); - continue; - } - - name = "ComputerLocked." + displayName(m); - final int modifiers = live.getModifiers(); - if (!locked) { - if (!isPublic(modifiers)) { - flag(name, "is not public"); - } - if (!isFinal(modifiers)) { - flag(name, "is not final"); - } - } - } - for (Method m : coreHelpers) { - if (m == null) { - continue; - } - String name = "ComputerLocked." + displayName(m); - final Method live = matchMethod(m, liveMethods); - if (live == null) { - flag(name, "is not overridden in ComputerLocked"); - continue; - } - } - for (Method m : liveMethods) { - if (m != null) { - String name = "ComputerLocked." + displayName(m); - flag(name, "illegal local method"); - } - } - } - private static PerPackageReadTimeouts[] getPerPackageReadTimeouts(String knownDigestersList) { final String defaultTimeouts = "3600000001:3600000002:3600000003"; List result = PerPackageReadTimeouts.parseDigestersList(