diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageDexOptimizer.java | 65 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 3 |
2 files changed, 52 insertions, 16 deletions
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index b72abc79ed19..2f4f5ab723da 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -40,6 +40,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Map; import dalvik.system.DexFile; @@ -380,26 +381,60 @@ public class PackageDexOptimizer { /** * Dumps the dexopt state of the given package {@code pkg} to the given {@code PrintWriter}. */ - void dumpDexoptState(IndentingPrintWriter pw, PackageParser.Package pkg) { + void dumpDexoptState(IndentingPrintWriter pw, PackageParser.Package pkg, + PackageDexUsage.PackageUseInfo useInfo) { 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(); + for (String path : paths) { + pw.println("path: " + path); + pw.increaseIndent(); + + for (String isa : dexCodeInstructionSets) { + String status = null; + try { + status = DexFile.getDexFileStatus(path, isa); + } catch (IOException ioe) { + status = "[Exception]: " + ioe.getMessage(); + } + pw.println(isa + ": " + status); + } + + if (useInfo.isUsedByOtherApps(path)) { + pw.println("used be other apps: " + useInfo.getLoadingPackages(path)); + } + + Map<String, PackageDexUsage.DexUseInfo> dexUseInfoMap = useInfo.getDexUseInfoMap(); + + if (!dexUseInfoMap.isEmpty()) { + pw.println("known secondary dex files:"); + pw.increaseIndent(); + for (Map.Entry<String, PackageDexUsage.DexUseInfo> e : dexUseInfoMap.entrySet()) { + String dex = e.getKey(); + PackageDexUsage.DexUseInfo dexUseInfo = e.getValue(); + pw.println(dex); + pw.increaseIndent(); + for (String isa : dexUseInfo.getLoaderIsas()) { + String status = null; + try { + status = DexFile.getDexFileStatus(path, isa); + } catch (IOException ioe) { + status = "[Exception]: " + ioe.getMessage(); + } + pw.println(isa + ": " + status); + } + + pw.println("class loader context: " + dexUseInfo.getClassLoaderContext()); + if (dexUseInfo.isUsedByOtherApps()) { + pw.println("used be other apps: " + dexUseInfo.getLoadingPackages()); + } + pw.decreaseIndent(); + } + pw.decreaseIndent(); + } + pw.decreaseIndent(); } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 90515df2ff62..48f8622ec5de 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -22872,7 +22872,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); for (PackageParser.Package pkg : packages) { ipw.println("[" + pkg.packageName + "]"); ipw.increaseIndent(); - mPackageDexOptimizer.dumpDexoptState(ipw, pkg); + mPackageDexOptimizer.dumpDexoptState(ipw, pkg, + mDexManager.getPackageUseInfoOrDefault(pkg.packageName)); ipw.decreaseIndent(); } } |