Only dump necessary info when specifying a package

Revise the logic of dump to drop unnecessary sections that aren't
relevant to the given package name. Besides, align the style of
each logic block.

Fix: 187415768
Test: manually check the result of 'dumpsys package' whether:
      1. any section that has data relevant to the given package
         name is missing.
      2. print 'Unable to find package' when the given package
         name doesn't exist.
Change-Id: Ide350d2b303fe6536ebd75e3bf7d7c9f54f4e0dd
This commit is contained in:
Jackal Guo
2021-08-25 16:14:26 +08:00
parent 3ae8aa529c
commit 1949f82e92

View File

@@ -4610,8 +4610,14 @@ public class PackageManagerService extends IPackageManager.Stub
public void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) {
final String packageName = dumpState.getTargetPackageName();
final PackageSetting setting = mSettings.getPackageLPr(packageName);
final boolean checkin = dumpState.isCheckIn();
// Return if the package doesn't exist.
if (packageName != null && setting == null) {
return;
}
switch (type) {
case DumpState.DUMP_VERSION:
{
@@ -4704,8 +4710,7 @@ public class PackageManagerService extends IPackageManager.Stub
case DumpState.DUMP_QUERIES:
{
final PackageSetting setting = mSettings.getPackageLPr(packageName);
Integer filteringAppId = setting == null ? null : setting.appId;
final Integer filteringAppId = setting == null ? null : setting.appId;
mAppsFilter.dumpQueries(
pw, filteringAppId, dumpState, mUserManager.getUserIds(),
this::getPackagesForUidInternalBody);
@@ -4716,8 +4721,9 @@ public class PackageManagerService extends IPackageManager.Stub
{
final android.util.IndentingPrintWriter writer =
new android.util.IndentingPrintWriter(pw);
if (dumpState.onTitlePrinted()) pw.println();
if (dumpState.onTitlePrinted()) {
pw.println();
}
writer.println("Domain verification status:");
writer.increaseIndent();
try {
@@ -4734,18 +4740,14 @@ public class PackageManagerService extends IPackageManager.Stub
case DumpState.DUMP_DEXOPT:
{
final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
ipw.println();
if (dumpState.onTitlePrinted()) {
pw.println();
}
ipw.println("Dexopt state:");
ipw.increaseIndent();
Collection<PackageSetting> pkgSettings;
if (packageName != null) {
PackageSetting targetPkgSetting = mSettings.getPackageLPr(packageName);
if (targetPkgSetting != null) {
pkgSettings = Collections.singletonList(targetPkgSetting);
} else {
ipw.println("Unable to find package: " + packageName);
return;
}
if (setting != null) {
pkgSettings = Collections.singletonList(setting);
} else {
pkgSettings = mSettings.getPackagesLocked().values();
}
@@ -4755,10 +4757,12 @@ public class PackageManagerService extends IPackageManager.Stub
if (pkg == null) {
continue;
}
ipw.println("[" + pkgSetting.name + "]");
final String pkgName = pkg.getPackageName();
ipw.println("[" + pkgName + "]");
ipw.increaseIndent();
mPackageDexOptimizer.dumpDexoptState(ipw, pkg, pkgSetting,
mDexManager.getPackageUseInfoOrDefault(pkg.getPackageName()));
mDexManager.getPackageUseInfoOrDefault(pkgName));
ipw.decreaseIndent();
}
break;
@@ -4767,28 +4771,29 @@ public class PackageManagerService extends IPackageManager.Stub
case DumpState.DUMP_COMPILER_STATS:
{
final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
ipw.println();
if (dumpState.onTitlePrinted()) {
pw.println();
}
ipw.println("Compiler stats:");
ipw.increaseIndent();
Collection<AndroidPackage> packages;
if (packageName != null) {
AndroidPackage targetPackage = mPackages.get(packageName);
if (targetPackage != null) {
packages = Collections.singletonList(targetPackage);
} else {
ipw.println("Unable to find package: " + packageName);
return;
}
Collection<PackageSetting> pkgSettings;
if (setting != null) {
pkgSettings = Collections.singletonList(setting);
} else {
packages = mPackages.values();
pkgSettings = mSettings.getPackagesLocked().values();
}
for (AndroidPackage pkg : packages) {
for (PackageSetting pkgSetting : pkgSettings) {
final AndroidPackage pkg = pkgSetting.getPkg();
if (pkg == null) {
continue;
}
final String pkgName = pkg.getPackageName();
ipw.println("[" + pkgName + "]");
ipw.increaseIndent();
CompilerStats.PackageStats stats = mCompilerStats.getPackageStats(pkgName);
final CompilerStats.PackageStats stats =
mCompilerStats.getPackageStats(pkgName);
if (stats == null) {
ipw.println("(No recorded stats)");
} else {
@@ -21090,15 +21095,24 @@ public class PackageManagerService extends IPackageManager.Stub
final String packageName = dumpState.getTargetPackageName();
final boolean checkin = dumpState.isCheckIn();
// Return if the package doesn't exist.
if (packageName != null
&& getPackageSetting(packageName) == null
&& !mApexManager.isApexPackage(packageName)) {
pw.println("Unable to find package: " + packageName);
return;
}
if (checkin) {
pw.println("vers,1");
}
// reader
if (dumpState.isDumping(DumpState.DUMP_VERSION) && packageName == null) {
if (!checkin) {
dump(DumpState.DUMP_VERSION, fd, pw, dumpState);
}
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_VERSION)
&& packageName == null) {
dump(DumpState.DUMP_VERSION, fd, pw, dumpState);
}
if (!checkin
@@ -21129,7 +21143,8 @@ public class PackageManagerService extends IPackageManager.Stub
ipw.decreaseIndent();
}
if (dumpState.isDumping(DumpState.DUMP_VERIFIERS) && packageName == null) {
if (dumpState.isDumping(DumpState.DUMP_VERIFIERS)
&& packageName == null) {
final String requiredVerifierPackage = mRequiredVerifierPackage;
if (!checkin) {
if (dumpState.onTitlePrinted()) {
@@ -21150,14 +21165,16 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
if (dumpState.isDumping(DumpState.DUMP_DOMAIN_VERIFIER) && packageName == null) {
if (dumpState.isDumping(DumpState.DUMP_DOMAIN_VERIFIER)
&& packageName == null) {
final DomainVerificationProxy proxy = mDomainVerificationManager.getProxy();
final ComponentName verifierComponent = proxy.getComponentName();
if (verifierComponent != null) {
String verifierPackageName = verifierComponent.getPackageName();
if (!checkin) {
if (dumpState.onTitlePrinted())
if (dumpState.onTitlePrinted()) {
pw.println();
}
pw.println("Domain Verifier:");
pw.print(" Using: ");
pw.print(verifierPackageName);
@@ -21177,11 +21194,13 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
if (dumpState.isDumping(DumpState.DUMP_LIBS) && packageName == null) {
if (dumpState.isDumping(DumpState.DUMP_LIBS)
&& packageName == null) {
dump(DumpState.DUMP_LIBS, fd, pw, dumpState);
}
if (dumpState.isDumping(DumpState.DUMP_FEATURES) && packageName == null) {
if (dumpState.isDumping(DumpState.DUMP_FEATURES)
&& packageName == null) {
if (dumpState.onTitlePrinted()) {
pw.println();
}
@@ -21191,12 +21210,7 @@ public class PackageManagerService extends IPackageManager.Stub
synchronized (mAvailableFeatures) {
for (FeatureInfo feat : mAvailableFeatures.values()) {
if (checkin) {
pw.print("feat,");
pw.print(feat.name);
pw.print(",");
pw.println(feat.version);
} else {
if (!checkin) {
pw.print(" ");
pw.print(feat.name);
if (feat.version > 0) {
@@ -21204,55 +21218,73 @@ public class PackageManagerService extends IPackageManager.Stub
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)) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_ACTIVITY_RESOLVERS)) {
synchronized (mLock) {
mComponentResolver.dumpActivityResolvers(pw, dumpState, packageName);
}
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_RECEIVER_RESOLVERS)) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_RECEIVER_RESOLVERS)) {
synchronized (mLock) {
mComponentResolver.dumpReceiverResolvers(pw, dumpState, packageName);
}
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_SERVICE_RESOLVERS)) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_SERVICE_RESOLVERS)) {
synchronized (mLock) {
mComponentResolver.dumpServiceResolvers(pw, dumpState, packageName);
}
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_CONTENT_RESOLVERS)) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_CONTENT_RESOLVERS)) {
synchronized (mLock) {
mComponentResolver.dumpProviderResolvers(pw, dumpState, packageName);
}
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_PREFERRED)) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_PREFERRED)) {
dump(DumpState.DUMP_PREFERRED, fd, pw, dumpState);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_PREFERRED_XML)) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_PREFERRED_XML)
&& packageName == null) {
dump(DumpState.DUMP_PREFERRED_XML, fd, pw, dumpState);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_DOMAIN_PREFERRED)) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_DOMAIN_PREFERRED)) {
dump(DumpState.DUMP_DOMAIN_PREFERRED, fd, pw, dumpState);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_PERMISSIONS)) {
mSettings.dumpPermissions(pw, packageName, permissionNames, dumpState);
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_PERMISSIONS)) {
synchronized (mLock) {
mSettings.dumpPermissions(pw, packageName, permissionNames, dumpState);
}
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_PROVIDERS)) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_PROVIDERS)) {
synchronized (mLock) {
mComponentResolver.dumpContentProviders(pw, dumpState, packageName);
}
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_KEYSETS)) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_KEYSETS)) {
synchronized (mLock) {
mSettings.getKeySetManagerService().dumpLPr(pw, packageName, dumpState);
}
@@ -21267,7 +21299,8 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
if (dumpState.isDumping(DumpState.DUMP_QUERIES)) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_QUERIES)) {
dump(DumpState.DUMP_QUERIES, fd, pw, dumpState);
}
@@ -21279,8 +21312,12 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
if (dumpState.isDumping(DumpState.DUMP_CHANGES)) {
if (dumpState.onTitlePrinted()) pw.println();
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_CHANGES)
&& packageName == null) {
if (dumpState.onTitlePrinted()) {
pw.println();
}
pw.println("Package Changes:");
synchronized (mLock) {
pw.print(" Sequence number="); pw.println(mChangedPackagesSequenceNumber);
@@ -21306,11 +21343,14 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_FROZEN) && packageName == null) {
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();
if (dumpState.onTitlePrinted()) {
pw.println();
}
final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120);
ipw.println();
ipw.println("Frozen packages:");
@@ -21327,9 +21367,12 @@ public class PackageManagerService extends IPackageManager.Stub
ipw.decreaseIndent();
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_VOLUMES) && packageName == null) {
if (dumpState.onTitlePrinted()) pw.println();
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:");
@@ -21346,52 +21389,65 @@ public class PackageManagerService extends IPackageManager.Stub
ipw.decreaseIndent();
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_SERVICE_PERMISSIONS)
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_SERVICE_PERMISSIONS)
&& packageName == null) {
synchronized (mLock) {
mComponentResolver.dumpServicePermissions(pw, dumpState);
}
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_DEXOPT)) {
if (dumpState.onTitlePrinted()) pw.println();
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_DEXOPT)) {
dump(DumpState.DUMP_DEXOPT, fd, pw, dumpState);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_COMPILER_STATS)) {
if (dumpState.onTitlePrinted()) pw.println();
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_COMPILER_STATS)) {
dump(DumpState.DUMP_COMPILER_STATS, fd, pw, dumpState);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_MESSAGES) && packageName == null) {
if (dumpState.onTitlePrinted()) pw.println();
synchronized (mLock) {
mSettings.dumpReadMessagesLPr(pw, dumpState);
if (dumpState.isDumping(DumpState.DUMP_MESSAGES)
&& packageName == null) {
if (!checkin) {
if (dumpState.onTitlePrinted()) {
pw.println();
}
synchronized (mLock) {
mSettings.dumpReadMessagesLPr(pw, dumpState);
}
pw.println();
pw.println("Package warning messages:");
dumpCriticalInfo(pw, null);
} else {
dumpCriticalInfo(pw, "msg,");
}
pw.println();
pw.println("Package warning messages:");
dumpCriticalInfo(pw, null);
}
if (checkin && dumpState.isDumping(DumpState.DUMP_MESSAGES)) {
dumpCriticalInfo(pw, "msg,");
}
// PackageInstaller should be called outside of mPackages lock
if (!checkin && dumpState.isDumping(DumpState.DUMP_INSTALLS) && packageName == null) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_INSTALLS)
&& packageName == null) {
// XXX should handle packageName != null by dumping only install data that
// the given package is involved with.
if (dumpState.onTitlePrinted()) pw.println();
if (dumpState.onTitlePrinted()) {
pw.println();
}
mInstallerService.dump(new IndentingPrintWriter(pw, " ", 120));
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_APEX)) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_APEX)
&& (packageName == null || mApexManager.isApexPackage(packageName))) {
mApexManager.dump(pw, packageName);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_PER_UID_READ_TIMEOUTS)
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_PER_UID_READ_TIMEOUTS)
&& packageName == null) {
pw.println();
if (dumpState.onTitlePrinted()) {
pw.println();
}
pw.println("Per UID read timeouts:");
pw.println(" Default timeouts flag: " + getDefaultTimeouts());
pw.println(" Known digesters list flag: " + getKnownDigestersList());
@@ -21408,7 +21464,12 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_SNAPSHOT_STATISTICS)) {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_SNAPSHOT_STATISTICS)
&& packageName == null) {
if (dumpState.onTitlePrinted()) {
pw.println();
}
pw.println("Snapshot statistics");
if (!mSnapshotEnabled) {
pw.println(" Snapshots disabled");