From 88eea9e580a6b2ee804a092f851b5325355fcdce Mon Sep 17 00:00:00 2001 From: Narayan Kamath Date: Mon, 2 May 2016 14:44:31 +0100 Subject: Add a command to print package dexopt status. Can be invoked like so : $adb shell dumpsys package dexopt $adb shell dumpsys package dexopt bug: 27494108 Change-Id: Ie91f744aeac772e0e22abc9c805df9290a4e2418 --- .../com/android/server/pm/PackageDexOptimizer.java | 27 +++++++++++++++++ .../android/server/pm/PackageManagerService.java | 35 ++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index f134e40b9c59..89747b5f79b7 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -28,6 +28,7 @@ import android.util.Log; import android.util.Slog; import com.android.internal.os.InstallerConnection.InstallerException; +import com.android.internal.util.IndentingPrintWriter; import java.io.File; import java.io.IOException; @@ -122,6 +123,32 @@ class PackageDexOptimizer { return dexoptFlags; } + /** + * Dumps the dexopt state of the given package {@code pkg} to the given {@code PrintWriter}. + */ + void dumpDexoptState(IndentingPrintWriter pw, PackageParser.Package pkg) { + final String[] instructionSets = getAppDexInstructionSets(pkg.applicationInfo); + final String[] dexCodeInstructionSets = getDexCodeInstructionSets(instructionSets); + + final List paths = pkg.getAllCodePathsExcludingResourceOnly(); + + for (String instructionSet : dexCodeInstructionSets) { + pw.println("Instruction Set: " + instructionSet); + pw.increaseIndent(); + for (String path : paths) { + String status = null; + try { + status = DexFile.getDexFileStatus(path, instructionSet); + } catch (IOException ioe) { + status = "[Exception]: " + ioe.getMessage(); + } + pw.println("path: " + path); + pw.println("status: " + status); + } + pw.decreaseIndent(); + } + } + private int performDexOptLI(PackageParser.Package pkg, String[] sharedLibraries, String[] targetInstructionSets, boolean checkProfiles, String targetCompilerFilter) { final String[] instructionSets = targetInstructionSets != null ? diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index d7693b0ebe61..96bfe4a27a0a 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -17782,6 +17782,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); public static final int DUMP_INTENT_FILTER_VERIFIERS = 1 << 17; public static final int DUMP_DOMAIN_PREFERRED = 1 << 18; public static final int DUMP_FROZEN = 1 << 19; + public static final int DUMP_DEXOPT = 1 << 20; public static final int OPTION_SHOW_FILTERS = 1 << 0; @@ -17898,6 +17899,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); pw.println(" write: write current settings now"); pw.println(" installs: details about install sessions"); pw.println(" check-permission []: does pkg hold perm?"); + pw.println(" dexopt: dump dexopt state"); pw.println(" : info about given package"); return; } else if ("--checkin".equals(opt)) { @@ -18017,6 +18019,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); dumpState.setDump(DumpState.DUMP_INSTALLS); } else if ("frozen".equals(cmd)) { dumpState.setDump(DumpState.DUMP_FROZEN); + } else if ("dexopt".equals(cmd)) { + dumpState.setDump(DumpState.DUMP_DEXOPT); } else if ("write".equals(cmd)) { synchronized (mPackages) { mSettings.writeLPr(); @@ -18374,6 +18378,11 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); ipw.decreaseIndent(); } + if (!checkin && dumpState.isDumping(DumpState.DUMP_DEXOPT)) { + if (dumpState.onTitlePrinted()) pw.println(); + dumpDexoptStateLPr(pw, packageName); + } + if (!checkin && dumpState.isDumping(DumpState.DUMP_MESSAGES) && packageName == null) { if (dumpState.onTitlePrinted()) pw.println(); mSettings.dumpReadMessagesLPr(pw, dumpState); @@ -18412,6 +18421,32 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } } + private void dumpDexoptStateLPr(PrintWriter pw, String packageName) { + final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120); + ipw.println(); + ipw.println("Dexopt state:"); + ipw.increaseIndent(); + Collection packages = null; + if (packageName != null) { + PackageParser.Package targetPackage = mPackages.get(packageName); + if (targetPackage != null) { + packages = Collections.singletonList(targetPackage); + } else { + ipw.println("Unable to find package: " + packageName); + return; + } + } else { + packages = mPackages.values(); + } + + for (PackageParser.Package pkg : packages) { + ipw.println("[" + pkg.packageName + "]"); + ipw.increaseIndent(); + mPackageDexOptimizer.dumpDexoptState(ipw, pkg); + ipw.decreaseIndent(); + } + } + private String dumpDomainString(String packageName) { List iviList = getIntentFilterVerifications(packageName) .getList(); -- cgit v1.2.3-59-g8ed1b