OSDN Git Service

Allow using the JIT
authorTodd Kennedy <toddke@google.com>
Fri, 25 Sep 2015 21:45:37 +0000 (14:45 -0700)
committerRom Lemarchand <romlem@google.com>
Mon, 16 Nov 2015 20:43:46 +0000 (12:43 -0800)
Instead of the JIT only being available for eng builds [or configurable
via environment variable], allow the JIT to be enabled programatically.

(cherry picked from commit 12434f8cce66a753ef49c07b503f9625e01366c8)

Change-Id: Id3c5ae227ed400e489bb723a56c516dfc12acd89

cmds/installd/commands.cpp
cmds/installd/installd.h

index f25c865..fac8ddd 100644 (file)
@@ -746,7 +746,7 @@ static bool check_boolean_property(const char* property_name, bool default_value
 
 static void run_dex2oat(int zip_fd, int oat_fd, const char* input_file_name,
     const char* output_file_name, int swap_fd, const char *pkgname, const char *instruction_set,
-    bool vm_safe_mode, bool debuggable, bool post_bootcomplete)
+    bool vm_safe_mode, bool debuggable, bool post_bootcomplete, bool use_jit)
 {
     static const unsigned int MAX_INSTRUCTION_SET_LEN = 7;
 
@@ -807,7 +807,6 @@ static void run_dex2oat(int zip_fd, int oat_fd, const char* input_file_name,
                              (strcmp(vold_decrypt, "trigger_restart_min_framework") == 0 ||
                              (strcmp(vold_decrypt, "1") == 0)));
 
-    bool use_jit = check_boolean_property("debug.usejit");
     bool generate_debug_info = check_boolean_property("debug.generate-debug-info");
 
     static const char* DEX2OAT_BIN = "/system/bin/dex2oat";
@@ -861,6 +860,8 @@ static void run_dex2oat(int zip_fd, int oat_fd, const char* input_file_name,
         }
     }
 
+    // use the JIT if either it's specified as a dexopt flag or if the property is set
+    use_jit = use_jit || check_boolean_property("debug.usejit");
     if (have_dex2oat_Xms_flag) {
         sprintf(dex2oat_Xms_arg, "-Xms%s", dex2oat_Xms_flag);
     }
@@ -1095,6 +1096,7 @@ int dexopt(const char *apk_path, uid_t uid, const char *pkgname, const char *ins
     bool vm_safe_mode = (dexopt_flags & DEXOPT_SAFEMODE) != 0;
     bool debuggable = (dexopt_flags & DEXOPT_DEBUGGABLE) != 0;
     bool boot_complete = (dexopt_flags & DEXOPT_BOOTCOMPLETE) != 0;
+    bool use_jit = (dexopt_flags & DEXOPT_USEJIT) != 0;
 
     if ((dexopt_flags & ~DEXOPT_MASK) != 0) {
         LOG_FATAL("dexopt flags contains unknown fields\n");
@@ -1238,7 +1240,7 @@ int dexopt(const char *apk_path, uid_t uid, const char *pkgname, const char *ins
                 input_file_name++;
             }
             run_dex2oat(input_fd, out_fd, input_file_name, out_path, swap_fd, pkgname,
-                        instruction_set, vm_safe_mode, debuggable, boot_complete);
+                        instruction_set, vm_safe_mode, debuggable, boot_complete, use_jit);
         } else {
             ALOGE("Invalid dexopt needed: %d\n", dexopt_needed);
             exit(73);
index 51a609c..df13fe4 100644 (file)
  * IMPORTANT: These values are passed from Java code. Keep them in sync with
  * frameworks/base/services/core/java/com/android/server/pm/Installer.java
  ***************************************************************************/
-#define DEXOPT_PUBLIC       (1 << 1)
-#define DEXOPT_SAFEMODE     (1 << 2)
-#define DEXOPT_DEBUGGABLE   (1 << 3)
-#define DEXOPT_BOOTCOMPLETE (1 << 4)
-#define DEXOPT_MASK (DEXOPT_PUBLIC | DEXOPT_SAFEMODE | DEXOPT_DEBUGGABLE | DEXOPT_BOOTCOMPLETE)
+constexpr int DEXOPT_PUBLIC       = 1 << 1;
+constexpr int DEXOPT_SAFEMODE     = 1 << 2;
+constexpr int DEXOPT_DEBUGGABLE   = 1 << 3;
+constexpr int DEXOPT_BOOTCOMPLETE = 1 << 4;
+constexpr int DEXOPT_USEJIT       = 1 << 5;
+
+/* all known values for dexopt flags */
+constexpr int DEXOPT_MASK =
+    DEXOPT_PUBLIC
+    | DEXOPT_SAFEMODE
+    | DEXOPT_DEBUGGABLE
+    | DEXOPT_BOOTCOMPLETE
+    | DEXOPT_USEJIT;
 
 #define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))