diff options
| author | 2016-05-02 14:44:31 +0100 | |
|---|---|---|
| committer | 2016-05-10 08:51:56 +0000 | |
| commit | 88eea9e580a6b2ee804a092f851b5325355fcdce (patch) | |
| tree | 882cdc1efc2d551728e583280279608910ea5f32 | |
| parent | 875e99443f6c56d71090b8bedddd71f2b9601787 (diff) | |
Add a command to print package dexopt status.
Can be invoked like so :
$adb shell dumpsys package dexopt
$adb shell dumpsys package dexopt <packageName>
bug: 27494108
Change-Id: Ie91f744aeac772e0e22abc9c805df9290a4e2418
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageDexOptimizer.java | 27 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 35 |
2 files changed, 62 insertions, 0 deletions
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<String> 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 <permission> <package> [<user>]: does pkg hold perm?"); + pw.println(" dexopt: dump dexopt state"); pw.println(" <package.name>: 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<PackageParser.Package> 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<IntentFilterVerificationInfo> iviList = getIntentFilterVerifications(packageName) .getList(); |