diff options
author | 2017-10-25 14:27:29 -0700 | |
---|---|---|
committer | 2017-10-27 08:38:48 -0700 | |
commit | 0ff5f3c694464a3d791b0e435a595965e37767b7 (patch) | |
tree | 564af5bbfd47b81aefad5eef78a00761aab1d3fa | |
parent | e61f60e0272abe743f990cc50f917f3068a22d00 (diff) |
Use dex2oatd when available on debug builds
Enable use of dex2oatd for background dexopt service for eng and userdebug builds.
This allows us to have more extensive checking on dogfood devices.
Bug: 68025088
Test: adb shell cmd package bg-dexopt-job
Change-Id: If346c27594542b1e6a058369170f38b6ae24462f
-rw-r--r-- | cmds/installd/dexopt.cpp | 16 | ||||
-rw-r--r-- | cmds/installd/installd_constants.h | 3 |
2 files changed, 17 insertions, 2 deletions
diff --git a/cmds/installd/dexopt.cpp b/cmds/installd/dexopt.cpp index cbd67be328..6ce04a2882 100644 --- a/cmds/installd/dexopt.cpp +++ b/cmds/installd/dexopt.cpp @@ -73,6 +73,10 @@ static bool is_debug_runtime() { return android::base::GetProperty("persist.sys.dalvik.vm.lib.2", "") == "libartd.so"; } +static bool is_debuggable_build() { + return android::base::GetBoolProperty("ro.debuggable", false); +} + static bool clear_profile(const std::string& profile) { unique_fd ufd(open(profile.c_str(), O_WRONLY | O_NOFOLLOW | O_CLOEXEC)); if (ufd.get() < 0) { @@ -197,7 +201,8 @@ static const char* get_location_from_path(const char* path) { static void run_dex2oat(int zip_fd, int oat_fd, int input_vdex_fd, int output_vdex_fd, int image_fd, const char* input_file_name, const char* output_file_name, int swap_fd, const char* instruction_set, const char* compiler_filter, - bool debuggable, bool post_bootcomplete, int profile_fd, const char* class_loader_context) { + bool debuggable, bool post_bootcomplete, bool try_debug_for_background, int profile_fd, + const char* class_loader_context) { static const unsigned int MAX_INSTRUCTION_SET_LEN = 7; if (strlen(instruction_set) >= MAX_INSTRUCTION_SET_LEN) { @@ -274,7 +279,12 @@ static void run_dex2oat(int zip_fd, int oat_fd, int input_vdex_fd, int output_vd } // If the runtime was requested to use libartd.so, we'll run dex2oatd, otherwise dex2oat. - const char* dex2oat_bin = is_debug_runtime() ? "/system/bin/dex2oatd" : "/system/bin/dex2oat"; + const char* dex2oat_bin = "/system/bin/dex2oat"; + static const char* kDex2oatDebugPath = "/system/bin/dex2oatd"; + if (is_debug_runtime() || (try_debug_for_background && is_debuggable_build())) { + DCHECK(access(kDex2oatDebugPath, X_OK) == 0); + dex2oat_bin = kDex2oatDebugPath; + } static const char* RUNTIME_ARG = "--runtime-arg"; @@ -1609,6 +1619,7 @@ int dexopt(const char* dex_path, uid_t uid, const char* pkgname, const char* ins bool boot_complete = (dexopt_flags & DEXOPT_BOOTCOMPLETE) != 0; bool profile_guided = (dexopt_flags & DEXOPT_PROFILE_GUIDED) != 0; bool is_secondary_dex = (dexopt_flags & DEXOPT_SECONDARY_DEX) != 0; + bool try_debug_for_background = (dexopt_flags & DEXOPT_IDLE_BACKGROUND_JOB) != 0; // Check if we're dealing with a secondary dex file and if we need to compile it. std::string oat_dir_str; @@ -1704,6 +1715,7 @@ int dexopt(const char* dex_path, uid_t uid, const char* pkgname, const char* ins compiler_filter, debuggable, boot_complete, + try_debug_for_background, reference_profile_fd.get(), class_loader_context); _exit(68); /* only get here on exec failure */ diff --git a/cmds/installd/installd_constants.h b/cmds/installd/installd_constants.h index 2597c7956c..b49057d392 100644 --- a/cmds/installd/installd_constants.h +++ b/cmds/installd/installd_constants.h @@ -49,6 +49,9 @@ constexpr int DEXOPT_SECONDARY_DEX = 1 << 5; constexpr int DEXOPT_FORCE = 1 << 6; constexpr int DEXOPT_STORAGE_CE = 1 << 7; constexpr int DEXOPT_STORAGE_DE = 1 << 8; +// Tells the compiler that it is invoked from the background service. This +// controls whether extra debugging flags can be used (taking more compile time.) +constexpr int DEXOPT_IDLE_BACKGROUND_JOB = 1 << 9; /* all known values for dexopt flags */ constexpr int DEXOPT_MASK = |