summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmds/pm/src/com/android/commands/pm/Pm.java14
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl2
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java22
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;