Merge "[pm] remove mPm reference from DumpHelper" into tm-dev

This commit is contained in:
Songchun Fan
2022-03-30 15:31:54 +00:00
committed by Android (Google) Code Review
23 changed files with 821 additions and 505 deletions

View File

@@ -43,6 +43,7 @@ import android.util.ArraySet;
import android.util.SparseArray;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.pm.KnownPackages;
import com.android.server.pm.PackageList;
import com.android.server.pm.PackageSetting;
import com.android.server.pm.dex.DynamicCodeLogger;
@@ -68,51 +69,6 @@ import java.util.function.Consumer;
* @hide Only for use within the system server.
*/
public abstract class PackageManagerInternal {
@IntDef(prefix = "PACKAGE_", value = {
PACKAGE_SYSTEM,
PACKAGE_SETUP_WIZARD,
PACKAGE_INSTALLER,
PACKAGE_UNINSTALLER,
PACKAGE_VERIFIER,
PACKAGE_BROWSER,
PACKAGE_SYSTEM_TEXT_CLASSIFIER,
PACKAGE_PERMISSION_CONTROLLER,
PACKAGE_CONFIGURATOR,
PACKAGE_INCIDENT_REPORT_APPROVER,
PACKAGE_APP_PREDICTOR,
PACKAGE_OVERLAY_CONFIG_SIGNATURE,
PACKAGE_WIFI,
PACKAGE_COMPANION,
PACKAGE_RETAIL_DEMO,
PACKAGE_RECENTS,
})
@Retention(RetentionPolicy.SOURCE)
public @interface KnownPackage {}
public static final int PACKAGE_SYSTEM = 0;
public static final int PACKAGE_SETUP_WIZARD = 1;
public static final int PACKAGE_INSTALLER = 2;
public static final int PACKAGE_UNINSTALLER = 3;
public static final int PACKAGE_VERIFIER = 4;
public static final int PACKAGE_BROWSER = 5;
public static final int PACKAGE_SYSTEM_TEXT_CLASSIFIER = 6;
public static final int PACKAGE_PERMISSION_CONTROLLER = 7;
public static final int PACKAGE_WELLBEING = 8;
public static final int PACKAGE_DOCUMENTER = 9;
public static final int PACKAGE_CONFIGURATOR = 10;
public static final int PACKAGE_INCIDENT_REPORT_APPROVER = 11;
public static final int PACKAGE_APP_PREDICTOR = 12;
public static final int PACKAGE_OVERLAY_CONFIG_SIGNATURE = 13;
public static final int PACKAGE_WIFI = 14;
public static final int PACKAGE_COMPANION = 15;
public static final int PACKAGE_RETAIL_DEMO = 16;
public static final int PACKAGE_RECENTS = 17;
public static final int PACKAGE_AMBIENT_CONTEXT_DETECTION = 18;
// Integer value of the last known package ID. Increases as new ID is added to KnownPackage.
// Please note the numbers should be continuous.
public static final int LAST_KNOWN_PACKAGE = PACKAGE_AMBIENT_CONTEXT_DETECTION;
@LongDef(flag = true, prefix = "RESOLVE_", value = {
RESOLVE_NON_BROWSER_ONLY,
RESOLVE_NON_RESOLVER_ONLY
@@ -754,12 +710,11 @@ public abstract class PackageManagerInternal {
*/
public abstract boolean isResolveActivityComponent(@NonNull ComponentInfo component);
/**
* Returns a list of package names for a known package
*/
public abstract @NonNull String[] getKnownPackageNames(
@KnownPackage int knownPackage, int userId);
@KnownPackages.KnownPackage int knownPackage, int userId);
/**
* Returns whether the package is an instant app.
@@ -1142,55 +1097,6 @@ public abstract class PackageManagerInternal {
public abstract boolean registerInstalledLoadingProgressCallback(@NonNull String packageName,
@NonNull InstalledLoadingProgressCallback callback, int userId);
/**
* Returns the string representation of a known package. For example,
* {@link #PACKAGE_SETUP_WIZARD} is represented by the string Setup Wizard.
*
* @param knownPackage The known package.
* @return The string representation.
*/
public static @NonNull String knownPackageToString(@KnownPackage int knownPackage) {
switch (knownPackage) {
case PACKAGE_SYSTEM:
return "System";
case PACKAGE_SETUP_WIZARD:
return "Setup Wizard";
case PACKAGE_INSTALLER:
return "Installer";
case PACKAGE_UNINSTALLER:
return "Uninstaller";
case PACKAGE_VERIFIER:
return "Verifier";
case PACKAGE_BROWSER:
return "Browser";
case PACKAGE_SYSTEM_TEXT_CLASSIFIER:
return "System Text Classifier";
case PACKAGE_PERMISSION_CONTROLLER:
return "Permission Controller";
case PACKAGE_WELLBEING:
return "Wellbeing";
case PACKAGE_DOCUMENTER:
return "Documenter";
case PACKAGE_CONFIGURATOR:
return "Configurator";
case PACKAGE_INCIDENT_REPORT_APPROVER:
return "Incident Report Approver";
case PACKAGE_APP_PREDICTOR:
return "App Predictor";
case PACKAGE_WIFI:
return "Wi-Fi";
case PACKAGE_COMPANION:
return "Companion";
case PACKAGE_RETAIL_DEMO:
return "Retail Demo";
case PACKAGE_OVERLAY_CONFIG_SIGNATURE:
return "Overlay Config Signature";
case PACKAGE_RECENTS:
return "Recents";
}
return "Unknown";
}
/**
* Callback to listen for loading progress of a package installed on Incremental File System.
*/

View File

@@ -42,6 +42,7 @@ import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.infra.AbstractMasterSystemService;
import com.android.server.infra.FrameworkResourcesServiceNameResolver;
import com.android.server.pm.KnownPackages;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -117,7 +118,7 @@ public class AmbientContextManagerService extends
public static boolean isDetectionServiceConfigured() {
final PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
final String[] packageNames = pmi.getKnownPackageNames(
PackageManagerInternal.PACKAGE_AMBIENT_CONTEXT_DETECTION, UserHandle.USER_SYSTEM);
KnownPackages.PACKAGE_AMBIENT_CONTEXT_DETECTION, UserHandle.USER_SYSTEM);
boolean isServiceConfigured = (packageNames.length != 0);
Slog.i(TAG, "Detection service configured: " + isServiceConfigured);
return isServiceConfigured;

View File

@@ -82,6 +82,7 @@ import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.SystemConfig;
import com.android.server.SystemService;
import com.android.server.pm.KnownPackages;
import com.android.server.pm.UserManagerService;
import com.android.server.pm.parsing.pkg.AndroidPackage;
@@ -1264,7 +1265,7 @@ public final class OverlayManagerService extends SystemService {
@Override
public String getConfigSignaturePackage() {
final String[] pkgs = mPackageManagerInternal.getKnownPackageNames(
PackageManagerInternal.PACKAGE_OVERLAY_CONFIG_SIGNATURE,
KnownPackages.PACKAGE_OVERLAY_CONFIG_SIGNATURE,
UserHandle.USER_SYSTEM);
return (pkgs.length == 0) ? null : pkgs[0];
}

View File

@@ -45,6 +45,7 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Pair;
import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.pm.parsing.pkg.AndroidPackage;
@@ -571,6 +572,31 @@ public interface Computer extends PackageDataSnapshot {
@NonNull
WatchedArrayMap<String, Integer> getFrozenPackages();
/**
* Verify that given package is currently frozen.
*/
void checkPackageFrozen(@NonNull String packageName);
@Nullable
ComponentName getInstantAppInstallerComponent();
void dumpPermissions(@NonNull PrintWriter pw, @NonNull String packageName,
@NonNull ArraySet<String> permissionNames, @NonNull DumpState dumpState);
void dumpPackages(PrintWriter pw, @NonNull String packageName,
@NonNull ArraySet<String> permissionNames, @NonNull DumpState dumpState,
boolean checkin);
void dumpKeySet(@NonNull PrintWriter pw, @NonNull String packageName,
@NonNull DumpState dumpState);
void dumpSharedUsers(@NonNull PrintWriter pw, @NonNull String packageName,
@NonNull ArraySet<String> permissionNames,
@NonNull DumpState dumpState, boolean checkin);
void dumpSharedUsersProto(@NonNull ProtoOutputStream proto);
void dumpPackagesProto(@NonNull ProtoOutputStream proto);
void dumpSharedLibrariesProto(@NonNull ProtoOutputStream protoOutputStream);
}

View File

@@ -117,6 +117,7 @@ import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.TypedXmlSerializer;
import android.util.Xml;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
@@ -322,6 +323,37 @@ public class ComputerEngine implements Computer {
}
return res;
}
public void dumpPackagesProto(ProtoOutputStream proto) {
mSettings.dumpPackagesProto(proto);
}
public void dumpPermissions(PrintWriter pw, String packageName,
ArraySet<String> permissionNames, DumpState dumpState) {
mSettings.dumpPermissions(pw, packageName, permissionNames, dumpState);
}
public void dumpPackages(PrintWriter pw, String packageName,
ArraySet<String> permissionNames, DumpState dumpState, boolean checkin) {
mSettings.dumpPackagesLPr(pw, packageName, permissionNames, dumpState, checkin);
}
public void dumpKeySet(PrintWriter pw, String packageName, DumpState dumpState) {
mSettings.getKeySetManagerService().dumpLPr(pw, packageName, dumpState);
}
public void dumpSharedUsers(PrintWriter pw, String packageName,
ArraySet<String> permissionNames, DumpState dumpState, boolean checkin) {
mSettings.dumpSharedUsersLPr(pw, packageName, permissionNames, dumpState, checkin);
}
public void dumpReadMessages(PrintWriter pw, DumpState dumpState) {
mSettings.dumpReadMessages(pw, dumpState);
}
public void dumpSharedUsersProto(ProtoOutputStream proto) {
mSettings.dumpSharedUsersProto(proto);
}
}
private static final Comparator<ProviderInfo> sProviderInitOrderSorter = (p1, p2) -> {
@@ -3211,6 +3243,34 @@ public class ComputerEngine implements Computer {
}
break;
}
case DumpState.DUMP_MESSAGES: {
mSettings.dumpReadMessages(pw, dumpState);
break;
}
case DumpState.DUMP_FROZEN: {
// XXX should handle packageName != null by dumping only install data that
// the given package is involved with.
if (dumpState.onTitlePrinted()) {
pw.println();
}
final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120);
ipw.println();
ipw.println("Frozen packages:");
ipw.increaseIndent();
if (mFrozenPackages.size() == 0) {
ipw.println("(none)");
} else {
for (int i = 0; i < mFrozenPackages.size(); i++) {
ipw.print("package=");
ipw.print(mFrozenPackages.keyAt(i));
ipw.print(", refCounts=");
ipw.println(mFrozenPackages.valueAt(i));
}
}
ipw.decreaseIndent();
}
} // switch
}
@@ -5698,10 +5758,58 @@ public class ComputerEngine implements Computer {
return mFrozenPackages;
}
@Override
public void checkPackageFrozen(@NonNull String packageName) {
if (!mFrozenPackages.containsKey(packageName)) {
Slog.wtf(TAG, "Expected " + packageName + " to be frozen!", new Throwable());
}
}
@Nullable
@Override
public ComponentName getInstantAppInstallerComponent() {
return mLocalInstantAppInstallerActivity == null
? null : mLocalInstantAppInstallerActivity.getComponentName();
}
@Override
public void dumpPermissions(@NonNull PrintWriter pw, @NonNull String packageName,
@NonNull ArraySet<String> permissionNames, @NonNull DumpState dumpState) {
mSettings.dumpPermissions(pw, packageName, permissionNames, dumpState);
}
@Override
public void dumpPackages(@NonNull PrintWriter pw, @NonNull String packageName,
@NonNull ArraySet<String> permissionNames, @NonNull DumpState dumpState,
boolean checkin) {
mSettings.dumpPackages(pw, packageName, permissionNames, dumpState, checkin);
}
@Override
public void dumpKeySet(@NonNull PrintWriter pw, @NonNull String packageName,
@NonNull DumpState dumpState) {
mSettings.dumpKeySet(pw, packageName, dumpState);
}
@Override
public void dumpSharedUsers(@NonNull PrintWriter pw, @NonNull String packageName,
@NonNull ArraySet<String> permissionNames, @NonNull DumpState dumpState,
boolean checkin) {
mSettings.dumpSharedUsers(pw, packageName, permissionNames, dumpState, checkin);
}
@Override
public void dumpSharedUsersProto(@NonNull ProtoOutputStream proto) {
mSettings.dumpSharedUsersProto(proto);
}
@Override
public void dumpPackagesProto(@NonNull ProtoOutputStream proto) {
mSettings.dumpPackagesProto(proto);
}
@Override
public void dumpSharedLibrariesProto(@NonNull ProtoOutputStream proto) {
mSharedLibraries.dumpProto(proto);
}
}

View File

@@ -17,45 +17,76 @@
package com.android.server.pm;
import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING;
import static android.content.pm.PackageManagerInternal.LAST_KNOWN_PACKAGE;
import static com.android.server.pm.KnownPackages.LAST_KNOWN_PACKAGE;
import static com.android.server.pm.PackageManagerServiceUtils.dumpCriticalInfo;
import android.annotation.NonNull;
import android.content.ComponentName;
import android.content.pm.FeatureInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.os.Binder;
import android.os.UserHandle;
import android.os.incremental.PerUidReadTimeouts;
import android.service.pm.PackageServiceDumpProto;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.pm.resolution.ComponentResolverApi;
import com.android.server.pm.verify.domain.DomainVerificationManagerInternal;
import com.android.server.pm.verify.domain.proxy.DomainVerificationProxy;
import dalvik.annotation.optimization.NeverCompile;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.function.BiConsumer;
/**
* Dumps PackageManagerService internal states.
*/
final class DumpHelper {
final PackageManagerService mPm;
private final PermissionManagerServiceInternal mPermissionManager;
private final ApexManager mApexManager;
private final StorageEventHelper mStorageEventHelper;
private final DomainVerificationManagerInternal mDomainVerificationManager;
private final PackageInstallerService mInstallerService;
private final String mRequiredVerifierPackage;
private final KnownPackages mKnownPackages;
private final ChangedPackagesTracker mChangedPackagesTracker;
private final ArrayMap<String, FeatureInfo> mAvailableFeatures;
private final ArraySet<String> mProtectedBroadcasts;
private final PerUidReadTimeouts[] mPerUidReadTimeouts;
DumpHelper(PackageManagerService pm) {
mPm = pm;
DumpHelper(
PermissionManagerServiceInternal permissionManager, ApexManager apexManager,
StorageEventHelper storageEventHelper,
DomainVerificationManagerInternal domainVerificationManager,
PackageInstallerService installerService, String requiredVerifierPackage,
KnownPackages knownPackages,
ChangedPackagesTracker changedPackagesTracker,
ArrayMap<String, FeatureInfo> availableFeatures,
ArraySet<String> protectedBroadcasts,
PerUidReadTimeouts[] perUidReadTimeouts) {
mPermissionManager = permissionManager;
mApexManager = apexManager;
mStorageEventHelper = storageEventHelper;
mDomainVerificationManager = domainVerificationManager;
mInstallerService = installerService;
mRequiredVerifierPackage = requiredVerifierPackage;
mKnownPackages = knownPackages;
mChangedPackagesTracker = changedPackagesTracker;
mAvailableFeatures = availableFeatures;
mProtectedBroadcasts = protectedBroadcasts;
mPerUidReadTimeouts = perUidReadTimeouts;
}
@NeverCompile // Avoid size overhead of debugging code.
public void doDump(FileDescriptor fd, PrintWriter pw, String[] args) {
final Computer snapshot = mPm.snapshotComputer();
public void doDump(Computer snapshot, FileDescriptor fd, PrintWriter pw, String[] args) {
DumpState dumpState = new DumpState();
ArraySet<String> permissionNames = null;
@@ -79,7 +110,7 @@ final class DumpHelper {
} else if ("-f".equals(opt)) {
dumpState.setOptionEnabled(DumpState.OPTION_SHOW_FILTERS);
} else if ("--proto".equals(opt)) {
dumpProto(fd);
dumpProto(snapshot, fd);
return;
} else {
pw.println("Unknown argument: " + opt + "; use -h for help");
@@ -122,9 +153,10 @@ final class DumpHelper {
}
// Normalize package name to handle renamed packages and static libs
pkg = snapshot.resolveInternalPackageName(pkg, PackageManager.VERSION_CODE_HIGHEST);
pkg = snapshot.resolveInternalPackageName(pkg,
PackageManager.VERSION_CODE_HIGHEST);
pw.println(mPm.checkPermission(perm, pkg, user));
pw.println(mPermissionManager.checkPermission(perm, pkg, user));
return;
} else if ("l".equals(cmd) || "libraries".equals(cmd)) {
dumpState.setDump(DumpState.DUMP_LIBS);
@@ -230,12 +262,6 @@ final class DumpHelper {
}
} else if ("protected-broadcasts".equals(cmd)) {
dumpState.setDump(DumpState.DUMP_PROTECTED_BROADCASTS);
} else if ("write".equals(cmd)) {
synchronized (mPm.mLock) {
mPm.writeSettingsLPrTEMP();
pw.println("Settings written.");
return;
}
}
}
@@ -245,7 +271,7 @@ final class DumpHelper {
// Return if the package doesn't exist.
if (packageName != null
&& snapshot.getPackageStateInternal(packageName) == null
&& !mPm.mApexManager.isApexPackage(packageName)) {
&& !mApexManager.isApexPackage(packageName)) {
pw.println("Unable to find package: " + packageName);
return;
}
@@ -271,11 +297,11 @@ final class DumpHelper {
ipw.println("Known Packages:");
ipw.increaseIndent();
for (int i = 0; i <= LAST_KNOWN_PACKAGE; i++) {
final String knownPackage = PackageManagerInternal.knownPackageToString(i);
final String knownPackage = KnownPackages.knownPackageToString(i);
ipw.print(knownPackage);
ipw.println(":");
final String[] pkgNames = mPm.getKnownPackageNamesInternal(snapshot, i,
UserHandle.USER_SYSTEM);
final String[] pkgNames = mKnownPackages.getKnownPackageNames(snapshot,
i, UserHandle.USER_SYSTEM);
ipw.increaseIndent();
if (ArrayUtils.isEmpty(pkgNames)) {
ipw.println("none");
@@ -291,7 +317,7 @@ final class DumpHelper {
if (dumpState.isDumping(DumpState.DUMP_VERIFIERS)
&& packageName == null) {
final String requiredVerifierPackage = mPm.mRequiredVerifierPackage;
final String requiredVerifierPackage = mRequiredVerifierPackage;
if (!checkin) {
if (dumpState.onTitlePrinted()) {
pw.println();
@@ -304,7 +330,8 @@ final class DumpHelper {
MATCH_DEBUG_TRIAGED_MISSING, UserHandle.USER_SYSTEM));
pw.println(")");
} else if (requiredVerifierPackage != null) {
pw.print("vrfy,"); pw.print(requiredVerifierPackage);
pw.print("vrfy,");
pw.print(requiredVerifierPackage);
pw.print(",");
pw.println(snapshot.getPackageUid(requiredVerifierPackage,
MATCH_DEBUG_TRIAGED_MISSING, UserHandle.USER_SYSTEM));
@@ -313,7 +340,7 @@ final class DumpHelper {
if (dumpState.isDumping(DumpState.DUMP_DOMAIN_VERIFIER)
&& packageName == null) {
final DomainVerificationProxy proxy = mPm.mDomainVerificationManager.getProxy();
final DomainVerificationProxy proxy = mDomainVerificationManager.getProxy();
final ComponentName verifierComponent = proxy.getComponentName();
if (verifierComponent != null) {
String verifierPackageName = verifierComponent.getPackageName();
@@ -329,7 +356,8 @@ final class DumpHelper {
MATCH_DEBUG_TRIAGED_MISSING, UserHandle.USER_SYSTEM));
pw.println(")");
} else if (verifierPackageName != null) {
pw.print("dv,"); pw.print(verifierPackageName);
pw.print("dv,");
pw.print(verifierPackageName);
pw.print(",");
pw.println(snapshot.getPackageUid(verifierPackageName,
MATCH_DEBUG_TRIAGED_MISSING, UserHandle.USER_SYSTEM));
@@ -354,76 +382,75 @@ final class DumpHelper {
pw.println("Features:");
}
synchronized (mPm.mAvailableFeatures) {
for (FeatureInfo feat : mPm.mAvailableFeatures.values()) {
if (!checkin) {
pw.print(" ");
pw.print(feat.name);
if (feat.version > 0) {
pw.print(" version=");
pw.print(feat.version);
}
pw.println();
} else {
pw.print("feat,");
pw.print(feat.name);
pw.print(",");
pw.println(feat.version);
for (FeatureInfo feat : mAvailableFeatures.values()) {
if (!checkin) {
pw.print(" ");
pw.print(feat.name);
if (feat.version > 0) {
pw.print(" version=");
pw.print(feat.version);
}
pw.println();
} else {
pw.print("feat,");
pw.print(feat.name);
pw.print(",");
pw.println(feat.version);
}
}
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_ACTIVITY_RESOLVERS)) {
mPm.mComponentResolver.dumpActivityResolvers(pw, dumpState, packageName);
final ComponentResolverApi componentResolver = snapshot.getComponentResolver();
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_ACTIVITY_RESOLVERS)) {
componentResolver.dumpActivityResolvers(pw, dumpState, packageName);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_RECEIVER_RESOLVERS)) {
mPm.mComponentResolver.dumpReceiverResolvers(pw, dumpState, packageName);
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_RECEIVER_RESOLVERS)) {
componentResolver.dumpReceiverResolvers(pw, dumpState, packageName);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_SERVICE_RESOLVERS)) {
mPm.mComponentResolver.dumpServiceResolvers(pw, dumpState, packageName);
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_SERVICE_RESOLVERS)) {
componentResolver.dumpServiceResolvers(pw, dumpState, packageName);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_CONTENT_RESOLVERS)) {
mPm.mComponentResolver.dumpProviderResolvers(pw, dumpState, packageName);
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_CONTENT_RESOLVERS)) {
componentResolver.dumpProviderResolvers(pw, dumpState, packageName);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_PREFERRED)) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_PREFERRED)) {
snapshot.dump(DumpState.DUMP_PREFERRED, fd, pw, dumpState);
}
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_PREFERRED_XML)
&& packageName == null) {
&& dumpState.isDumping(DumpState.DUMP_PREFERRED_XML) && packageName == null) {
snapshot.dump(DumpState.DUMP_PREFERRED_XML, fd, pw, dumpState);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_DOMAIN_PREFERRED)) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_DOMAIN_PREFERRED)) {
snapshot.dump(DumpState.DUMP_DOMAIN_PREFERRED, fd, pw, dumpState);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_PERMISSIONS)) {
mPm.mSettings.dumpPermissions(pw, packageName, permissionNames, dumpState);
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_PERMISSIONS)) {
snapshot.dumpPermissions(pw, packageName, permissionNames, dumpState);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_PROVIDERS)) {
mPm.mComponentResolver.dumpContentProviders(snapshot, pw, dumpState,
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_PROVIDERS)) {
componentResolver.dumpContentProviders(snapshot, pw, dumpState,
packageName);
}
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_KEYSETS)) {
synchronized (mPm.mLock) {
mPm.mSettings.getKeySetManagerService().dumpLPr(pw, packageName, dumpState);
}
snapshot.dumpKeySet(pw, packageName, dumpState);
}
if (dumpState.isDumping(DumpState.DUMP_PACKAGES)) {
// This cannot be moved to ComputerEngine since some variables of the collections
// in PackageUserState such as suspendParams, disabledComponents and enabledComponents
// do not have a copy.
synchronized (mPm.mLock) {
mPm.mSettings.dumpPackagesLPr(pw, packageName, permissionNames, dumpState, checkin);
}
snapshot.dumpPackages(pw, packageName, permissionNames, dumpState, checkin);
}
if (!checkin
@@ -432,12 +459,8 @@ final class DumpHelper {
}
if (dumpState.isDumping(DumpState.DUMP_SHARED_USERS)) {
// This cannot be moved to ComputerEngine since the set of packages in the
// SharedUserSetting do not have a copy.
synchronized (mPm.mLock) {
mPm.mSettings.dumpSharedUsersLPr(pw, packageName, permissionNames, dumpState,
checkin);
}
snapshot.dumpSharedUsers(pw, packageName, permissionNames, dumpState,
checkin);
}
if (!checkin
@@ -447,15 +470,19 @@ final class DumpHelper {
pw.println();
}
pw.println("Package Changes:");
mPm.mChangedPackagesTracker.iterateAll((sequenceNumber, values) -> {
pw.print(" Sequence number="); pw.println(sequenceNumber);
mChangedPackagesTracker.iterateAll((sequenceNumber, values) -> {
pw.print(" Sequence number=");
pw.println(sequenceNumber);
final int numChangedPackages = values.size();
for (int i = 0; i < numChangedPackages; i++) {
final SparseArray<String> changes = values.valueAt(i);
pw.print(" User "); pw.print(values.keyAt(i)); pw.println(":");
pw.print(" User ");
pw.print(values.keyAt(i));
pw.println(":");
final int numChanges = changes.size();
if (numChanges == 0) {
pw.print(" "); pw.println("No packages changed");
pw.print(" ");
pw.println("No packages changed");
} else {
for (int j = 0; j < numChanges; j++) {
final String pkgName = changes.valueAt(j);
@@ -474,56 +501,19 @@ final class DumpHelper {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_FROZEN)
&& packageName == null) {
// XXX should handle packageName != null by dumping only install data that
// the given package is involved with.
if (dumpState.onTitlePrinted()) {
pw.println();
}
final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120);
ipw.println();
ipw.println("Frozen packages:");
ipw.increaseIndent();
synchronized (mPm.mLock) {
if (mPm.mFrozenPackages.size() == 0) {
ipw.println("(none)");
} else {
for (int i = 0; i < mPm.mFrozenPackages.size(); i++) {
ipw.print("package=");
ipw.print(mPm.mFrozenPackages.keyAt(i));
ipw.print(", refCounts=");
ipw.println(mPm.mFrozenPackages.valueAt(i));
}
}
}
ipw.decreaseIndent();
snapshot.dump(DumpState.DUMP_FROZEN, fd, pw, dumpState);
}
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_VOLUMES)
&& packageName == null) {
if (dumpState.onTitlePrinted()) {
pw.println();
}
final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120);
ipw.println();
ipw.println("Loaded volumes:");
ipw.increaseIndent();
synchronized (mPm.mLoadedVolumes) {
if (mPm.mLoadedVolumes.size() == 0) {
ipw.println("(none)");
} else {
for (int i = 0; i < mPm.mLoadedVolumes.size(); i++) {
ipw.println(mPm.mLoadedVolumes.valueAt(i));
}
}
}
ipw.decreaseIndent();
mStorageEventHelper.dumpLoadedVolumes(pw, dumpState);
}
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_SERVICE_PERMISSIONS)
&& packageName == null) {
mPm.mComponentResolver.dumpServicePermissions(pw, dumpState);
componentResolver.dumpServicePermissions(pw, dumpState);
}
if (!checkin
@@ -542,7 +532,7 @@ final class DumpHelper {
if (dumpState.onTitlePrinted()) {
pw.println();
}
mPm.mSettings.dumpReadMessages(pw, dumpState);
snapshot.dump(DumpState.DUMP_MESSAGES, fd, pw, dumpState);
pw.println();
pw.println("Package warning messages:");
dumpCriticalInfo(pw, null);
@@ -560,13 +550,13 @@ final class DumpHelper {
if (dumpState.onTitlePrinted()) {
pw.println();
}
mPm.mInstallerService.dump(new IndentingPrintWriter(pw, " ", 120));
mInstallerService.dump(new IndentingPrintWriter(pw, " ", 120));
}
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_APEX)
&& (packageName == null || mPm.mApexManager.isApexPackage(packageName))) {
mPm.mApexManager.dump(pw, packageName);
&& (packageName == null || mApexManager.isApexPackage(packageName))) {
mApexManager.dump(pw, packageName);
}
if (!checkin
@@ -580,9 +570,8 @@ final class DumpHelper {
pw.println(" Known digesters list flag: "
+ PackageManagerService.getKnownDigestersList());
PerUidReadTimeouts[] items = mPm.getPerUidReadTimeouts(snapshot);
pw.println(" Timeouts (" + items.length + "):");
for (PerUidReadTimeouts item : items) {
pw.println(" Timeouts (" + mPerUidReadTimeouts.length + "):");
for (PerUidReadTimeouts item : mPerUidReadTimeouts) {
pw.print(" (");
pw.print("uid=" + item.uid + ", ");
pw.print("minTimeUs=" + item.minTimeUs + ", ");
@@ -598,8 +587,6 @@ final class DumpHelper {
if (dumpState.onTitlePrinted()) {
pw.println();
}
pw.println("Snapshot statistics");
mPm.dumpSnapshotStats(pw, dumpState.isBrief());
}
if (!checkin
@@ -609,11 +596,9 @@ final class DumpHelper {
pw.println();
}
pw.println("Protected broadcast actions:");
synchronized (mPm.mProtectedBroadcasts) {
for (int i = 0; i < mPm.mProtectedBroadcasts.size(); i++) {
pw.print(" ");
pw.println(mPm.mProtectedBroadcasts.valueAt(i));
}
for (int i = 0; i < mProtectedBroadcasts.size(); i++) {
pw.print(" ");
pw.println(mProtectedBroadcasts.valueAt(i));
}
}
@@ -658,55 +643,50 @@ final class DumpHelper {
pw.println(" <package.name>: info about given package");
}
private void dumpProto(FileDescriptor fd) {
private void dumpProto(Computer snapshot, FileDescriptor fd) {
final ProtoOutputStream proto = new ProtoOutputStream(fd);
synchronized (mPm.mLock) {
final Computer snapshot = mPm.snapshotComputer();
final long requiredVerifierPackageToken =
proto.start(PackageServiceDumpProto.REQUIRED_VERIFIER_PACKAGE);
proto.write(PackageServiceDumpProto.PackageShortProto.NAME,
mPm.mRequiredVerifierPackage);
final long requiredVerifierPackageToken =
proto.start(PackageServiceDumpProto.REQUIRED_VERIFIER_PACKAGE);
proto.write(PackageServiceDumpProto.PackageShortProto.NAME,
mRequiredVerifierPackage);
proto.write(
PackageServiceDumpProto.PackageShortProto.UID,
snapshot.getPackageUid(
mRequiredVerifierPackage,
MATCH_DEBUG_TRIAGED_MISSING,
UserHandle.USER_SYSTEM));
proto.end(requiredVerifierPackageToken);
DomainVerificationProxy proxy = mDomainVerificationManager.getProxy();
ComponentName verifierComponent = proxy.getComponentName();
if (verifierComponent != null) {
String verifierPackageName = verifierComponent.getPackageName();
final long verifierPackageToken =
proto.start(PackageServiceDumpProto.VERIFIER_PACKAGE);
proto.write(PackageServiceDumpProto.PackageShortProto.NAME, verifierPackageName);
proto.write(
PackageServiceDumpProto.PackageShortProto.UID,
snapshot.getPackageUid(
mPm.mRequiredVerifierPackage,
verifierPackageName,
MATCH_DEBUG_TRIAGED_MISSING,
UserHandle.USER_SYSTEM));
proto.end(requiredVerifierPackageToken);
DomainVerificationProxy proxy = mPm.mDomainVerificationManager.getProxy();
ComponentName verifierComponent = proxy.getComponentName();
if (verifierComponent != null) {
String verifierPackageName = verifierComponent.getPackageName();
final long verifierPackageToken =
proto.start(PackageServiceDumpProto.VERIFIER_PACKAGE);
proto.write(PackageServiceDumpProto.PackageShortProto.NAME, verifierPackageName);
proto.write(
PackageServiceDumpProto.PackageShortProto.UID,
snapshot.getPackageUid(
verifierPackageName,
MATCH_DEBUG_TRIAGED_MISSING,
UserHandle.USER_SYSTEM));
proto.end(verifierPackageToken);
}
mPm.mInjector.getSharedLibrariesImpl().dumpProto(proto);
dumpFeaturesProto(proto);
mPm.mSettings.dumpPackagesProto(proto);
mPm.mSettings.dumpSharedUsersProto(proto);
dumpCriticalInfo(proto);
proto.end(verifierPackageToken);
}
snapshot.dumpSharedLibrariesProto(proto);
dumpAvailableFeaturesProto(proto);
snapshot.dumpPackagesProto(proto);
snapshot.dumpSharedUsersProto(proto);
dumpCriticalInfo(proto);
proto.flush();
}
private void dumpFeaturesProto(ProtoOutputStream proto) {
synchronized (mPm.mAvailableFeatures) {
final int count = mPm.mAvailableFeatures.size();
for (int i = 0; i < count; i++) {
mPm.mAvailableFeatures.valueAt(i).dumpDebug(proto,
PackageServiceDumpProto.FEATURES);
}
private void dumpAvailableFeaturesProto(@NonNull ProtoOutputStream proto) {
final int count = mAvailableFeatures.size();
for (int i = 0; i < count; i++) {
mAvailableFeatures.valueAt(i).dumpDebug(proto, PackageServiceDumpProto.FEATURES);
}
}
}

View File

@@ -427,7 +427,7 @@ final class InstallPackageHelper {
} else {
// We're doing major surgery on this package, so it better be frozen
// right now to keep it from launching
mPm.checkPackageFrozen(pkgName);
mPm.snapshotComputer().checkPackageFrozen(pkgName);
}
final boolean isReplace =

View File

@@ -0,0 +1,213 @@
/*
* 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 android.annotation.IntDef;
import android.annotation.NonNull;
import android.text.TextUtils;
import com.android.internal.util.ArrayUtils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* Helps {@link PackageManagerService} keep track of the names of special packages like SetupWizard.
*/
public final class KnownPackages {
@IntDef(prefix = "PACKAGE_", value = {
PACKAGE_SYSTEM,
PACKAGE_SETUP_WIZARD,
PACKAGE_INSTALLER,
PACKAGE_UNINSTALLER,
PACKAGE_VERIFIER,
PACKAGE_BROWSER,
PACKAGE_SYSTEM_TEXT_CLASSIFIER,
PACKAGE_PERMISSION_CONTROLLER,
PACKAGE_CONFIGURATOR,
PACKAGE_INCIDENT_REPORT_APPROVER,
PACKAGE_APP_PREDICTOR,
PACKAGE_OVERLAY_CONFIG_SIGNATURE,
PACKAGE_WIFI,
PACKAGE_COMPANION,
PACKAGE_RETAIL_DEMO,
PACKAGE_RECENTS,
PACKAGE_AMBIENT_CONTEXT_DETECTION,
})
@Retention(RetentionPolicy.SOURCE)
public @interface KnownPackage {
}
public static final int PACKAGE_SYSTEM = 0;
public static final int PACKAGE_SETUP_WIZARD = 1;
public static final int PACKAGE_INSTALLER = 2;
public static final int PACKAGE_UNINSTALLER = 3;
public static final int PACKAGE_VERIFIER = 4;
public static final int PACKAGE_BROWSER = 5;
public static final int PACKAGE_SYSTEM_TEXT_CLASSIFIER = 6;
public static final int PACKAGE_PERMISSION_CONTROLLER = 7;
public static final int PACKAGE_WELLBEING = 8;
public static final int PACKAGE_DOCUMENTER = 9;
public static final int PACKAGE_CONFIGURATOR = 10;
public static final int PACKAGE_INCIDENT_REPORT_APPROVER = 11;
public static final int PACKAGE_APP_PREDICTOR = 12;
public static final int PACKAGE_OVERLAY_CONFIG_SIGNATURE = 13;
public static final int PACKAGE_WIFI = 14;
public static final int PACKAGE_COMPANION = 15;
public static final int PACKAGE_RETAIL_DEMO = 16;
public static final int PACKAGE_RECENTS = 17;
public static final int PACKAGE_AMBIENT_CONTEXT_DETECTION = 18;
// Integer value of the last known package ID. Increases as new ID is added to KnownPackage.
// Please note the numbers should be continuous.
public static final int LAST_KNOWN_PACKAGE = PACKAGE_AMBIENT_CONTEXT_DETECTION;
private final DefaultAppProvider mDefaultAppProvider;
private final String mRequiredInstallerPackage;
private final String mRequiredUninstallerPackage;
private final String mSetupWizardPackage;
private final String mRequiredVerifierPackage;
private final String mDefaultTextClassifierPackage;
private final String mSystemTextClassifierPackageName;
private final String mRequiredPermissionControllerPackage;
private final String mConfiguratorPackage;
private final String mIncidentReportApproverPackage;
private final String mAmbientContextDetectionPackage;
private final String mAppPredictionServicePackage;
private final String mCompanionPackage;
private final String mRetailDemoPackage;
private final String mOverlayConfigSignaturePackage;
private final String mRecentsPackage;
KnownPackages(DefaultAppProvider defaultAppProvider, String requiredInstallerPackage,
String requiredUninstallerPackage, String setupWizardPackage,
String requiredVerifierPackage, String defaultTextClassifierPackage,
String systemTextClassifierPackageName, String requiredPermissionControllerPackage,
String configuratorPackage, String incidentReportApproverPackage,
String ambientContextDetectionPackage, String appPredictionServicePackage,
String companionPackageName, String retailDemoPackage,
String overlayConfigSignaturePackage, String recentsPackage) {
mDefaultAppProvider = defaultAppProvider;
mRequiredInstallerPackage = requiredInstallerPackage;
mRequiredUninstallerPackage = requiredUninstallerPackage;
mSetupWizardPackage = setupWizardPackage;
mRequiredVerifierPackage = requiredVerifierPackage;
mDefaultTextClassifierPackage = defaultTextClassifierPackage;
mSystemTextClassifierPackageName = systemTextClassifierPackageName;
mRequiredPermissionControllerPackage = requiredPermissionControllerPackage;
mConfiguratorPackage = configuratorPackage;
mIncidentReportApproverPackage = incidentReportApproverPackage;
mAmbientContextDetectionPackage = ambientContextDetectionPackage;
mAppPredictionServicePackage = appPredictionServicePackage;
mCompanionPackage = companionPackageName;
mRetailDemoPackage = retailDemoPackage;
mOverlayConfigSignaturePackage = overlayConfigSignaturePackage;
mRecentsPackage = recentsPackage;
}
/**
* Returns the string representation of a known package. For example,
* {@link #PACKAGE_SETUP_WIZARD} is represented by the string Setup Wizard.
*
* @param knownPackage The known package.
* @return The string representation.
*/
static @NonNull String knownPackageToString(@KnownPackage int knownPackage) {
switch (knownPackage) {
case PACKAGE_SYSTEM:
return "System";
case PACKAGE_SETUP_WIZARD:
return "Setup Wizard";
case PACKAGE_INSTALLER:
return "Installer";
case PACKAGE_UNINSTALLER:
return "Uninstaller";
case PACKAGE_VERIFIER:
return "Verifier";
case PACKAGE_BROWSER:
return "Browser";
case PACKAGE_SYSTEM_TEXT_CLASSIFIER:
return "System Text Classifier";
case PACKAGE_PERMISSION_CONTROLLER:
return "Permission Controller";
case PACKAGE_WELLBEING:
return "Wellbeing";
case PACKAGE_DOCUMENTER:
return "Documenter";
case PACKAGE_CONFIGURATOR:
return "Configurator";
case PACKAGE_INCIDENT_REPORT_APPROVER:
return "Incident Report Approver";
case PACKAGE_APP_PREDICTOR:
return "App Predictor";
case PACKAGE_WIFI:
return "Wi-Fi";
case PACKAGE_COMPANION:
return "Companion";
case PACKAGE_RETAIL_DEMO:
return "Retail Demo";
case PACKAGE_OVERLAY_CONFIG_SIGNATURE:
return "Overlay Config Signature";
case PACKAGE_RECENTS:
return "Recents";
case PACKAGE_AMBIENT_CONTEXT_DETECTION:
return "Ambient Context Detection";
}
return "Unknown";
}
String[] getKnownPackageNames(@NonNull Computer snapshot, int knownPackage, int userId) {
switch (knownPackage) {
case PACKAGE_BROWSER:
return new String[]{mDefaultAppProvider.getDefaultBrowser(userId)};
case PACKAGE_INSTALLER:
return snapshot.filterOnlySystemPackages(mRequiredInstallerPackage);
case PACKAGE_UNINSTALLER:
return snapshot.filterOnlySystemPackages(mRequiredUninstallerPackage);
case PACKAGE_SETUP_WIZARD:
return snapshot.filterOnlySystemPackages(mSetupWizardPackage);
case PACKAGE_SYSTEM:
return new String[]{"android"};
case PACKAGE_VERIFIER:
return snapshot.filterOnlySystemPackages(mRequiredVerifierPackage);
case PACKAGE_SYSTEM_TEXT_CLASSIFIER:
return snapshot.filterOnlySystemPackages(
mDefaultTextClassifierPackage, mSystemTextClassifierPackageName);
case PACKAGE_PERMISSION_CONTROLLER:
return snapshot.filterOnlySystemPackages(mRequiredPermissionControllerPackage);
case PACKAGE_CONFIGURATOR:
return snapshot.filterOnlySystemPackages(mConfiguratorPackage);
case PACKAGE_INCIDENT_REPORT_APPROVER:
return snapshot.filterOnlySystemPackages(mIncidentReportApproverPackage);
case PACKAGE_AMBIENT_CONTEXT_DETECTION:
return snapshot.filterOnlySystemPackages(mAmbientContextDetectionPackage);
case PACKAGE_APP_PREDICTOR:
return snapshot.filterOnlySystemPackages(mAppPredictionServicePackage);
case PACKAGE_COMPANION:
return snapshot.filterOnlySystemPackages(mCompanionPackage);
case PACKAGE_RETAIL_DEMO:
return TextUtils.isEmpty(mRetailDemoPackage)
? ArrayUtils.emptyArray(String.class)
: new String[]{mRetailDemoPackage};
case PACKAGE_OVERLAY_CONFIG_SIGNATURE:
return snapshot.filterOnlySystemPackages(mOverlayConfigSignaturePackage);
case PACKAGE_RECENTS:
return snapshot.filterOnlySystemPackages(mRecentsPackage);
default:
return ArrayUtils.emptyArray(String.class);
}
}
}

View File

@@ -1741,7 +1741,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private static boolean isSecureFrpInstallAllowed(Context context, int callingUid) {
final PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
final String[] systemInstaller = pmi.getKnownPackageNames(
PackageManagerInternal.PACKAGE_INSTALLER, UserHandle.USER_SYSTEM);
KnownPackages.PACKAGE_INSTALLER, UserHandle.USER_SYSTEM);
final AndroidPackage callingInstaller = pmi.getPackage(callingUid);
if (callingInstaller != null
&& ArrayUtils.contains(systemInstaller, callingInstaller.getPackageName())) {

View File

@@ -655,9 +655,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService
final ProtectedPackages mProtectedPackages;
@GuardedBy("mLoadedVolumes")
final ArraySet<String> mLoadedVolumes = new ArraySet<>();
private boolean mFirstBoot;
final boolean mIsEngBuild;
@@ -667,7 +664,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
PackageManagerInternal.ExternalSourcesPolicy mExternalSourcesPolicy;
@GuardedBy("mAvailableFeatures")
final ArrayMap<String, FeatureInfo> mAvailableFeatures;
private final ArrayMap<String, FeatureInfo> mAvailableFeatures;
@Watched
final InstantAppRegistry mInstantAppRegistry;
@@ -943,6 +940,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
private final DexOptHelper mDexOptHelper;
private final SuspendPackageHelper mSuspendPackageHelper;
private final IntentResolverInterceptor mIntentResolverInterceptor;
private final StorageEventHelper mStorageEventHelper;
/**
* Invalidate the package info cache, which includes updating the cached computer.
@@ -1584,7 +1582,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
/**
* A extremely minimal constructor designed to start up a PackageManagerService instance for
* An extremely minimal constructor designed to start up a PackageManagerService instance for
* testing.
*
* It is assumed that all methods under test will mock the internal fields and thus
@@ -1689,6 +1687,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mSharedLibraries.setDeletePackageHelper(mDeletePackageHelper);
mIntentResolverInterceptor = null;
mStorageEventHelper = testParams.storageEventHelper;
registerObservers(false);
invalidatePackageInfoCache();
@@ -1841,6 +1840,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mDexOptHelper = new DexOptHelper(this);
mSuspendPackageHelper = new SuspendPackageHelper(this, mInjector, mBroadcastHelper,
mProtectedPackages);
mStorageEventHelper = new StorageEventHelper(this, mDeletePackageHelper,
mRemovePackageHelper);
synchronized (mLock) {
// Create the computer as soon as the state objects have been installed. The
@@ -4055,17 +4056,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mUserManager.systemReady();
// Watch for external volumes that come and go over time
final StorageEventHelper storageEventHelper = new StorageEventHelper(this,
mDeletePackageHelper, mRemovePackageHelper);
final StorageManager storage = mInjector.getSystemService(StorageManager.class);
storage.registerListener(storageEventHelper);
storage.registerListener(mStorageEventHelper);
mInstallerService.systemReady();
mPackageDexOptimizer.systemReady();
// Now that we're mostly running, clean up stale users and apps
mUserManager.reconcileUsers(StorageManager.UUID_PRIVATE_INTERNAL);
storageEventHelper.reconcileApps(snapshotComputer(), StorageManager.UUID_PRIVATE_INTERNAL);
mStorageEventHelper.reconcileApps(snapshotComputer(), StorageManager.UUID_PRIVATE_INTERNAL);
mPermissionManager.onSystemReady();
@@ -4163,20 +4162,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
void dumpSnapshotStats(PrintWriter pw, boolean isBrief) {
if (mSnapshotStatistics == null) {
return;
}
int hits = 0;
synchronized (mSnapshotLock) {
if (mSnapshotComputer != null) {
hits = mSnapshotComputer.getUsed();
}
}
final long now = SystemClock.currentTimeMicro();
mSnapshotStatistics.dump(pw, " ", now, hits, -1, isBrief);
}
//TODO: b/111402650
private void disableSkuSpecificApps() {
String[] apkList = mContext.getResources().getStringArray(
@@ -4221,17 +4206,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
/**
* Verify that given package is currently frozen.
*/
void checkPackageFrozen(String packageName) {
synchronized (mLock) {
if (!mFrozenPackages.containsKey(packageName)) {
Slog.wtf(TAG, "Expected " + packageName + " to be frozen!", new Throwable());
}
}
}
/** Called by UserManagerService */
void cleanUpUser(UserManagerService userManager, @UserIdInt int userId) {
synchronized (mLock) {
@@ -6050,7 +6024,37 @@ public class PackageManagerService implements PackageSender, TestUtilityService
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return;
new DumpHelper(PackageManagerService.this).doDump(fd, pw, args);
final Computer snapshot = snapshotComputer();
final KnownPackages knownPackages = new KnownPackages(
mDefaultAppProvider,
mRequiredInstallerPackage,
mRequiredUninstallerPackage,
mSetupWizardPackage,
mRequiredVerifierPackage,
mDefaultTextClassifierPackage,
mSystemTextClassifierPackageName,
mRequiredPermissionControllerPackage,
mConfiguratorPackage,
mIncidentReportApproverPackage,
mAmbientContextDetectionPackage,
mAppPredictionServicePackage,
COMPANION_PACKAGE_NAME,
mRetailDemoPackage,
mOverlayConfigSignaturePackage,
mRecentsPackage);
final ArrayMap<String, FeatureInfo> availableFeatures;
synchronized (mAvailableFeatures) {
availableFeatures = new ArrayMap<>(mAvailableFeatures);
}
final ArraySet<String> protectedBroadcasts;
synchronized (mProtectedBroadcasts) {
protectedBroadcasts = new ArraySet<>(mProtectedBroadcasts);
}
new DumpHelper(mPermissionManager, mApexManager, mStorageEventHelper,
mDomainVerificationManager, mInstallerService, mRequiredVerifierPackage,
knownPackages, mChangedPackagesTracker, availableFeatures, protectedBroadcasts,
getPerUidReadTimeouts(snapshot)
).doDump(snapshot, fd, pw, args);
}
}
@@ -6984,45 +6988,24 @@ public class PackageManagerService implements PackageSender, TestUtilityService
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 snapshot.filterOnlySystemPackages(mRequiredInstallerPackage);
case PackageManagerInternal.PACKAGE_UNINSTALLER:
return snapshot.filterOnlySystemPackages(mRequiredUninstallerPackage);
case PackageManagerInternal.PACKAGE_SETUP_WIZARD:
return snapshot.filterOnlySystemPackages(mSetupWizardPackage);
case PackageManagerInternal.PACKAGE_SYSTEM:
return new String[]{"android"};
case PackageManagerInternal.PACKAGE_VERIFIER:
return snapshot.filterOnlySystemPackages(mRequiredVerifierPackage);
case PackageManagerInternal.PACKAGE_SYSTEM_TEXT_CLASSIFIER:
return snapshot.filterOnlySystemPackages(
mDefaultTextClassifierPackage, mSystemTextClassifierPackageName);
case PackageManagerInternal.PACKAGE_PERMISSION_CONTROLLER:
return snapshot.filterOnlySystemPackages(mRequiredPermissionControllerPackage);
case PackageManagerInternal.PACKAGE_CONFIGURATOR:
return snapshot.filterOnlySystemPackages(mConfiguratorPackage);
case PackageManagerInternal.PACKAGE_INCIDENT_REPORT_APPROVER:
return snapshot.filterOnlySystemPackages(mIncidentReportApproverPackage);
case PackageManagerInternal.PACKAGE_AMBIENT_CONTEXT_DETECTION:
return snapshot.filterOnlySystemPackages(mAmbientContextDetectionPackage);
case PackageManagerInternal.PACKAGE_APP_PREDICTOR:
return snapshot.filterOnlySystemPackages(mAppPredictionServicePackage);
case PackageManagerInternal.PACKAGE_COMPANION:
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 snapshot.filterOnlySystemPackages(mOverlayConfigSignaturePackage);
case PackageManagerInternal.PACKAGE_RECENTS:
return snapshot.filterOnlySystemPackages(mRecentsPackage);
default:
return ArrayUtils.emptyArray(String.class);
}
return new KnownPackages(
mDefaultAppProvider,
mRequiredInstallerPackage,
mRequiredUninstallerPackage,
mSetupWizardPackage,
mRequiredVerifierPackage,
mDefaultTextClassifierPackage,
mSystemTextClassifierPackageName,
mRequiredPermissionControllerPackage,
mConfiguratorPackage,
mIncidentReportApproverPackage,
mAmbientContextDetectionPackage,
mAppPredictionServicePackage,
COMPANION_PACKAGE_NAME,
mRetailDemoPackage,
mOverlayConfigSignaturePackage,
mRecentsPackage)
.getKnownPackageNames(snapshot, knownPackage, userId);
}
String getActiveLauncherPackageName(int userId) {

View File

@@ -115,4 +115,5 @@ public final class PackageManagerServiceTestParams {
public ResolveIntentHelper resolveIntentHelper;
public DexOptHelper dexOptHelper;
public SuspendPackageHelper suspendPackageHelper;
public StorageEventHelper storageEventHelper;
}

View File

@@ -42,15 +42,19 @@ import android.os.storage.StorageManagerInternal;
import android.os.storage.VolumeInfo;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.policy.AttributeCache;
import com.android.internal.util.IndentingPrintWriter;
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.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
@@ -61,6 +65,9 @@ public final class StorageEventHelper extends StorageEventListener {
private final DeletePackageHelper mDeletePackageHelper;
private final RemovePackageHelper mRemovePackageHelper;
@GuardedBy("mLoadedVolumes")
final ArraySet<String> mLoadedVolumes = new ArraySet<>();
// TODO(b/198166813): remove PMS dependency
public StorageEventHelper(PackageManagerService pm, DeletePackageHelper deletePackageHelper,
RemovePackageHelper removePackageHelper) {
@@ -216,8 +223,8 @@ public final class StorageEventHelper extends StorageEventListener {
if (DEBUG_INSTALL) Slog.d(TAG, "Loaded packages " + loaded);
sendResourcesChangedBroadcast(true, false, loaded, null);
synchronized (mPm.mLoadedVolumes) {
mPm.mLoadedVolumes.add(vol.getId());
synchronized (mLoadedVolumes) {
mLoadedVolumes.add(vol.getId());
}
}
@@ -267,8 +274,8 @@ public final class StorageEventHelper extends StorageEventListener {
if (DEBUG_INSTALL) Slog.d(TAG, "Unloaded packages " + unloaded);
sendResourcesChangedBroadcast(false, false, unloaded, null);
synchronized (mPm.mLoadedVolumes) {
mPm.mLoadedVolumes.remove(vol.getId());
synchronized (mLoadedVolumes) {
mLoadedVolumes.remove(vol.getId());
}
// Try very hard to release any references to this path so we don't risk
@@ -357,4 +364,24 @@ public final class StorageEventHelper extends StorageEventListener {
}
return codePaths;
}
public void dumpLoadedVolumes(@NonNull PrintWriter pw, @NonNull DumpState dumpState) {
if (dumpState.onTitlePrinted()) {
pw.println();
}
final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120);
ipw.println();
ipw.println("Loaded volumes:");
ipw.increaseIndent();
synchronized (mLoadedVolumes) {
if (mLoadedVolumes.size() == 0) {
ipw.println("(none)");
} else {
for (int i = 0; i < mLoadedVolumes.size(); i++) {
ipw.println(mLoadedVolumes.valueAt(i));
}
}
}
ipw.decreaseIndent();
}
}

View File

@@ -16,10 +16,6 @@
package com.android.server.pm;
import static android.content.pm.PackageManagerInternal.PACKAGE_INSTALLER;
import static android.content.pm.PackageManagerInternal.PACKAGE_PERMISSION_CONTROLLER;
import static android.content.pm.PackageManagerInternal.PACKAGE_UNINSTALLER;
import static android.content.pm.PackageManagerInternal.PACKAGE_VERIFIER;
import static android.os.Process.SYSTEM_UID;
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
@@ -31,7 +27,6 @@ import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.IActivityManager;
import android.content.Intent;
import android.content.pm.PackageManagerInternal.KnownPackage;
import android.content.pm.SuspendDialogInfo;
import android.os.Binder;
import android.os.Bundle;
@@ -489,13 +484,14 @@ public final class SuspendPackageHelper {
final String activeLauncherPackageName = defaultAppProvider.getDefaultHome(userId);
final String dialerPackageName = defaultAppProvider.getDefaultDialer(userId);
final String requiredInstallerPackage =
getKnownPackageName(snapshot, PACKAGE_INSTALLER, userId);
getKnownPackageName(snapshot, KnownPackages.PACKAGE_INSTALLER, userId);
final String requiredUninstallerPackage =
getKnownPackageName(snapshot, PACKAGE_UNINSTALLER, userId);
getKnownPackageName(snapshot, KnownPackages.PACKAGE_UNINSTALLER, userId);
final String requiredVerifierPackage =
getKnownPackageName(snapshot, PACKAGE_VERIFIER, userId);
getKnownPackageName(snapshot, KnownPackages.PACKAGE_VERIFIER, userId);
final String requiredPermissionControllerPackage =
getKnownPackageName(snapshot, PACKAGE_PERMISSION_CONTROLLER, userId);
getKnownPackageName(snapshot, KnownPackages.PACKAGE_PERMISSION_CONTROLLER,
userId);
for (int i = 0; i < packageNames.length; i++) {
canSuspend[i] = false;
final String packageName = packageNames[i];
@@ -638,8 +634,8 @@ public final class SuspendPackageHelper {
}
}
private String getKnownPackageName(@NonNull Computer snapshot, @KnownPackage int knownPackage,
int userId) {
private String getKnownPackageName(@NonNull Computer snapshot,
@KnownPackages.KnownPackage int knownPackage, int userId) {
final String[] knownPackages =
mPm.getKnownPackageNamesInternal(snapshot, knownPackage, userId);
return knownPackages.length > 0 ? knownPackages[0] : null;

View File

@@ -70,6 +70,7 @@ import com.android.internal.util.ArrayUtils;
import com.android.internal.util.XmlUtils;
import com.android.server.LocalServices;
import com.android.server.ServiceThread;
import com.android.server.pm.KnownPackages;
import com.android.server.pm.permission.LegacyPermissionManagerInternal.PackagesProvider;
import com.android.server.pm.permission.LegacyPermissionManagerInternal.SyncAdapterPackagesProvider;
@@ -585,19 +586,19 @@ final class DefaultPermissionGrantPolicy {
// Installer
grantSystemFixedPermissionsToSystemPackage(pm,
ArrayUtils.firstOrNull(getKnownPackages(
PackageManagerInternal.PACKAGE_INSTALLER, userId)),
KnownPackages.PACKAGE_INSTALLER, userId)),
userId, STORAGE_PERMISSIONS, NOTIFICATION_PERMISSIONS);
// Verifier
final String verifier = ArrayUtils.firstOrNull(getKnownPackages(
PackageManagerInternal.PACKAGE_VERIFIER, userId));
KnownPackages.PACKAGE_VERIFIER, userId));
grantSystemFixedPermissionsToSystemPackage(pm, verifier, userId, STORAGE_PERMISSIONS);
grantPermissionsToSystemPackage(pm, verifier, userId, PHONE_PERMISSIONS, SMS_PERMISSIONS,
NOTIFICATION_PERMISSIONS);
// SetupWizard
final String setupWizardPackage = ArrayUtils.firstOrNull(getKnownPackages(
PackageManagerInternal.PACKAGE_SETUP_WIZARD, userId));
KnownPackages.PACKAGE_SETUP_WIZARD, userId));
grantPermissionsToSystemPackage(pm, setupWizardPackage, userId, PHONE_PERMISSIONS,
CONTACTS_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS, CAMERA_PERMISSIONS);
grantSystemFixedPermissionsToSystemPackage(pm, setupWizardPackage, userId,
@@ -758,7 +759,7 @@ final class DefaultPermissionGrantPolicy {
// Browser
String browserPackage = ArrayUtils.firstOrNull(getKnownPackages(
PackageManagerInternal.PACKAGE_BROWSER, userId));
KnownPackages.PACKAGE_BROWSER, userId));
if (browserPackage == null) {
browserPackage = getDefaultSystemHandlerActivityPackageForCategory(pm,
Intent.CATEGORY_APP_BROWSER, userId);
@@ -890,7 +891,7 @@ final class DefaultPermissionGrantPolicy {
// TextClassifier Service
for (String textClassifierPackage :
getKnownPackages(PackageManagerInternal.PACKAGE_SYSTEM_TEXT_CLASSIFIER, userId)) {
getKnownPackages(KnownPackages.PACKAGE_SYSTEM_TEXT_CLASSIFIER, userId)) {
grantPermissionsToSystemPackage(pm, textClassifierPackage, userId,
COARSE_BACKGROUND_LOCATION_PERMISSIONS, CONTACTS_PERMISSIONS);
}

View File

@@ -126,6 +126,7 @@ import com.android.server.ServiceThread;
import com.android.server.SystemConfig;
import com.android.server.Watchdog;
import com.android.server.pm.ApexManager;
import com.android.server.pm.KnownPackages;
import com.android.server.pm.UserManagerInternal;
import com.android.server.pm.UserManagerService;
import com.android.server.pm.parsing.PackageInfoUtils;
@@ -3323,7 +3324,7 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
@NonNull Permission bp) {
// expect single system package
String systemPackageName = ArrayUtils.firstOrNull(mPackageManagerInt.getKnownPackageNames(
PackageManagerInternal.PACKAGE_SYSTEM, UserHandle.USER_SYSTEM));
KnownPackages.PACKAGE_SYSTEM, UserHandle.USER_SYSTEM));
final AndroidPackage systemPackage =
mPackageManagerInt.getPackage(systemPackageName);
// check if the package is allow to use this signature permission. A package is allowed to
@@ -3398,10 +3399,10 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
// permissions are needed by the permission controller
if (!allowed && bp.isInstaller()
&& (ArrayUtils.contains(mPackageManagerInt.getKnownPackageNames(
PackageManagerInternal.PACKAGE_INSTALLER, UserHandle.USER_SYSTEM),
KnownPackages.PACKAGE_INSTALLER, UserHandle.USER_SYSTEM),
pkg.getPackageName()) || ArrayUtils.contains(
mPackageManagerInt.getKnownPackageNames(
PackageManagerInternal.PACKAGE_PERMISSION_CONTROLLER,
KnownPackages.PACKAGE_PERMISSION_CONTROLLER,
UserHandle.USER_SYSTEM), pkg.getPackageName()))) {
// If this permission is to be granted to the system installer and
// this app is an installer, then it gets the permission.
@@ -3409,7 +3410,7 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
}
if (!allowed && bp.isVerifier()
&& ArrayUtils.contains(mPackageManagerInt.getKnownPackageNames(
PackageManagerInternal.PACKAGE_VERIFIER, UserHandle.USER_SYSTEM),
KnownPackages.PACKAGE_VERIFIER, UserHandle.USER_SYSTEM),
pkg.getPackageName())) {
// If this permission is to be granted to the system verifier and
// this app is a verifier, then it gets the permission.
@@ -3433,7 +3434,7 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
//}
if (!allowed && bp.isSetup()
&& ArrayUtils.contains(mPackageManagerInt.getKnownPackageNames(
PackageManagerInternal.PACKAGE_SETUP_WIZARD, UserHandle.USER_SYSTEM),
KnownPackages.PACKAGE_SETUP_WIZARD, UserHandle.USER_SYSTEM),
pkg.getPackageName())) {
// If this permission is to be granted to the system setup wizard and
// this app is a setup wizard, then it gets the permission.
@@ -3441,21 +3442,21 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
}
if (!allowed && bp.isSystemTextClassifier()
&& ArrayUtils.contains(mPackageManagerInt.getKnownPackageNames(
PackageManagerInternal.PACKAGE_SYSTEM_TEXT_CLASSIFIER,
KnownPackages.PACKAGE_SYSTEM_TEXT_CLASSIFIER,
UserHandle.USER_SYSTEM), pkg.getPackageName())) {
// Special permissions for the system default text classifier.
allowed = true;
}
if (!allowed && bp.isConfigurator()
&& ArrayUtils.contains(mPackageManagerInt.getKnownPackageNames(
PackageManagerInternal.PACKAGE_CONFIGURATOR,
KnownPackages.PACKAGE_CONFIGURATOR,
UserHandle.USER_SYSTEM), pkg.getPackageName())) {
// Special permissions for the device configurator.
allowed = true;
}
if (!allowed && bp.isIncidentReportApprover()
&& ArrayUtils.contains(mPackageManagerInt.getKnownPackageNames(
PackageManagerInternal.PACKAGE_INCIDENT_REPORT_APPROVER,
KnownPackages.PACKAGE_INCIDENT_REPORT_APPROVER,
UserHandle.USER_SYSTEM), pkg.getPackageName())) {
// If this permission is to be granted to the incident report approver and
// this app is the incident report approver, then it gets the permission.
@@ -3463,28 +3464,28 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
}
if (!allowed && bp.isAppPredictor()
&& ArrayUtils.contains(mPackageManagerInt.getKnownPackageNames(
PackageManagerInternal.PACKAGE_APP_PREDICTOR, UserHandle.USER_SYSTEM),
KnownPackages.PACKAGE_APP_PREDICTOR, UserHandle.USER_SYSTEM),
pkg.getPackageName())) {
// Special permissions for the system app predictor.
allowed = true;
}
if (!allowed && bp.isCompanion()
&& ArrayUtils.contains(mPackageManagerInt.getKnownPackageNames(
PackageManagerInternal.PACKAGE_COMPANION, UserHandle.USER_SYSTEM),
KnownPackages.PACKAGE_COMPANION, UserHandle.USER_SYSTEM),
pkg.getPackageName())) {
// Special permissions for the system companion device manager.
allowed = true;
}
if (!allowed && bp.isRetailDemo()
&& ArrayUtils.contains(mPackageManagerInt.getKnownPackageNames(
PackageManagerInternal.PACKAGE_RETAIL_DEMO, UserHandle.USER_SYSTEM),
KnownPackages.PACKAGE_RETAIL_DEMO, UserHandle.USER_SYSTEM),
pkg.getPackageName()) && isProfileOwner(pkg.getUid())) {
// Special permission granted only to the OEM specified retail demo app
allowed = true;
}
if (!allowed && bp.isRecents()
&& ArrayUtils.contains(mPackageManagerInt.getKnownPackageNames(
PackageManagerInternal.PACKAGE_RECENTS, UserHandle.USER_SYSTEM),
KnownPackages.PACKAGE_RECENTS, UserHandle.USER_SYSTEM),
pkg.getPackageName())) {
// Special permission for the recents app.
allowed = true;

View File

@@ -47,13 +47,11 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.ArrayUtils;
import com.android.server.IntentResolver;
import com.android.server.pm.Computer;
import com.android.server.pm.DumpState;
import com.android.server.pm.PackageManagerException;
import com.android.server.pm.UserManagerService;
import com.android.server.pm.UserNeedsBadgingCache;
import com.android.server.pm.parsing.PackageInfoUtils;
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 com.android.server.pm.pkg.PackageUserStateInternal;
@@ -76,7 +74,6 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
@@ -271,119 +268,6 @@ public class ComponentResolver extends ComponentResolverLocked implements Snappa
}
}
public void dumpActivityResolvers(PrintWriter pw, DumpState dumpState, String packageName) {
synchronized (mLock) {
if (mActivities.dump(pw, dumpState.getTitlePrinted() ? "\nActivity Resolver Table:"
: "Activity Resolver Table:", " ", packageName,
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS), true)) {
dumpState.setTitlePrinted(true);
}
}
}
public void dumpProviderResolvers(PrintWriter pw, DumpState dumpState, String packageName) {
synchronized (mLock) {
if (mProviders.dump(pw, dumpState.getTitlePrinted() ? "\nProvider Resolver Table:"
: "Provider Resolver Table:", " ", packageName,
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS), true)) {
dumpState.setTitlePrinted(true);
}
}
}
public void dumpReceiverResolvers(PrintWriter pw, DumpState dumpState, String packageName) {
synchronized (mLock) {
if (mReceivers.dump(pw, dumpState.getTitlePrinted() ? "\nReceiver Resolver Table:"
: "Receiver Resolver Table:", " ", packageName,
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS), true)) {
dumpState.setTitlePrinted(true);
}
}
}
public void dumpServiceResolvers(PrintWriter pw, DumpState dumpState, String packageName) {
synchronized (mLock) {
if (mServices.dump(pw, dumpState.getTitlePrinted() ? "\nService Resolver Table:"
: "Service Resolver Table:", " ", packageName,
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS), true)) {
dumpState.setTitlePrinted(true);
}
}
}
public void dumpContentProviders(@NonNull Computer computer, PrintWriter pw,
DumpState dumpState, String packageName) {
synchronized (mLock) {
boolean printedSomething = false;
for (ParsedProvider p : mProviders.mProviders.values()) {
if (packageName != null && !packageName.equals(p.getPackageName())) {
continue;
}
if (!printedSomething) {
if (dumpState.onTitlePrinted()) {
pw.println();
}
pw.println("Registered ContentProviders:");
printedSomething = true;
}
pw.print(" ");
ComponentName.printShortString(pw, p.getPackageName(), p.getName());
pw.println(":");
pw.print(" ");
pw.println(p.toString());
}
printedSomething = false;
for (Map.Entry<String, ParsedProvider> entry :
mProvidersByAuthority.entrySet()) {
ParsedProvider p = entry.getValue();
if (packageName != null && !packageName.equals(p.getPackageName())) {
continue;
}
if (!printedSomething) {
if (dumpState.onTitlePrinted()) {
pw.println();
}
pw.println("ContentProvider Authorities:");
printedSomething = true;
}
pw.print(" [");
pw.print(entry.getKey());
pw.println("]:");
pw.print(" ");
pw.println(p.toString());
AndroidPackage pkg = computer.getPackage(p.getPackageName());
if (pkg != null) {
pw.print(" applicationInfo=");
pw.println(AndroidPackageUtils.generateAppInfoWithoutState(pkg));
}
}
}
}
public void dumpServicePermissions(PrintWriter pw, DumpState dumpState) {
synchronized (mLock) {
if (dumpState.onTitlePrinted()) pw.println();
pw.println("Service permissions:");
final Iterator<Pair<ParsedService, ParsedIntentInfo>> filterIterator =
mServices.filterIterator();
while (filterIterator.hasNext()) {
final Pair<ParsedService, ParsedIntentInfo> pair = filterIterator.next();
ParsedService service = pair.first;
final String permission = service.getPermission();
if (permission != null) {
pw.print(" ");
pw.print(service.getComponentName().flattenToShortString());
pw.print(": ");
pw.println(permission);
}
}
}
}
@GuardedBy("mLock")
private void addActivitiesLocked(@NonNull Computer computer, AndroidPackage pkg,
List<Pair<ParsedActivity, ParsedIntentInfo>> newIntents, boolean chatty) {

View File

@@ -26,10 +26,12 @@ import android.content.pm.ResolveInfo;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.pm.Computer;
import com.android.server.pm.DumpState;
import com.android.server.pm.pkg.component.ParsedActivity;
import com.android.server.pm.pkg.component.ParsedProvider;
import com.android.server.pm.pkg.component.ParsedService;
import java.io.PrintWriter;
import java.util.List;
public interface ComponentResolverApi {
@@ -97,4 +99,21 @@ public interface ComponentResolverApi {
void querySyncProviders(@NonNull Computer computer, @NonNull List<String> outNames,
@NonNull List<ProviderInfo> outInfo, boolean safeMode, @UserIdInt int userId);
void dumpActivityResolvers(@NonNull PrintWriter pw, @NonNull DumpState dumpState,
@NonNull String packageName);
void dumpProviderResolvers(@NonNull PrintWriter pw, @NonNull DumpState dumpState,
@NonNull String packageName);
void dumpReceiverResolvers(@NonNull PrintWriter pw, @NonNull DumpState dumpState,
@NonNull String packageName);
void dumpServiceResolvers(@NonNull PrintWriter pw, @NonNull DumpState dumpState,
@NonNull String packageName);
void dumpContentProviders(@NonNull Computer computer, @NonNull PrintWriter pw,
@NonNull DumpState dumpState, @NonNull String packageName);
void dumpServicePermissions(@NonNull PrintWriter pw, @NonNull DumpState dumpState);
}

View File

@@ -26,21 +26,28 @@ import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.Pair;
import com.android.server.pm.Computer;
import com.android.server.pm.DumpState;
import com.android.server.pm.UserManagerService;
import com.android.server.pm.parsing.PackageInfoUtils;
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.PackageUserStateInternal;
import com.android.server.pm.pkg.component.ParsedActivity;
import com.android.server.pm.pkg.component.ParsedIntentInfo;
import com.android.server.pm.pkg.component.ParsedMainComponent;
import com.android.server.pm.pkg.component.ParsedProvider;
import com.android.server.pm.pkg.component.ParsedService;
import com.android.server.utils.WatchableImpl;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public abstract class ComponentResolverBase extends WatchableImpl implements ComponentResolverApi {
@@ -305,4 +312,116 @@ public abstract class ComponentResolverBase extends WatchableImpl implements Com
outInfo.add(info);
}
}
@Override
public void dumpActivityResolvers(@NonNull PrintWriter pw, @NonNull DumpState dumpState,
@NonNull String packageName) {
if (mActivities.dump(pw, dumpState.getTitlePrinted() ? "\nActivity Resolver Table:"
: "Activity Resolver Table:", " ", packageName,
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS), true)) {
dumpState.setTitlePrinted(true);
}
}
@Override
public void dumpProviderResolvers(@NonNull PrintWriter pw, @NonNull DumpState dumpState,
@NonNull String packageName) {
if (mProviders.dump(pw, dumpState.getTitlePrinted() ? "\nProvider Resolver Table:"
: "Provider Resolver Table:", " ", packageName,
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS), true)) {
dumpState.setTitlePrinted(true);
}
}
@Override
public void dumpReceiverResolvers(@NonNull PrintWriter pw, @NonNull DumpState dumpState,
@NonNull String packageName) {
if (mReceivers.dump(pw, dumpState.getTitlePrinted() ? "\nReceiver Resolver Table:"
: "Receiver Resolver Table:", " ", packageName,
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS), true)) {
dumpState.setTitlePrinted(true);
}
}
@Override
public void dumpServiceResolvers(@NonNull PrintWriter pw, @NonNull DumpState dumpState,
@NonNull String packageName) {
if (mServices.dump(pw, dumpState.getTitlePrinted() ? "\nService Resolver Table:"
: "Service Resolver Table:", " ", packageName,
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS), true)) {
dumpState.setTitlePrinted(true);
}
}
@Override
public void dumpContentProviders(@NonNull Computer computer, @NonNull PrintWriter pw,
@NonNull DumpState dumpState, @NonNull String packageName) {
boolean printedSomething = false;
for (ParsedProvider p : mProviders.mProviders.values()) {
if (packageName != null && !packageName.equals(p.getPackageName())) {
continue;
}
if (!printedSomething) {
if (dumpState.onTitlePrinted()) {
pw.println();
}
pw.println("Registered ContentProviders:");
printedSomething = true;
}
pw.print(" ");
ComponentName.printShortString(pw, p.getPackageName(), p.getName());
pw.println(":");
pw.print(" ");
pw.println(p.toString());
}
printedSomething = false;
for (Map.Entry<String, ParsedProvider> entry :
mProvidersByAuthority.entrySet()) {
ParsedProvider p = entry.getValue();
if (packageName != null && !packageName.equals(p.getPackageName())) {
continue;
}
if (!printedSomething) {
if (dumpState.onTitlePrinted()) {
pw.println();
}
pw.println("ContentProvider Authorities:");
printedSomething = true;
}
pw.print(" [");
pw.print(entry.getKey());
pw.println("]:");
pw.print(" ");
pw.println(p.toString());
AndroidPackage pkg = computer.getPackage(p.getPackageName());
if (pkg != null) {
pw.print(" applicationInfo=");
pw.println(AndroidPackageUtils.generateAppInfoWithoutState(pkg));
}
}
}
@Override
public void dumpServicePermissions(@NonNull PrintWriter pw, @NonNull DumpState dumpState) {
if (dumpState.onTitlePrinted()) pw.println();
pw.println("Service permissions:");
final Iterator<Pair<ParsedService, ParsedIntentInfo>> filterIterator =
mServices.filterIterator();
while (filterIterator.hasNext()) {
final Pair<ParsedService, ParsedIntentInfo> pair = filterIterator.next();
ParsedService service = pair.first;
final String permission = service.getPermission();
if (permission != null) {
pw.print(" ");
pw.print(service.getComponentName().flattenToShortString());
pw.print(": ");
pw.println(permission);
}
}
}
}

View File

@@ -25,12 +25,14 @@ import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import com.android.server.pm.Computer;
import com.android.server.pm.DumpState;
import com.android.server.pm.PackageManagerTracedLock;
import com.android.server.pm.UserManagerService;
import com.android.server.pm.pkg.component.ParsedActivity;
import com.android.server.pm.pkg.component.ParsedProvider;
import com.android.server.pm.pkg.component.ParsedService;
import java.io.PrintWriter;
import java.util.List;
public abstract class ComponentResolverLocked extends ComponentResolverBase {
@@ -189,4 +191,51 @@ public abstract class ComponentResolverLocked extends ComponentResolverBase {
super.querySyncProviders(computer, outNames, outInfo, safeMode, userId);
}
}
@Override
public void dumpActivityResolvers(@NonNull PrintWriter pw, @NonNull DumpState dumpState,
@NonNull String packageName) {
synchronized (mLock) {
super.dumpActivityResolvers(pw, dumpState, packageName);
}
}
@Override
public void dumpProviderResolvers(@NonNull PrintWriter pw, @NonNull DumpState dumpState,
@NonNull String packageName) {
synchronized (mLock) {
super.dumpProviderResolvers(pw, dumpState, packageName);
}
}
@Override
public void dumpReceiverResolvers(@NonNull PrintWriter pw, @NonNull DumpState dumpState,
@NonNull String packageName) {
synchronized (mLock) {
super.dumpReceiverResolvers(pw, dumpState, packageName);
}
}
@Override
public void dumpServiceResolvers(@NonNull PrintWriter pw, @NonNull DumpState dumpState,
@NonNull String packageName) {
synchronized (mLock) {
super.dumpServiceResolvers(pw, dumpState, packageName);
}
}
@Override
public void dumpContentProviders(@NonNull Computer computer, @NonNull PrintWriter pw,
@NonNull DumpState dumpState, @NonNull String packageName) {
synchronized (mLock) {
super.dumpContentProviders(computer, pw, dumpState, packageName);
}
}
@Override
public void dumpServicePermissions(@NonNull PrintWriter pw, @NonNull DumpState dumpState) {
synchronized (mLock) {
super.dumpServicePermissions(pw, dumpState);
}
}
}

View File

@@ -20,6 +20,8 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.util.ArraySet;
import java.util.Collection;
/**
* WatchedArraySet is an {@link android.util.ArraySet} that can report changes to itself. If its
* values are {@link Watchable} then the WatchedArraySet will also report changes to the values.
@@ -280,13 +282,11 @@ public class WatchedArraySet<E> extends WatchableImpl
/**
* Perform a {@link #add(Object)} of all values in <var>array</var>
* @param array The array whose contents are to be retrieved.
* @param collection The collection whose contents are to be retrieved.
*/
public void addAll(ArraySet<? extends E> array) {
final int end = array.size();
for (int i = 0; i < end; i++) {
add(array.valueAt(i));
}
public void addAll(Collection<? extends E> collection) {
mStorage.addAll(collection);
onChanged();
}
/**

View File

@@ -85,6 +85,7 @@ import com.android.internal.policy.IKeyguardDismissCallback;
import com.android.internal.protolog.common.ProtoLog;
import com.android.server.LocalServices;
import com.android.server.Watchdog;
import com.android.server.pm.KnownPackages;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.uri.NeededUriGrants;
import com.android.server.vr.VrManagerInternal;
@@ -627,7 +628,7 @@ class ActivityClientController extends IActivityClientController.Stub {
return true;
}
final String[] installerNames = pm.getKnownPackageNames(
PackageManagerInternal.PACKAGE_INSTALLER, UserHandle.getUserId(uid));
KnownPackages.PACKAGE_INSTALLER, UserHandle.getUserId(uid));
return installerNames.length > 0 && callingPkg.getPackageName().equals(installerNames[0]);
}

View File

@@ -17,7 +17,6 @@
package com.android.server.pm
import android.content.Intent
import android.content.pm.PackageManagerInternal
import android.content.pm.SuspendDialogInfo
import android.os.Binder
import android.os.Build
@@ -27,6 +26,7 @@ import android.os.UserHandle
import android.os.UserManager
import android.util.ArrayMap
import android.util.SparseArray
import com.android.server.pm.KnownPackages
import com.android.server.pm.pkg.PackageStateInternal
import com.android.server.testutils.TestHandler
import com.android.server.testutils.any
@@ -484,14 +484,14 @@ class SuspendPackageHelperTest {
Mockito.doReturn(DIALER_PACKAGE).`when`(defaultAppProvider)
.getDefaultDialer(eq(TEST_USER_ID))
Mockito.doReturn(arrayOf(INSTALLER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal(
any(), eq(PackageManagerInternal.PACKAGE_INSTALLER), eq(TEST_USER_ID))
any(), eq(KnownPackages.PACKAGE_INSTALLER), eq(TEST_USER_ID))
Mockito.doReturn(arrayOf(UNINSTALLER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal(
any(), eq(PackageManagerInternal.PACKAGE_UNINSTALLER), eq(TEST_USER_ID))
any(), eq(KnownPackages.PACKAGE_UNINSTALLER), eq(TEST_USER_ID))
Mockito.doReturn(arrayOf(VERIFIER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal(
any(), eq(PackageManagerInternal.PACKAGE_VERIFIER), eq(TEST_USER_ID))
any(), eq(KnownPackages.PACKAGE_VERIFIER), eq(TEST_USER_ID))
Mockito.doReturn(arrayOf(PERMISSION_CONTROLLER_PACKAGE)).`when`(pms)
.getKnownPackageNamesInternal(any(),
eq(PackageManagerInternal.PACKAGE_PERMISSION_CONTROLLER), eq(TEST_USER_ID))
eq(KnownPackages.PACKAGE_PERMISSION_CONTROLLER), eq(TEST_USER_ID))
}
private fun createPackageManagerService(vararg stageExistingPackages: String):

View File

@@ -189,8 +189,8 @@ public class PackageManagerServiceTest {
@Test
public void testKnownPackageToString_shouldNotGetUnknown() {
final List<String> packageNames = new ArrayList<>();
for (int i = 0; i <= PackageManagerInternal.LAST_KNOWN_PACKAGE; i++) {
packageNames.add(PackageManagerInternal.knownPackageToString(i));
for (int i = 0; i <= KnownPackages.LAST_KNOWN_PACKAGE; i++) {
packageNames.add(KnownPackages.knownPackageToString(i));
}
assertWithMessage(
"The Ids of KnownPackage should be continuous and the string representation "
@@ -205,7 +205,7 @@ public class PackageManagerServiceTest {
"The last KnownPackage Id should be assigned to PackageManagerInternal"
+ ".LAST_KNOWN_PACKAGE.").that(
knownPackageIds.get(knownPackageIds.size() - 1)).isEqualTo(
PackageManagerInternal.LAST_KNOWN_PACKAGE);
KnownPackages.LAST_KNOWN_PACKAGE);
}
@Test
@@ -470,7 +470,7 @@ public class PackageManagerServiceTest {
private List<Integer> getKnownPackageIdsList() throws IllegalAccessException {
final ArrayList<Integer> knownPackageIds = new ArrayList<>();
final Field[] allFields = PackageManagerInternal.class.getDeclaredFields();
final Field[] allFields = KnownPackages.class.getDeclaredFields();
for (Field field : allFields) {
final int modifier = field.getModifiers();
if (isPublic(modifier) && isStatic(modifier) && isFinal(modifier)