From 9f9bf2d97b082c6776003fe3d325fe503619e919 Mon Sep 17 00:00:00 2001 From: Martijn Coenen Date: Thu, 31 Jan 2019 16:56:30 +0100 Subject: [PATCH] Include APEX information in PackageManager dumpsys. Dump information about active APEXes and (staged) session state. Bug: 118865310 Test: adb shell dumpsys package Change-Id: Id939328b85f76658e8b55e05a90915a0aca178bf --- .../java/com/android/server/pm/DumpState.java | 1 + .../server/pm/PackageManagerService.java | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/services/core/java/com/android/server/pm/DumpState.java b/services/core/java/com/android/server/pm/DumpState.java index fe81133726975..89895c5232754 100644 --- a/services/core/java/com/android/server/pm/DumpState.java +++ b/services/core/java/com/android/server/pm/DumpState.java @@ -41,6 +41,7 @@ public final class DumpState { public static final int DUMP_CHANGES = 1 << 22; public static final int DUMP_VOLUMES = 1 << 23; public static final int DUMP_SERVICE_PERMISSIONS = 1 << 24; + public static final int DUMP_APEX = 1 << 25; public static final int OPTION_SHOW_FILTERS = 1 << 0; public static final int OPTION_DUMP_ALL_COMPONENTS = 1 << 1; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 6eff8155dffaa..193ffd1b4cd38 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -121,6 +121,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.apex.ApexInfo; +import android.apex.ApexSessionInfo; import android.apex.IApexService; import android.app.ActivityManager; import android.app.ActivityManagerInternal; @@ -20783,6 +20784,7 @@ public class PackageManagerService extends IPackageManager.Stub pw.println(" -h: print this help"); pw.println(" --all-components: include all component names in package dump"); pw.println(" cmd may be one of:"); + pw.println(" apex: list active APEXes and APEX session state"); pw.println(" l[ibraries]: list known shared libraries"); pw.println(" f[eatures]: list device features"); pw.println(" k[eysets]: print known keysets"); @@ -21311,6 +21313,54 @@ public class PackageManagerService extends IPackageManager.Stub if (dumpState.onTitlePrinted()) pw.println(); mInstallerService.dump(new IndentingPrintWriter(pw, " ", 120)); } + + if (!checkin && dumpState.isDumping(DumpState.DUMP_APEX)) { + final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120); + ipw.println(); + ipw.println("Active APEX packages:"); + ipw.increaseIndent(); + final IApexService apex = IApexService.Stub.asInterface( + ServiceManager.getService("apexservice")); + try { + final ApexInfo[] activeApexes = apex.getActivePackages(); + for (ApexInfo ai : activeApexes) { + if (packageName != null && !packageName.equals(ai.packageName)) { + continue; + } + ipw.println(ai.packageName); + ipw.increaseIndent(); + ipw.println("Version: " + Long.toString(ai.versionCode)); + ipw.println("Path: " + ai.packagePath); + ipw.decreaseIndent(); + } + ipw.decreaseIndent(); + ipw.println(); + ipw.println("APEX session state:"); + ipw.increaseIndent(); + final ApexSessionInfo[] sessions = apex.getSessions(); + for (ApexSessionInfo si : sessions) { + ipw.println("Session ID: " + Integer.toString(si.sessionId)); + ipw.increaseIndent(); + if (si.isUnknown) { + ipw.println("State: UNKNOWN"); + } else if (si.isVerified) { + ipw.println("State: VERIFIED"); + } else if (si.isStaged) { + ipw.println("State: STAGED"); + } else if (si.isActivated) { + ipw.println("State: ACTIVATED"); + } else if (si.isActivationPendingRetry) { + ipw.println("State: ACTIVATION PENDING RETRY"); + } else if (si.isActivationFailed) { + ipw.println("State: ACTIVATION FAILED"); + } + ipw.decreaseIndent(); + } + ipw.decreaseIndent(); + } catch (RemoteException e) { + ipw.println("Couldn't communicate with apexd."); + } + } } //TODO: b/111402650