Merge "[pm] remove mPm reference from DumpHelper" into tm-dev
This commit is contained in:
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 =
|
||||
|
||||
213
services/core/java/com/android/server/pm/KnownPackages.java
Normal file
213
services/core/java/com/android/server/pm/KnownPackages.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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())) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -115,4 +115,5 @@ public final class PackageManagerServiceTestParams {
|
||||
public ResolveIntentHelper resolveIntentHelper;
|
||||
public DexOptHelper dexOptHelper;
|
||||
public SuspendPackageHelper suspendPackageHelper;
|
||||
public StorageEventHelper storageEventHelper;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user