From 990fb6b5c91be62078a698ee1c01e24d33364c85 Mon Sep 17 00:00:00 2001 From: David Brazdil Date: Tue, 1 Mar 2016 10:02:27 +0000 Subject: [PATCH] Add option to compile all packages with 'cmd package compile' To help investigate performance regressions, an option is added to 'adb shell cmd package compile' to compile all packages with the given mode. Bug: 27391290 Change-Id: I70a3a518e08b54535bb34f13f0cedda3a1f7085f --- .../android/content/pm/IPackageManager.aidl | 2 + .../server/pm/PackageDexOptimizer.java | 1 - .../server/pm/PackageManagerService.java | 7 +++ .../server/pm/PackageManagerShellCommand.java | 52 +++++++++++++++---- 4 files changed, 51 insertions(+), 11 deletions(-) diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index b4e9f60700a37..3d009f6bc845f 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -120,6 +120,8 @@ interface IPackageManager { int checkUidSignatures(int uid1, int uid2); + List getAllPackages(); + String[] getPackagesForUid(int uid); String getNameForUid(int uid); diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index c9613b4313c6d..561682c5c4784 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -191,7 +191,6 @@ class PackageDexOptimizer { throw new IllegalStateException("Invalid dexopt:" + dexoptNeeded); } - Log.i(TAG, "Running dexopt (" + dexoptType + ") on: " + path + " pkg=" + pkg.applicationInfo.packageName + " isa=" + dexCodeInstructionSet + " vmSafeMode=" + vmSafeMode + " debuggable=" + debuggable diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 8d4c9e576162e..10d4bca4ed7ad 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4442,6 +4442,13 @@ public class PackageManagerService extends IPackageManager.Stub { return PackageManager.SIGNATURE_NO_MATCH; } + @Override + public List getAllPackages() { + synchronized (mPackages) { + return new ArrayList(mPackages.keySet()); + } + } + @Override public String[] getPackagesForUid(int uid) { uid = UserHandle.getAppId(uid); diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index ccbd8235a0d0a..3e4250514e06c 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -233,11 +233,15 @@ class PackageManagerShellCommand extends ShellCommand { boolean useJitProfiles = false; boolean extractOnly = false; boolean forceCompilation = false; + boolean allPackages = false; String compilationMode = "default"; String opt; while ((opt = getNextOption()) != null) { switch (opt) { + case "-a": + allPackages = true; + break; case "-m": compilationMode = getNextArgRequired(); break; @@ -272,19 +276,46 @@ class PackageManagerShellCommand extends ShellCommand { return 1; } - String packageName = getNextArg(); - if (packageName == null) { - pw.println("Error: package name not specified"); - return 1; + List packageNames = null; + if (allPackages) { + packageNames = mInterface.getAllPackages(); + } else { + String packageName = getNextArg(); + if (packageName == null) { + pw.println("Error: package name not specified"); + return 1; + } + packageNames = Collections.singletonList(packageName); } - boolean success = mInterface.performDexOpt(packageName, null /* instructionSet */, - useJitProfiles, extractOnly, forceCompilation); - if (success) { + List failedPackages = new ArrayList<>(); + for (String packageName : packageNames) { + pw.println(packageName); + boolean result = mInterface.performDexOpt(packageName, null /* instructionSet */, + useJitProfiles, extractOnly, forceCompilation); + if (!result) { + failedPackages.add(packageName); + } + } + + if (failedPackages.isEmpty()) { pw.println("Success"); return 0; + } else if (failedPackages.size() == 1) { + pw.println("Failure: package " + failedPackages.get(0) + " could not be compiled"); + return 1; } else { - pw.println("Failure: package " + packageName + " could not be compiled"); + pw.print("Failure: the following packages could not be compiled: "); + boolean is_first = true; + for (String packageName : failedPackages) { + if (is_first) { + is_first = false; + } else { + pw.print(", "); + } + pw.print(packageName); + } + pw.println(); return 1; } } @@ -1135,9 +1166,10 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" help"); pw.println(" Print this help text."); pw.println(""); - pw.println(" compile [-m MODE] [-f] TARGET-PACKAGE"); - pw.println(" Trigger compilation of TARGET-PACKAGE."); + pw.println(" compile [-m MODE] [-f] (-a | TARGET-PACKAGE)"); + pw.println(" Trigger compilation of TARGET-PACKAGE or all packages if \"-a\"."); pw.println(" Options:"); + pw.println(" -a: compile all packages"); pw.println(" -m: select compilation mode"); pw.println(" MODE can be one of \"default\", \"all\", \"profile\", and \"extract\""); pw.println(" -f: force compilation even if not needed");