[installd] Add check that classpath is up to date to getDexOptNeeded
Pass the class loader context argument to dexoptanalyzer when analyzing
secondary dex files.
(cherry picked from commit ef81ec21e8ea059875295597e3acc9f6af3a96ec)
Bug: 62269291
Test: manual, compile secondary dex files
adb shell cmd package compile -m speed --secondary-dex
com.google.android.googlequicksearchbox
Merged-In: I25ae93cadd12441a13ff54bb3da5a198085c6f3d
Change-Id: I25ae93cadd12441a13ff54bb3da5a198085c6f3d
diff --git a/cmds/installd/dexopt.cpp b/cmds/installd/dexopt.cpp
index 6a7d845..4bb8ebe 100644
--- a/cmds/installd/dexopt.cpp
+++ b/cmds/installd/dexopt.cpp
@@ -1365,7 +1365,8 @@
// If this is for a profile guided compilation, profile_was_updated will tell whether or not
// the profile has changed.
static void exec_dexoptanalyzer(const std::string& dex_file, const std::string& instruction_set,
- const std::string& compiler_filter, bool profile_was_updated, bool downgrade) {
+ const std::string& compiler_filter, bool profile_was_updated, bool downgrade,
+ const char* class_loader_context) {
const char* dexoptanalyzer_bin =
is_debug_runtime()
? "/system/bin/dexoptanalyzerd"
@@ -1383,11 +1384,16 @@
std::string compiler_filter_arg = "--compiler-filter=" + compiler_filter;
const char* assume_profile_changed = "--assume-profile-changed";
const char* downgrade_flag = "--downgrade";
+ std::string class_loader_context_arg = "--class-loader-context=";
+ if (class_loader_context != nullptr) {
+ class_loader_context_arg += class_loader_context;
+ }
// program name, dex file, isa, filter, the final NULL
const int argc = 5 +
(profile_was_updated ? 1 : 0) +
- (downgrade ? 1 : 0);
+ (downgrade ? 1 : 0) +
+ (class_loader_context != nullptr ? 1 : 0);
const char* argv[argc];
int i = 0;
argv[i++] = dexoptanalyzer_bin;
@@ -1400,6 +1406,9 @@
if (downgrade) {
argv[i++] = downgrade_flag;
}
+ if (class_loader_context != nullptr) {
+ argv[i++] = class_loader_context;
+ }
argv[i] = NULL;
execv(dexoptanalyzer_bin, (char * const *)argv);
@@ -1480,7 +1489,8 @@
static bool process_secondary_dex_dexopt(const char* original_dex_path, const char* pkgname,
int dexopt_flags, const char* volume_uuid, int uid, const char* instruction_set,
const char* compiler_filter, bool* is_public_out, int* dexopt_needed_out,
- std::string* oat_dir_out, std::string* dex_path_out, bool downgrade) {
+ std::string* oat_dir_out, std::string* dex_path_out, bool downgrade,
+ const char* class_loader_context) {
int storage_flag;
if ((dexopt_flags & DEXOPT_STORAGE_CE) != 0) {
@@ -1550,7 +1560,7 @@
drop_capabilities(uid);
// Run dexoptanalyzer to get dexopt_needed code.
exec_dexoptanalyzer(dex_path, instruction_set, compiler_filter, profile_was_updated,
- downgrade);
+ downgrade, class_loader_context);
exit(DEXOPTANALYZER_BIN_EXEC_ERROR);
}
@@ -1606,8 +1616,7 @@
if (is_secondary_dex) {
if (process_secondary_dex_dexopt(dex_path, pkgname, dexopt_flags, volume_uuid, uid,
instruction_set, compiler_filter, &is_public, &dexopt_needed, &oat_dir_str,
- &dex_real_path,
- downgrade)) {
+ &dex_real_path, downgrade, class_loader_context)) {
oat_dir = oat_dir_str.c_str();
dex_path = dex_real_path.c_str();
if (dexopt_needed == NO_DEXOPT_NEEDED) {