Merge changes from topics "presubmit-am-3c3afa1d2a32426e9cc02b94cf882542", "presubmit-am-6f994c13a42546078af5336c840bf97f" into tm-dev
* changes:
Revert "Revert "Remove ComputerTracker and fix consistency in PackageManagerService""
Ignore SharedLibrariesImplTest
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java
index 2068e6d..68cd288 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.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 @@
@Nullable
public abstract PackageStateInternal getPackageStateInternal(@NonNull String packageName);
- public abstract @Nullable PackageState getPackageState(@NonNull String packageName);
-
@NonNull
public abstract ArrayMap<String, ? extends PackageStateInternal> getPackageStates();
diff --git a/services/core/java/com/android/server/pm/ApkChecksums.java b/services/core/java/com/android/server/pm/ApkChecksums.java
index aa467e7..2824585 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.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 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 d117967..7b2dc28 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.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 @@
}
/** 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 @@
};
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 ecbb4a9..9ff4aab 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 @@
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 @@
PackageManagerService pm = mInjector.getPackageManagerService();
ArraySet<String> packagesToOptimize;
if (packageNames == null) {
- packagesToOptimize = mDexOptHelper.getOptimizablePackages();
+ packagesToOptimize = mDexOptHelper.getOptimizablePackages(pm.snapshotComputer());
} else {
packagesToOptimize = new ArraySet<>(packageNames);
}
@@ -334,7 +335,7 @@
return false;
}
- ArraySet<String> pkgs = mDexOptHelper.getOptimizablePackages();
+ ArraySet<String> pkgs = mDexOptHelper.getOptimizablePackages(pm.snapshotComputer());
if (pkgs.isEmpty()) {
Slog.i(TAG, "No packages to optimize");
markPostBootUpdateCompleted(params);
@@ -556,8 +557,8 @@
}
/** 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 @@
Slog.d(TAG, "Should Downgrade " + shouldDowngrade);
}
if (shouldDowngrade) {
+ final Computer snapshot = pm.snapshotComputer();
Set<String> unusedPackages =
- pm.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis);
+ snapshot.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis);
if (DEBUG) {
Slog.d(TAG, "Unsused Packages " + String.join(",", unusedPackages));
}
@@ -618,7 +620,7 @@
// 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 @@
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 @@
* @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 @@
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 @@
}
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 6103d68..8e85301 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 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 @@
* 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 <code>@LiveImplementation(override =
- * MANDATORY)</code> or <code>LiveImplementation(locked = NOT_ALLOWED)</code>. 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<ResolveInfo> 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<ResolveInfo> queryIntentActivitiesInternal(Intent intent, String resolvedType,
long flags, int userId);
- @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
@NonNull List<ResolveInfo> 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<ResolveInfo> 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<CrossProfileIntentFilter> getMatchingCrossProfileIntentFilters(Intent intent,
String resolvedType, int userId);
@@ -192,15 +165,11 @@
* @param intent
* @return A filtered list of resolved activities.
*/
- @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
List<ResolveInfo> applyPostResolutionFilter(@NonNull List<ResolveInfo> 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 @@
* 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<PackageInfo> 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}.
+ * <p>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:
+ * <ul>
+ * <li>when called from a system process</li>
+ * <li>when the caller holds the permission {@code android.permission.ACCESS_INSTANT_APPS}</li>
+ * <li>when resolution occurs to start an activity with a {@code android.intent.action.VIEW}
+ * action and a {@code android.intent.category.BROWSABLE} category</li>
+ * </ul>
+ */
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 @@
* @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<ResolveInfo> 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<ResolveInfo> query, boolean debug, int userId);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
PreferredIntentResolver getPreferredActivities(@UserIdInt int userId);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
ArrayMap<String, ? extends PackageStateInternal> 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<String> 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<SharedLibraryInfo> 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<VersionedPackage> getPackagesUsingSharedLibrary(@NonNull SharedLibraryInfo libInfo,
@PackageManager.PackageInfoFlagsBits long flags, int callingUid, @UserIdInt int userId);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
ParceledListSlice<SharedLibraryInfo> 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 @@
* @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<String> 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<PackageInfo> getPackagesHoldingPermissions(@NonNull String[] permissions,
@PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
List<ApplicationInfo> 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<String> outNames,
@NonNull List<ProviderInfo> outInfo);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
ParceledListSlice<ProviderInfo> 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<InstrumentationInfo> queryInstrumentation(
@NonNull String targetPackage, int flags);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
List<PackageStateInternal> 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<IntentFilter> getAllIntentFilters(@NonNull String packageName);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
SparseArray<int[]> 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 @@
* 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 @@
* 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<ApplicationInfo> getPersistentApplications(boolean safeMode, int flags);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
SparseArray<String> getAppsWithSharedUserIds();
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
String[] getSharedUserPackagesForPackage(@NonNull String packageName, @UserIdInt int userId);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
Set<String> getUnusedPackages(long downgradeTimeThresholdMillis);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId);
@@ -638,55 +528,49 @@
*
* @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<AndroidPackage> getPackagesForAppId(int appId);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
int getUidTargetSdkVersion(int uid);
/**
* @see PackageManagerInternal#getProcessesForUid(int)
*/
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
ArrayMap<String, ProcessInfo> 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<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries();
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
Pair<PackageStateInternal, SharedUserApi> getPackageOrSharedUser(int appId);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
SharedUserApi getSharedUser(int sharedUserAppIde);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
ArraySet<PackageStateInternal> 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<String, Integer> 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 0c9855b..06e827a 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 @@
flags = updateFlagsForResolve(flags, userId, filterCallingUid, resolveForStart,
comp != null || pkgName != null /*onlyExposedExplicitly*/,
- isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType,
+ isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, resolvedType,
flags));
List<ResolveInfo> list = Collections.emptyList();
boolean skipPostResolution = false;
@@ -1722,15 +1722,6 @@
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<PackageInfo> getInstalledPackages(long flags, int userId) {
final int callingUid = Binder.getCallingUid();
if (getInstantAppPackageName(callingUid) != null) {
@@ -2468,7 +2459,7 @@
* @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 @@
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 @@
userId, queryMayBeFiltered, callingUid, isDeviceProvisioned);
}
- public final ResolveInfo findPersistentPreferredActivityLP(Intent intent,
+ public final ResolveInfo findPersistentPreferredActivity(Intent intent,
String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
List<ResolveInfo> query, boolean debug, int userId) {
final int n = query.size();
@@ -5418,7 +5409,7 @@
}
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 ResolveInfo getInstantAppInstallerInfo() {
return mInstantAppInstallerInfo;
}
+
+ @NonNull
+ @Override
+ public WatchedArrayMap<String, Integer> 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 5d89c7d..af196d5 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 @@
protected ApplicationInfo androidApplication() {
return mService.getCoreAndroidApplication();
}
-
- public @NonNull List<ResolveInfo> 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<ResolveInfo> filterCandidatesWithDomainPreferredActivitiesLPrBody(
- Intent intent, int matchFlags, List<ResolveInfo> 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<PackageInfo> 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<ResolveInfo> 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<ResolveInfo> 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<String, ? extends PackageStateInternal> getPackageStates() {
- synchronized (mLock) {
- return super.getPackageStates();
- }
- }
-
- @Nullable
- @Override
- public String getRenamedPackage(@NonNull String packageName) {
- synchronized (mLock) {
- return super.getRenamedPackage(packageName);
- }
- }
-
- @NonNull
- @Override
- public ArraySet<String> 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<SharedLibraryInfo> 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<VersionedPackage> 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<SharedLibraryInfo> 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<String> 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<PackageInfo> getPackagesHoldingPermissions(
- @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags,
- @UserIdInt int userId) {
- synchronized (mLock) {
- return super.getPackagesHoldingPermissions(permissions, flags, userId);
- }
- }
-
- @NonNull
- @Override
- public List<ApplicationInfo> 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<String> outNames,
- @NonNull List<ProviderInfo> outInfo) {
- synchronized (mLock) {
- super.querySyncProviders(safeMode, outNames, outInfo);
- }
- }
-
- @NonNull
- @Override
- public ParceledListSlice<ProviderInfo> 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<InstrumentationInfo> queryInstrumentation(
- @NonNull String targetPackage, int flags) {
- synchronized (mLock) {
- return super.queryInstrumentation(targetPackage, flags);
- }
- }
-
- @NonNull
- @Override
- public List<PackageStateInternal> 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<IntentFilter> 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<int[]> 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<ApplicationInfo> getPersistentApplications(boolean safeMode, int flags) {
- synchronized (mLock) {
- return super.getPersistentApplications(safeMode, flags);
- }
- }
-
- @NonNull
- @Override
- public SparseArray<String> 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<String> 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<AndroidPackage> 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<String, ProcessInfo> 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<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries() {
- synchronized (mLock) {
- return super.getSharedLibraries();
- }
- }
-
- @Nullable
- @Override
- public Pair<PackageStateInternal, SharedUserApi> 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<PackageStateInternal> 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 216ad71..0000000
--- 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<ResolveInfo> 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<ResolveInfo> 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<ResolveInfo> 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<ResolveInfo> 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<CrossProfileIntentFilter> getMatchingCrossProfileIntentFilters(
- Intent intent, String resolvedType, int userId) {
- ThreadComputer current = snapshot();
- try {
- return current.mComputer.getMatchingCrossProfileIntentFilters(intent, resolvedType,
- userId);
- } finally {
- current.release();
- }
- }
- public List<ResolveInfo> applyPostResolutionFilter(
- @NonNull List<ResolveInfo> 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<PackageInfo> 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<ResolveInfo> 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<ResolveInfo> 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<String, ? extends PackageStateInternal> 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<String> 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<SharedLibraryInfo> 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<VersionedPackage> 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<SharedLibraryInfo> 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<String> 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<PackageInfo> 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<ApplicationInfo> 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<String> outNames,
- @NonNull List<ProviderInfo> outInfo) {
- try (ThreadComputer current = snapshot()) {
- current.mComputer.querySyncProviders(safeMode, outNames, outInfo);
- }
- }
-
- @NonNull
- @Override
- public ParceledListSlice<ProviderInfo> 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<InstrumentationInfo> queryInstrumentation(
- @NonNull String targetPackage, int flags) {
- try (ThreadComputer current = snapshot()) {
- return current.mComputer.queryInstrumentation(targetPackage, flags);
- }
- }
-
- @NonNull
- @Override
- public List<PackageStateInternal> 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<IntentFilter> 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<int[]> 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<ApplicationInfo> getPersistentApplications(boolean safeMode, int flags) {
- try (ThreadComputer current = snapshot()) {
- return current.mComputer.getPersistentApplications(safeMode, flags);
- }
- }
-
- @NonNull
- @Override
- public SparseArray<String> 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<String> 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<AndroidPackage> 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<String, ProcessInfo> 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<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries() {
- try (ThreadComputer current = snapshot()) {
- return current.mComputer.getSharedLibraries();
- }
- }
-
- @Nullable
- @Override
- public Pair<PackageStateInternal, SharedUserApi> 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<PackageStateInternal> 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 664c7bb..0e1c1ad 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 SparseArray<TempUserState> 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 @@
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 @@
continue;
}
List<VersionedPackage> 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 @@
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 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 @@
}
// 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 @@
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 @@
});
}
- 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 @@
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 74ea7cc..50b2e23 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 @@
return;
}
+ final Computer snapshot = mPm.snapshotComputer();
List<PackageStateInternal> pkgSettings =
- getPackagesForDexopt(mPm.getPackageStates().values(), mPm);
+ getPackagesForDexopt(snapshot.getPackageStates().values(), mPm);
List<AndroidPackage> pkgs = new ArrayList<>(pkgSettings.size());
for (int index = 0; index < pkgSettings.size(); index++) {
@@ -282,17 +283,19 @@
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<String> getOptimizablePackages() {
+ public ArraySet<String> getOptimizablePackages(@NonNull Computer snapshot) {
ArraySet<String> 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 @@
}
/*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 @@
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 @@
ArrayList<PackageStateInternal> 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<String> 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 @@
// 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 @@
// 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<PackageStateInternal> filter,
Collection<PackageStateInternal> result,
Collection<PackageStateInternal> packages,
@@ -568,8 +573,7 @@
for (PackageStateInternal pkgSetting : sortTemp) {
result.add(pkgSetting);
- List<PackageStateInternal> deps =
- packageManagerService.findSharedNonSystemLibraries(pkgSetting);
+ List<PackageStateInternal> 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 db8c6dc..20e4dd8 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 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 @@
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 @@
@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 @@
@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 05ef3c4..f83ef5a 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 @@
@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<String> permissionNames = null;
@@ -121,7 +122,7 @@
}
// 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 @@
// 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 @@
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 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 @@
ipw.decreaseIndent();
}
- final Computer snapshot = mPm.snapshotComputer();
-
if (dumpState.isDumping(DumpState.DUMP_VERIFIERS)
&& packageName == null) {
final String requiredVerifierPackage = mPm.mRequiredVerifierPackage;
@@ -343,7 +342,7 @@
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 @@
}
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 @@
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 @@
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 @@
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 0000000..e1aee6d
--- /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<IntentFilter> getAllIntentFilters(@NonNull String packageName) {
+ return snapshot().getAllIntentFilters(packageName);
+ }
+
+ @Override
+ @Deprecated
+ public final List<String> 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<SharedLibraryInfo> 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<ResolveInfo> 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<ApplicationInfo> 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<ModuleInfo> getInstalledModules(int flags) {
+ return mModuleInfoProvider.getInstalledModules(flags);
+ }
+
+ @Override
+ @Deprecated
+ public final ParceledListSlice<PackageInfo> 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<IntentFilterVerificationInfo>
+ 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);
+ }
+
+ /**
+ * <em>IMPORTANT:</em> Not all packages returned by this method may be known
+ * to the system. There are two conditions in which this may occur:
+ * <ol>
+ * <li>The package is on adoptable storage and the device has been removed</li>
+ * <li>The package is being removed and the internal structures are partially updated</li>
+ * </ol>
+ * 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<PackageInfo> 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<ApplicationInfo> 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<IntentFilter> outFilters,
+ List<ComponentName> 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<SharedLibraryInfo> 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.
+ * <p>
+ * 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.
+ * <p>
+ * 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<ResolveInfo> 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<ProviderInfo> 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<InstrumentationInfo> queryInstrumentation(
+ @NonNull String targetPackage, int flags) {
+ return snapshot().queryInstrumentation(targetPackage, flags);
+ }
+
+ @Override
+ @Deprecated
+ public final @NonNull
+ ParceledListSlice<ResolveInfo> 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<ResolveInfo> 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<ResolveInfo> 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<ResolveInfo> 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<String> outNames, List<ProviderInfo> 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<String> 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 fa11924..703bbda 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 @@
@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 8d77624..91750de 100644
--- a/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java
@@ -171,7 +171,7 @@
}
}
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 8667ffd..b39b24f 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 @@
+ 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 @@
// 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 @@
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 @@
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 @@
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 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 @@
// 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 SparseArray<int[]> 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 @@
}
} 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 0ffc1ed..230f555 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.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 @@
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<String, ModuleInfo> mModuleInfo;
@@ -66,9 +68,8 @@
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 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 @@
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 @@
List<PackageInfo> 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 5fc90b1..c5ca06c 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.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 @@
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 bd00914..cc4a760 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 @@
Predicate<PackageStateInternal> 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<? extends PackageStateInternal> 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 @@
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 6613f01..4e702e2 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
? 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 @@
}
}
}
- 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<SessionInfo> 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<SessionInfo> result = new ArrayList<>();
synchronized (mSessions) {
@@ -1090,15 +1092,16 @@
}
}
}
- result.removeIf(info -> shouldFilterSession(callingUid, info));
+ result.removeIf(info -> shouldFilterSession(snapshot, callingUid, info));
return new ParceledListSlice<>(result);
}
@Override
public ParceledListSlice<SessionInfo> 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<SessionInfo> result = new ArrayList<>();
synchronized (mSessions) {
@@ -1120,8 +1123,9 @@
@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 @@
.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 @@
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 @@
@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 @@
}
}
- 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 @@
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 bcda046..68be64f 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -860,7 +860,8 @@
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;
}
@@ -3755,7 +3756,8 @@
};
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 0000000..2b73375
--- /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<ApplicationInfo> 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<AndroidPackage> 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<String, ? extends PackageStateInternal> 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<String> 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<ResolveInfo> 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<ResolveInfo> 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<ResolveInfo> 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<ResolveInfo> 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<String> 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<String> 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<String, ProcessInfo> 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<PackageSetting> actionLocked) {
+ mService.forEachPackageSetting(actionLocked);
+ }
+
+ @Override
+ @Deprecated
+ public final void forEachPackageState(Consumer<PackageStateInternal> action) {
+ mService.forEachPackageState(snapshot(), action);
+ }
+
+ @Override
+ @Deprecated
+ public final void forEachPackage(Consumer<AndroidPackage> action) {
+ mService.forEachPackage(snapshot(), action);
+ }
+
+ @Override
+ @Deprecated
+ public final void forEachInstalledPackage(@NonNull Consumer<AndroidPackage> action,
+ @UserIdInt int userId) {
+ mService.forEachInstalledPackage(snapshot(), action, userId);
+ }
+
+ @Override
+ @Deprecated
+ public final ArraySet<String> 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<String> 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<String> 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<String> 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<PackageStateInternal> 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<PackageStateMutator> 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 e20a861..99c9c68 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_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.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.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.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.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.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 @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 @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 <b>not</b> 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 <b>not</b> 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 <b>not</b> 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 <b>not</b> 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 <b>not</b> 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 <b>not</b> 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 <b>not</b> 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 <b>not</b> 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 @@
*/
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 @@
// 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 @@
* 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 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 @@
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 @@
@Override
public boolean hasFeature(String feature) {
- return PackageManagerService.this.mIPackageManager.hasSystemFeature(feature, 0);
+ return PackageManagerService.this.hasSystemFeature(feature, 0);
}
};
@@ -1885,9 +1868,10 @@
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 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
}
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 @@
// scanning).
final Map<Integer, List<PackageInfo>> 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 @@
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 @@
// CHECKSTYLE:ON IndentationCheck
mModuleInfoProvider = mInjector.getModuleInfoProvider();
+
mInjector.getSystemWrapper().enablePackageCaches();
// Now after opening every single application zip, make sure they
@@ -2281,8 +2274,9 @@
}
@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 @@
}
@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 @@
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 @@
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 @@
}
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 @@
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 @@
| MATCH_DIRECT_BOOT_UNAWARE
| (!Build.IS_DEBUGGABLE ? MATCH_SYSTEM_ONLY : 0);
final Intent resolverIntent = new Intent(Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE);
- List<ResolveInfo> resolvers = queryIntentServicesInternal(resolverIntent, null,
+ List<ResolveInfo> resolvers = snapshot.queryIntentServicesInternal(resolverIntent, null,
resolveFlags, UserHandle.USER_SYSTEM, callingUid, false /*includeInstantApps*/);
final int N = resolvers.size();
if (N == 0) {
@@ -2519,7 +2513,7 @@
Iterator<ResolveInfo> 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 @@
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.
- * <p>
- * Currently, there are four cases in which this can occur:
- * <ol>
- * <li>The calling application is a "special" process. Special processes
- * are those with a UID < {@link Process#FIRST_APPLICATION_UID}.</li>
- * <li>The calling application has the permission
- * {@link android.Manifest.permission#ACCESS_INSTANT_APPS}.</li>
- * <li>The calling application is the default launcher on the
- * system partition.</li>
- * <li>The calling application is the default app prediction service.</li>
- * </ol>
- */
- 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
@@ -2600,19 +2552,6 @@
}
/**
- * 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.
*/
public void freeAllAppCacheAboveQuota(String volumeUuid) throws IOException {
@@ -2648,7 +2587,7 @@
// 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 @@
return recommendedInstallLocation;
}
- /**
- * Update given flags when being used to request {@link ResolveInfo}.
- * <p>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:
- * <ul>
- * <li>when called from a system process</li>
- * <li>when the caller holds the permission {@code android.permission.ACCESS_INSTANT_APPS}</li>
- * <li>when resolution occurs to start an activity with a {@code android.intent.action.VIEW}
- * action and a {@code android.intent.category.BROWSABLE} category</li>
- * </ul>
- */
- 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<VersionedPackage> 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 @@
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 @@
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<ResolveInfo> 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 @@
ResolveInfo mPreferredResolveInfo;
}
- FindPreferredActivityBodyResult findPreferredActivityInternal(
- Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
- List<ResolveInfo> 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<ResolveInfo> queryIntentReceivers(@NonNull Computer snapshot,
Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
@UserIdInt int userId) {
@@ -2909,24 +2768,6 @@
snapshot, intent, resolvedType, flags, userId, Binder.getCallingUid()));
}
- @NonNull List<ResolveInfo> 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 @@
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:
- * <ul>
- * <li>INTERACT_ACROSS_USERS_FULL if {@code requireFullPermission} is true.</li>
- * <li>INTERACT_ACROSS_USERS if the given {@code userId} is in a different profile group
- * to the caller.</li>
- * <li>Otherwise, INTERACT_ACROSS_PROFILES if the given {@code userId} is in the same profile
- * group as the caller.</li>
- * </ul>
- *
- * @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 @@
return mDexManager;
}
- @NonNull
- List<PackageStateInternal> 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 @@
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 @@
}
@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<int[]> 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 @@
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 @@
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 @@
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 @@
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 @@
* @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<String> 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 @@
}
}
- 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 @@
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 @@
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 @@
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 @@
} else {
flags = 0;
}
- mAppDataHelper.prepareAppDataContentsLIF(pkg, getPackageStateInternal(packageName), userId,
- flags);
+ mAppDataHelper.prepareAppDataContentsLIF(pkg, snapshot.getPackageStateInternal(packageName),
+ userId, flags);
return true;
}
@@ -3538,10 +3325,6 @@
}
}
- int getUidTargetSdkVersion(int uid) {
- return mComputer.getUidTargetSdkVersion(uid);
- }
-
void postPreferredActivityChangedBroadcast(int userId) {
mHandler.post(() -> mBroadcastHelper.sendPreferredActivityChangedBroadcast(userId));
}
@@ -3562,18 +3345,19 @@
// 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 @@
}
// 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 @@
}
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<ResolveInfo> 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 @@
}
}
- private @NonNull String getRequiredSdkSandboxPackageName() {
+ @NonNull
+ private static String getRequiredSdkSandboxPackageName(@NonNull Computer computer) {
final Intent intent = new Intent(SdkSandboxManagerLocal.SERVICE_INTERFACE);
- final List<ResolveInfo> matches = queryIntentServicesInternal(
+ final List<ResolveInfo> matches = computer.queryIntentServicesInternal(
intent,
/* resolvedType= */ null,
MATCH_SYSTEM_ONLY | MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE,
@@ -3701,22 +3470,6 @@
}
@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);
final String predefinedSignature = mContext.getString(
@@ -3752,14 +3505,7 @@
}
@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 @@
}
@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 @@
private void setEnabledSettings(List<ComponentEnabledSetting> 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 @@
final Map<String, PackageSetting> 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 @@
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 @@
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<String> 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 @@
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 @@
}
}
- void sendPackageChangedBroadcast(String packageName,
+ void sendPackageChangedBroadcast(@NonNull Computer snapshot, String packageName,
boolean dontKillApp, ArrayList<String> 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<int[]> broadcastAllowList = getBroadcastAllowList(
+ final SparseArray<int[]> broadcastAllowList = snapshot.getBroadcastAllowList(
packageName, userIds, isInstantApp);
mHandler.post(() -> mBroadcastHelper.sendPackageChangedBroadcast(
packageName, dontKillApp, componentNames, packageUid, reason, userIds,
instantUserIds, broadcastAllowList));
}
- @Nullable
- private SparseArray<int[]> getBroadcastAllowList(@NonNull String packageName,
- @UserIdInt int[] userIds, boolean isInstantApp) {
- return mComputer.getBroadcastAllowList(packageName, userIds, isInstantApp);
- }
-
/**
* Used by SystemServer
*/
@@ -4296,7 +4042,7 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
mPermissionManager.writeLegacyPermissionStateTEMP();
mSettings.readPermissionStateForUserSyncLPr(userId);
mPermissionManager.readLegacyPermissionStateTEMP();
- return mPmInternal.isPermissionUpgradeNeeded(userId);
+ return mSettings.isPermissionUpgradeNeeded(userId);
}
}
@@ -4544,12 +4284,8 @@
}
}
- 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 @@
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 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 @@
.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 @@
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 @@
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 @@
}
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 @@
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 @@
}
@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 @@
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 @@
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,
@@ -4968,47 +4680,18 @@
}
@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 @@
});
}
- @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,
@@ -5150,83 +4812,17 @@
}
@Override
- public ActivityInfo getActivityInfo(ComponentName component,
- @PackageManager.ComponentInfoFlagsBits long flags, int userId) {
- return mComputer.getActivityInfo(component, flags, userId);
- }
-
- @NonNull
- @Override
- public ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName) {
- return mComputer.getAllIntentFilters(packageName);
- }
-
- @Override
- public List<String> 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 @@
final List<String> 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);
}
}
@@ -5245,41 +4842,6 @@
}
@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<SharedLibraryInfo> 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) {
throw new SecurityException("Only the system may call getDomainVerificationBackup()");
@@ -5301,17 +4863,6 @@
}
@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) {
throw new SecurityException("getHoldLockToken requires a debuggable build");
@@ -5327,72 +4878,15 @@
}
@Override
- public ComponentName getHomeActivities(List<ResolveInfo> 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<ApplicationInfo> getInstalledApplications(
- @PackageManager.ApplicationInfoFlagsBits long flags, int userId) {
- final int callingUid = Binder.getCallingUid();
- return new ParceledListSlice<>(
- mComputer.getInstalledApplications(flags, userId, callingUid));
- }
-
- @Override
- public List<ModuleInfo> getInstalledModules(int flags) {
- return mModuleInfoProvider.getInstalledModules(flags);
- }
-
- @Override
- public ParceledListSlice<PackageInfo> 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 @@
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,11 +4918,12 @@
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");
@@ -5435,76 +4931,31 @@
}
@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<InstantAppInfo> 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<InstantAppInfo> instantApps = mInstantAppRegistry.getInstantApps(computer, userId);
+ List<InstantAppInfo> 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<IntentFilterVerificationInfo> 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 @@
@Override
public List<String> 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 @@
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);
- }
-
- /**
- * <em>IMPORTANT:</em> Not all packages returned by this method may be known
- * to the system. There are two conditions in which this may occur:
- * <ol>
- * <li>The package is on adoptable storage and the device has been removed</li>
- * <li>The package is being removed and the internal structures are partially updated</li>
- * </ol>
- * 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<PackageInfo> 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 @@
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<ApplicationInfo> getPersistentApplications(int flags) {
- if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
- return ParceledListSlice.emptyList();
- }
- return new ParceledListSlice<>(mComputer.getPersistentApplications(mSafeMode, flags));
- }
-
- @Override
- public int getPreferredActivities(List<IntentFilter> outFilters,
- List<ComponentName> 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 @@
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<SharedLibraryInfo> 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
@@ -5785,34 +5037,6 @@
}
@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");
mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS,
@@ -5838,18 +5062,6 @@
}
@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();
final int recipientUserId = UserHandle.getUserId(recipientUid);
@@ -5864,38 +5076,6 @@
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);
@@ -5924,55 +5104,17 @@
}
@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.");
}
@@ -5981,11 +5123,6 @@
}
@Override
- public boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId) {
- return mComputer.isPackageSuspendedForUser(packageName, userId);
- }
-
- @Override
public boolean isProtectedBroadcast(String actionName) {
if (actionName != null) {
// TODO: remove these terrible hacks
@@ -6002,22 +5139,6 @@
}
}
- @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 @@
@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 @@
}
@Override
- public void notifyDexLoad(String loadingPackageName, Map<String, String> classLoaderContextMap,
+ public void notifyDexLoad(String loadingPackageName,
+ Map<String, String> 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 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 @@
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<ProviderInfo> queryContentProviders(@Nullable String processName,
- int uid, @PackageManager.ComponentInfoFlagsBits long flags,
- @Nullable String metaDataKey) {
- return mComputer.queryContentProviders(processName, uid, flags, metaDataKey);
- }
-
- @NonNull
- @Override
- public ParceledListSlice<InstrumentationInfo> queryInstrumentation(
- @NonNull String targetPackage, int flags) {
- return mComputer.queryInstrumentation(targetPackage, flags);
- }
-
- @Override
- public @NonNull ParceledListSlice<ResolveInfo> 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<ResolveInfo> 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<ResolveInfo> 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<ResolveInfo> 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<ResolveInfo> 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<PackageManager.Property> 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<PackageManager.Property> 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 @@
return new ParceledListSlice<>(result);
}
- @Deprecated
- public void querySyncProviders(List<String> outNames, List<ProviderInfo> 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 @@
*/
@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 @@
}
@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 @@
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 @@
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) {
@@ -6366,11 +5365,6 @@
}
@Override
- public void restorePreferredActivities(byte[] backup, int userId) {
- mPreferredActivityHelper.restorePreferredActivities(backup, userId);
- }
-
- @Override
public void sendDeviceCustomizationReadyBroadcast() {
mContext.enforceCallingPermission(Manifest.permission.SEND_DEVICE_CUSTOMIZATION_READY,
"sendDeviceCustomizationReadyBroadcast");
@@ -6386,16 +5380,17 @@
@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<Computer, PackageStateMutator.Result>
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 @@
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 @@
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 @@
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 @@
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 @@
+ 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 @@
final List<String> unactionedPackages = new ArrayList<>(packageNames.length);
ArraySet<String> 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 @@
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.");
}
@@ -6667,11 +5670,6 @@
}
@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,
null);
@@ -6693,24 +5691,24 @@
final int callingUid = Binder.getCallingUid();
final int callingUserId = UserHandle.getUserId(callingUid);
final FunctionalUtils.ThrowingCheckedFunction<Computer, Boolean, RuntimeException>
- 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 @@
Signature[] callerSignature;
final int appId = UserHandle.getAppId(callingUid);
Pair<PackageStateInternal, SharedUserApi> either =
- computer.getPackageOrSharedUser(appId);
+ snapshot.getPackageOrSharedUser(appId);
if (either != null) {
if (either.first != null) {
callerSignature = either.first.getSigningDetails().getSignatures();
@@ -6748,7 +5746,7 @@
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 @@
}
}
}
- targetPackageState = getPackageStateInternal(targetPackage);
+ targetPackageState = snapshotComputer().getPackageStateInternal(targetPackage);
mSettings.addInstallerPackageNames(targetPackageState.getInstallSource());
}
mAppsFilter.addPackage(targetPackageState);
@@ -6818,14 +5816,15 @@
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 @@
"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<String> 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<String> existingMimeTypes = packageState.getMimeGroups().get(mimeGroup);
if (existingMimeTypes == null) {
throw new IllegalArgumentException("Unknown MIME group " + mimeGroup
@@ -6889,11 +5882,11 @@
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 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;
}
@@ -6939,80 +5933,6 @@
}
@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);
commitPackageStateMutation(null, packageName, state ->
@@ -7026,19 +5946,6 @@
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<String> 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 @@
@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
@@ -7074,12 +5981,6 @@
}
@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 {
try {
@@ -7097,8 +5998,8 @@
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 @@
private class PackageManagerLocalImpl implements PackageManagerLocal {
}
- private class PackageManagerInternalImpl extends PackageManagerInternal {
+ private class PackageManagerInternalImpl extends PackageManagerInternalBase {
+
+ public PackageManagerInternalImpl() {
+ super(PackageManagerService.this);
+ }
+
+ @NonNull
@Override
- public List<ApplicationInfo> 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 @@
@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 @@
@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 @@
@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<AndroidPackage> 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<String, ? extends PackageStateInternal> getPackageStates() {
- return PackageManagerService.this.getPackageStates();
}
@Override
public PackageList getPackageList(@Nullable PackageListObserver observer) {
final ArrayList<String> list = new ArrayList<>();
- forEachPackageState(packageState -> {
+ PackageManagerService.this.forEachPackageState(snapshot(), packageState -> {
AndroidPackage pkg = packageState.getPkg();
if (pkg != null) {
list.add(pkg.getPackageName());
@@ -7263,19 +6147,9 @@
}
@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();
@@ -7283,51 +6157,15 @@
}
@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<String> 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 {
@@ -7336,18 +6174,6 @@
}
@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();
final String[] allPackages = computer.getAllAvailablePackageNames();
@@ -7357,14 +6183,6 @@
}
@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) {
PackageManagerService.this.flushPackageRestrictionsAsUserInternalLocked(userId);
@@ -7372,103 +6190,6 @@
}
@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<ResolveInfo> queryIntentActivities(
- Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
- int filterCallingUid, int userId) {
- return snapshotComputer().queryIntentActivitiesInternal(intent, resolvedType, flags,
- userId);
- }
-
- @Override
- public List<ResolveInfo> 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<ResolveInfo> 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<ResolveInfo> 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,
SparseArray<String> profileOwnerPackages) {
@@ -7487,118 +6208,6 @@
}
@Override
- public void setDeviceOwnerProtectedPackages(
- String deviceOwnerPackageName, List<String> 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<PackageInfo> apexPackages) {
if (mCacheDir == null) {
return;
@@ -7606,11 +6215,12 @@
final PackageCacher cacher = new PackageCacher(mCacheDir);
synchronized (mLock) {
+ final Computer snapshot = snapshot();
for (int i = 0, size = apexPackages.size(); i < size; i++) {
final List<String> 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 @@
}
@Override
- public String getSetupWizardPackageName() {
- return mSetupWizardPackage;
- }
-
public void setExternalSourcesPolicy(ExternalSourcesPolicy policy) {
if (policy != null) {
mExternalSourcesPolicy = policy;
@@ -7630,7 +6236,8 @@
@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 @@
@Override
public List<PackageInfo> getOverlayPackages(int userId) {
+ final Computer snapshot = snapshotComputer();
final ArrayList<PackageInfo> overlayPackages = new ArrayList<>();
- forEachPackageState(packageState -> {
+ final ArrayMap<String, ? extends PackageStateInternal> 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 @@
@Override
public List<String> getTargetPackageNames(int userId) {
List<String> targetPackages = new ArrayList<>();
- forEachPackageState(packageState -> {
+ PackageManagerService.this.forEachPackageState(snapshot(), packageState -> {
final AndroidPackage pkg = packageState.getPkg();
if (pkg != null && !pkg.isOverlay()) {
targetPackages.add(pkg.getPackageName());
@@ -7676,30 +6287,6 @@
}
@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) {
mIsolatedOwners.put(isolatedUid, ownerUid);
@@ -7714,146 +6301,12 @@
}
@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) {
PackageManagerService.this.notifyPackageUseInternal(packageName, reason);
}
}
- @Override
- public void onPackageProcessKilledForUninstall(String packageName) {
- mHandler.post(() -> PackageManagerService.this.notifyInstallObserver(packageName,
- true /* killApp */));
- }
-
- @Override
- public SparseArray<String> getAppsWithSharedUserIds() {
- return mComputer.getAppsWithSharedUserIds();
- }
-
- @Override
- @NonNull
- public String[] getSharedUserPackagesForPackage(String packageName, int userId) {
- return mComputer.getSharedUserPackagesForPackage(packageName, userId);
- }
-
- @Override
- public ArrayMap<String, ProcessInfo> 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<PackageSetting> actionLocked) {
- PackageManagerService.this.forEachPackageSetting(actionLocked);
- }
-
- @Override
- public void forEachPackageState(Consumer<PackageStateInternal> action) {
- PackageManagerService.this.forEachPackageState(action);
- }
-
- @Override
- public void forEachPackage(Consumer<AndroidPackage> action) {
- PackageManagerService.this.forEachPackage(action);
- }
-
- @Override
- public void forEachInstalledPackage(@NonNull Consumer<AndroidPackage> action,
- @UserIdInt int userId) {
- PackageManagerService.this.forEachInstalledPackage(action, userId);
- }
-
- @Override
- public ArraySet<String> getEnabledComponents(String packageName, int userId) {
- final PackageStateInternal packageState = getPackageStateInternal(packageName);
- if (packageState == null) {
- return new ArraySet<>();
- }
- return packageState.getUserStateOrDefault(userId).getEnabledComponents();
- }
-
- @Override
- public ArraySet<String> 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 @@
return mArtManagerService.compileLayouts(pkg);
}
- @Override
- public void finishPackageInstall(int token, boolean didLaunch) {
- mIPackageManager.finishPackageInstall(token, didLaunch);
- }
-
@Nullable
@Override
public String removeLegacyDefaultBrowserPackageName(int userId) {
@@ -7883,16 +6331,6 @@
}
@Override
- public boolean isApexPackage(String packageName) {
- return PackageManagerService.this.mApexManager.isApexPackage(packageName);
- }
-
- @Override
- public List<String> getApksInApex(String apexPackageName) {
- return PackageManagerService.this.mApexManager.getApksInApex(apexPackageName);
- }
-
- @Override
public void uninstallApex(String packageName, long versionCode, int userId,
IntentSender intentSender, int flags) {
final int callerUid = Binder.getCallingUid();
@@ -7967,11 +6405,6 @@
}
@Override
- public boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) {
- return mComputer.isCallerInstallerOfRecord(pkg, callingUid);
- }
-
- @Override
public boolean isPermissionUpgradeNeeded(int userId) {
return mSettings.isPermissionUpgradeNeeded(userId);
}
@@ -7985,13 +6418,9 @@
}
@Override
- public List<String> 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);
}
@@ -7999,12 +6428,6 @@
}
@Override
- public boolean isSystemPackage(@NonNull String packageName) {
- return packageName.equals(
- PackageManagerService.this.ensureSystemPackageName(packageName));
- }
-
- @Override
public void clearBlockUninstallForUser(@UserIdInt int userId) {
synchronized (mLock) {
mSettings.clearBlockUninstallLPw(userId);
@@ -8013,21 +6436,11 @@
}
@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 @@
@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 @@
}
@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<PackageStateInternal> 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<PackageStateMutator> 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 @@
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 @@
}
}
- @Nullable
- private PackageState getPackageState(String packageName) {
- return mComputer.getPackageStateCopied(packageName);
- }
-
- @NonNull
- ArrayMap<String, ? extends PackageStateInternal> getPackageStates() {
- Computer computer = snapshotComputer();
- if (computer == mLiveComputer) {
- return new ArrayMap<>(computer.getPackageStates());
- } else {
- return computer.getPackageStates();
- }
- }
-
- private void forEachPackageSetting(Consumer<PackageSetting> actionLocked) {
+ @Deprecated
+ void forEachPackageSetting(Consumer<PackageSetting> actionLocked) {
synchronized (mLock) {
int size = mSettings.getPackagesLocked().size();
for (int index = 0; index < size; index++) {
@@ -8296,13 +6627,13 @@
}
}
- void forEachPackageState(Consumer<PackageStateInternal> consumer) {
- forEachPackageState(mComputer.getPackageStates(), consumer);
+ void forEachPackageState(@NonNull Computer snapshot, Consumer<PackageStateInternal> consumer) {
+ forEachPackageState(snapshot.getPackageStates(), consumer);
}
- void forEachPackage(Consumer<AndroidPackage> consumer) {
+ void forEachPackage(@NonNull Computer snapshot, Consumer<AndroidPackage> consumer) {
final ArrayMap<String, ? extends PackageStateInternal> 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 @@
}
}
- void forEachInstalledPackage(@NonNull Consumer<AndroidPackage> action,
+ void forEachInstalledPackage(@NonNull Computer snapshot, @NonNull Consumer<AndroidPackage> action,
@UserIdInt int userId) {
Consumer<PackageStateInternal> actionWrapped = packageState -> {
if (packageState.getPkg() != null
@@ -8330,7 +6661,7 @@
action.accept(packageState.getPkg());
}
};
- forEachPackageState(mComputer.getPackageStates(), actionWrapped);
+ forEachPackageState(snapshot.getPackageStates(), actionWrapped);
}
boolean isHistoricalPackageUsageAvailable() {
@@ -8345,15 +6676,7 @@
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 @@
}
}
- 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 @@
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 @@
ArtUtils.createArtPackageInfo(packageState.getPkg(), packageState));
}
- @NonNull
- Set<String> getUnusedPackages(long downgradeTimeThresholdMillis) {
- return mComputer.getUnusedPackages(downgradeTimeThresholdMillis);
- }
-
- private List<String> getMimeGroupInternal(String packageName, String mimeGroup) {
- final PackageStateInternal packageState = getPackageStateInternal(packageName);
+ List<String> getMimeGroupInternal(@NonNull Computer snapshot, String packageName,
+ String mimeGroup) {
+ final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
if (packageState == null) {
return Collections.emptyList();
}
@@ -8473,16 +6792,16 @@
* 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> perPackageReadTimeouts =
@@ -8496,7 +6815,8 @@
final List<PerUidReadTimeouts> 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 @@
return result.toArray(new PerUidReadTimeouts[result.size()]);
}
- private void setKeepUninstalledPackagesInternal(List<String> packageList) {
+ void setKeepUninstalledPackagesInternal(@NonNull Computer snapshot, List<String> packageList) {
Preconditions.checkNotNull(packageList);
synchronized (mKeepUninstalledPackages) {
List<String> toRemove = new ArrayList<>(mKeepUninstalledPackages);
@@ -8556,7 +6876,7 @@
mKeepUninstalledPackages.addAll(packageList);
for (int i = 0; i < toRemove.size(); i++) {
- deletePackageIfUnused(toRemove.get(i));
+ deletePackageIfUnused(snapshot, toRemove.get(i));
}
}
}
@@ -8603,43 +6923,44 @@
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 @@
mDefaultAppProvider.setDefaultBrowser(packageName, async, userId);
}
- ResolveInfo getInstantAppInstallerInfo() {
- return mInstantAppInstallerInfo;
- }
-
PackageUsage getPackageUsage() {
return mPackageUsage;
}
@@ -8754,10 +7071,6 @@
}
}
- 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 d380098..656d596 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 @@
Bundle extras, int flags, String targetPkg,
IIntentReceiver finishedReceiver, int[] userIds, int[] instantUserIds,
@Nullable SparseArray<int[]> 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 7253ae4..9befd6e 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.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 @@
mPm = pm;
}
- private ResolveInfo findPreferredActivityNotLocked(Intent intent, String resolvedType,
- @PackageManager.ResolveInfoFlagsBits long flags, List<ResolveInfo> 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<ResolveInfo> 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
/** <b>must not hold {@link PackageManagerService.mLock}</b> */
- public ResolveInfo findPreferredActivityNotLocked(
+ public ResolveInfo findPreferredActivityNotLocked(@NonNull Computer snapshot,
Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
List<ResolveInfo> query, boolean always, boolean removeMatches, boolean debug,
int userId, boolean queryMayBeFiltered) {
@@ -95,7 +97,7 @@
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 @@
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 @@
*
* @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 @@
// before that.
return false;
}
- final Intent intent = mPm.getHomeIntent();
- final List<ResolveInfo> resolveInfos = mPm.snapshotComputer().queryIntentActivitiesInternal(
+ final Intent intent = snapshot.getHomeIntent();
+ final List<ResolveInfo> 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 @@
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 @@
/**
* 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 @@
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 @@
/**
* 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 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 @@
}
}
}
- 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 @@
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 @@
}
/** <b>must not hold {@link #PackageManagerService.mLock}</b> */
- 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<ResolveInfo> homeActivities = new ArrayList<>();
- mPm.getHomeActivitiesAsUser(homeActivities, userId);
+ snapshot.getHomeActivitiesAsUser(homeActivities, userId);
boolean found = false;
@@ -364,7 +367,7 @@
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 @@
mPm.scheduleWritePackageRestrictions(userId);
}
if (isHomeFilter(filter)) {
- updateDefaultHomeNotLocked(userId);
+ updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId);
}
mPm.postPreferredActivityChangedBroadcast(userId);
}
@@ -417,7 +420,7 @@
changed = mPm.mSettings.clearPackagePersistentPreferredActivities(packageName, userId);
}
if (changed) {
- updateDefaultHomeNotLocked(userId);
+ updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId);
mPm.postPreferredActivityChangedBroadcast(userId);
mPm.scheduleWritePackageRestrictions(userId);
}
@@ -506,7 +509,7 @@
synchronized (mPm.mLock) {
mPm.mSettings.readPreferredActivitiesLPw(readParser, readUserId);
}
- updateDefaultHomeNotLocked(readUserId);
+ updateDefaultHomeNotLocked(mPm.snapshotComputer(), readUserId);
});
} catch (Exception e) {
if (DEBUG_BACKUP) {
@@ -598,7 +601,7 @@
mPm.mPermissionManager.resetRuntimePermissions(pkg, userId);
}
}
- updateDefaultHomeNotLocked(userId);
+ updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId);
resetNetworkPolicies(userId);
mPm.scheduleWritePackageRestrictions(userId);
} finally {
@@ -610,12 +613,11 @@
mPm.mInjector.getLocalService(NetworkPolicyManagerInternal.class).resetUserState(userId);
}
- // TODO: This method should not touch the Computer directly
- public int getPreferredActivities(List<IntentFilter> outFilters,
- List<ComponentName> outActivities, String packageName, Computer computer) {
+ public int getPreferredActivities(@NonNull Computer snapshot, List<IntentFilter> outFilters,
+ List<ComponentName> outActivities, String packageName) {
List<WatchedIntentFilter> 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 @@
/**
* Variant that takes a {@link WatchedIntentFilter}
*/
- private int getPreferredActivitiesInternal(List<WatchedIntentFilter> outFilters,
- List<ComponentName> outActivities, String packageName, Computer computer) {
+ private int getPreferredActivitiesInternal(@NonNull Computer snapshot,
+ List<WatchedIntentFilter> outFilters, List<ComponentName> 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<PreferredActivity> it = pir.filterIterator();
while (it.hasNext()) {
@@ -643,8 +646,9 @@
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 @@
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 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<ResolveInfo> query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent,
+ final List<ResolveInfo> 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 @@
filter.dump(new PrintStreamPrinter(System.out), " ");
}
intent.setComponent(null);
- final List<ResolveInfo> query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent,
+ final List<ResolveInfo> 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<ResolveInfo> query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent,
+ final List<ResolveInfo> 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 4ec042f..2a1ca2c 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 @@
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 @@
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 @@
mSetPackages = myPackages;
mSetClasses = myClasses;
mSetComponents = myComponents;
- final PackageManagerInternal packageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
- mSetupWizardPackageName = packageManagerInternal.getSetupWizardPackageName();
}
public String getParseError() {
@@ -209,6 +205,7 @@
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<NQ; i++) {
ResolveInfo ri = query.get(i);
@@ -217,7 +214,7 @@
// ignore SetupWizard package's launcher capability because it is only existed
// during SetupWizard is running
- if (excludeSetupWizardPackage && ai.packageName.equals(mSetupWizardPackageName)) {
+ if (excludeSetupWizardPackage && ai.packageName.equals(setupWizardPackageName)) {
continue;
}
@@ -307,6 +304,8 @@
if (!excludeSetupWizardPackage && NS < NQ) {
return false;
}
+ final PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
+ String setupWizardPackageName = pmi.getSetupWizardPackageName();
for (int i=0; i<NQ; i++) {
ResolveInfo ri = query.get(i);
ActivityInfo ai = ri.activityInfo;
@@ -314,7 +313,7 @@
// ignore SetupWizard package's launcher capability because it is only existed
// during SetupWizard is running
- if (excludeSetupWizardPackage && ai.packageName.equals(mSetupWizardPackageName)) {
+ if (excludeSetupWizardPackage && ai.packageName.equals(setupWizardPackageName)) {
continue;
}
diff --git a/services/core/java/com/android/server/pm/RemovePackageHelper.java b/services/core/java/com/android/server/pm/RemovePackageHelper.java
index 88df843..b181cdd 100644
--- a/services/core/java/com/android/server/pm/RemovePackageHelper.java
+++ b/services/core/java/com/android/server/pm/RemovePackageHelper.java
@@ -118,7 +118,8 @@
public void removePackageLI(AndroidPackage pkg, boolean chatty) {
// Remove the parent package setting
- PackageStateInternal ps = mPm.getPackageStateInternal(pkg.getPackageName());
+ PackageStateInternal ps = mPm.snapshotComputer()
+ .getPackageStateInternal(pkg.getPackageName());
if (ps != null) {
removePackageLI(ps.getPackageName(), chatty);
} else if (DEBUG_REMOVE && chatty) {
@@ -271,8 +272,8 @@
synchronized (mPm.mLock) {
mPm.mDomainVerificationManager.clearPackage(deletedPs.getPackageName());
mPm.mSettings.getKeySetManagerService().removeAppKeySetDataLPw(packageName);
- mPm.mAppsFilter.removePackage(mPm.getPackageStateInternal(packageName),
- false /* isReplace */);
+ mPm.mAppsFilter.removePackage(mPm.snapshotComputer()
+ .getPackageStateInternal(packageName), false /* isReplace */);
removedAppId = mPm.mSettings.removePackageLPw(packageName);
if (outInfo != null) {
outInfo.mRemovedAppId = removedAppId;
@@ -298,7 +299,8 @@
if (changedUsers.size() > 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 25356a4..b74670b 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 @@
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 @@
}
// 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 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 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 3fe0790..479a404 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 @@
}
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<VersionedPackage> dependents = mPm.getPackagesUsingSharedLibrary(
+ final List<VersionedPackage> 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 bb7e55a..df19d3e 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.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 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 @@
// 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 @@
* aren't expected, either due to uninstallation or reinstallation on
* another volume.
*/
- public void reconcileApps(String volumeUuid) {
- List<String> absoluteCodePaths = collectAbsoluteCodePaths();
+ public void reconcileApps(@NonNull Computer snapshot, String volumeUuid) {
+ List<String> absoluteCodePaths = collectAbsoluteCodePaths(snapshot);
List<File> filesToDelete = null;
final File[] files = FileUtils.listFilesOrEmpty(
@@ -345,10 +346,10 @@
}
}
- private List<String> collectAbsoluteCodePaths() {
+ private List<String> collectAbsoluteCodePaths(@NonNull Computer snapshot) {
List<String> codePaths = new ArrayList<>();
final ArrayMap<String, ? extends PackageStateInternal> 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 3ef5599..588dfaf 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 @@
* @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 @@
ArraySet<String> 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 @@
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 @@
}
});
+ 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 @@
}
// 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 @@
* @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<String> 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 @@
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 @@
* @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 @@
}
});
+ 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 @@
* @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 @@
* @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 @@
* @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 @@
* @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 @@
* @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 @@
* @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 @@
+ "\": 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 @@
// 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 @@
* @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<List<String>> pkgsToSend = new ArrayList(pkgList.length);
final List<IntArray> uidsToSend = new ArrayList(pkgList.length);
final List<SparseArray<int[]>> allowListsToSend = new ArrayList(pkgList.length);
@@ -592,8 +602,8 @@
final String pkgName = pkgList[i];
final int uid = uidList[i];
SparseArray<int[]> 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 @@
}
}
- 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 @@
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 33476ed..eae7658 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 @@
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 30f276e..5d7a2a3 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 @@
}
// 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 e28a6ea..7e4da94 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.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.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 @@
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 @@
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 @@
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 @@
}
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 @@
// 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 5371454..17109e9 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 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.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 @@
// 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 @@
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 @@
}
}
+ @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 @@
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 @@
// 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 75b4e38..9b94e99 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 @@
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 @@
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<String> getAllPackagesWithDynamicCodeLoading() {
@@ -104,7 +116,7 @@
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 @@
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 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 8223b8c..6f503c7 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 @@
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 @@
@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 1319903..537a028 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 @@
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 b063d22..97b52a9 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt
@@ -24,7 +24,6 @@
import android.os.storage.StorageManager
import android.util.ArrayMap
import android.util.PackageUtils
-import com.android.internal.util.FunctionalUtils
import com.android.server.SystemConfig.SharedLibraryEntry
import com.android.server.compat.PlatformCompat
import com.android.server.extendedtestutils.wheneverStatic
@@ -35,7 +34,6 @@
import com.android.server.testutils.any
import com.android.server.testutils.eq
import com.android.server.testutils.mock
-import com.android.server.testutils.mockThrowOnUnmocked
import com.android.server.testutils.nullable
import com.android.server.testutils.spy
import com.android.server.testutils.whenever
@@ -59,6 +57,7 @@
import kotlin.test.assertFalse
import kotlin.test.assertTrue
+@Ignore("b/216603387")
@RunWith(JUnit4::class)
class SharedLibrariesImplTest {
@@ -85,6 +84,7 @@
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 +114,16 @@
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<Computer> {
- 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 +183,8 @@
@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)!!
@@ -253,7 +248,6 @@
assertThat(testPackageSetting.usesLibraryFiles).contains(builtinLibPath(BUILTIN_LIB_NAME))
}
- @Ignore("b/216603387")
@Test
fun updateSharedLibraries_withStaticLibPackage() {
val testPackageSetting = mExistingSettings[STATIC_LIB_PACKAGE_NAME]!!
@@ -266,7 +260,6 @@
assertThat(testPackageSetting.usesLibraryFiles).contains(apkPath(DYNAMIC_LIB_PACKAGE_NAME))
}
- @Ignore("b/216603387")
@Test
fun updateSharedLibraries_withConsumerPackage() {
val testPackageSetting = mExistingSettings[CONSUMER_PACKAGE_NAME]!!
@@ -280,7 +273,6 @@
assertThat(testPackageSetting.usesLibraryFiles).contains(apkPath(STATIC_LIB_PACKAGE_NAME))
}
- @Ignore("b/216603387")
@Test
fun updateAllSharedLibraries() {
mExistingSettings.forEach {
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 5230ea7..4818573 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
@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 @@
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 8abe46f..9d26971 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 @@
.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 050b224..946108d 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 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.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 @@
@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 @@
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<Method, Boolean> 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<PerPackageReadTimeouts> result = PerPackageReadTimeouts.parseDigestersList(