diff options
-rw-r--r-- | cmds/pm/src/com/android/commands/pm/Pm.java | 14 | ||||
-rw-r--r-- | core/java/android/content/pm/IPackageManager.aidl | 2 | ||||
-rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 22 |
3 files changed, 38 insertions, 0 deletions
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index 96019b3..bc16800 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -253,6 +253,11 @@ public final class Pm { return; } + if ("force-dex-opt".equals(op)) { + runForceDexOpt(); + return; + } + try { if (args.length == 1) { if (args[0].equalsIgnoreCase("-l")) { @@ -1248,6 +1253,15 @@ public final class Pm { System.out.println("Maximum supported users: " + UserManager.getMaxSupportedUsers()); } + public void runForceDexOpt() { + final String packageName = nextArg(); + try { + mPm.forceDexOpt(packageName); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + class PackageDeleteObserver extends IPackageDeleteObserver.Stub { boolean finished; boolean result; diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 4b339a1..72c85ee 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -397,6 +397,8 @@ interface IPackageManager { */ boolean performDexOptIfNeeded(String packageName, String instructionSet); + void forceDexOpt(String packageName); + /** * Update status of external media on the package manager to scan and * install packages installed on the external media. Like say the diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 9878d1c..a07eb7e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4728,6 +4728,28 @@ public class PackageManagerService extends IPackageManager.Stub { return allInstructionSets; } + @Override + public void forceDexOpt(String packageName) { + enforceSystemOrRoot("forceDexOpt"); + + PackageParser.Package pkg; + synchronized (mPackages) { + pkg = mPackages.get(packageName); + if (pkg == null) { + throw new IllegalArgumentException("Missing package: " + packageName); + } + } + + synchronized (mInstallLock) { + final String[] instructionSets = new String[] { + getPrimaryInstructionSet(pkg.applicationInfo) }; + final int res = performDexOptLI(pkg, instructionSets, true, false, true); + if (res != DEX_OPT_PERFORMED) { + throw new IllegalStateException("Failed to dexopt: " + res); + } + } + } + private int performDexOptLI(PackageParser.Package pkg, String[] instructionSets, boolean forceDex, boolean defer, boolean inclDependencies) { HashSet<String> done; |