diff options
-rw-r--r-- | cmds/installd/otapreopt_parameters.cpp | 18 | ||||
-rw-r--r-- | cmds/installd/tests/installd_otapreopt_test.cpp | 11 |
2 files changed, 23 insertions, 6 deletions
diff --git a/cmds/installd/otapreopt_parameters.cpp b/cmds/installd/otapreopt_parameters.cpp index 802d5d7da7..d56aec9e2b 100644 --- a/cmds/installd/otapreopt_parameters.cpp +++ b/cmds/installd/otapreopt_parameters.cpp @@ -133,6 +133,9 @@ void OTAPreoptParameters::SetDefaultsForPostV1Arguments() { // The compilation reason is ab-ota (match the system property pm.dexopt.ab-ota) compilation_reason = "ab-ota"; + + // Flag is enabled by default for A/B otas. + dexopt_flags = DEXOPT_GENERATE_COMPACT_DEX; } bool OTAPreoptParameters::ReadArgumentsV1(const char** argv) { @@ -146,6 +149,8 @@ bool OTAPreoptParameters::ReadArgumentsV1(const char** argv) { return false; } + SetDefaultsForPostV1Arguments(); + size_t param_index = 0; for (;; ++param_index) { const char* param = argv[3 + param_index]; @@ -193,8 +198,9 @@ bool OTAPreoptParameters::ReadArgumentsV1(const char** argv) { constexpr int OLD_DEXOPT_BOOTCOMPLETE = 1 << 4; constexpr int OLD_DEXOPT_PROFILE_GUIDED = 1 << 5; constexpr int OLD_DEXOPT_OTA = 1 << 6; + static_assert(DEXOPT_GENERATE_COMPACT_DEX > OLD_DEXOPT_OTA, "must not overlap"); int input = atoi(param); - dexopt_flags = + dexopt_flags |= ReplaceMask(input, OLD_DEXOPT_PUBLIC, DEXOPT_PUBLIC) | ReplaceMask(input, OLD_DEXOPT_DEBUGGABLE, DEXOPT_DEBUGGABLE) | ReplaceMask(input, OLD_DEXOPT_BOOTCOMPLETE, DEXOPT_BOOTCOMPLETE) | @@ -226,8 +232,6 @@ bool OTAPreoptParameters::ReadArgumentsV1(const char** argv) { return false; } - SetDefaultsForPostV1Arguments(); - return true; } @@ -239,7 +243,9 @@ bool OTAPreoptParameters::ReadArgumentsPostV1(uint32_t version, const char** arg case 4: num_args_expected = 13; break; case 5: num_args_expected = 14; break; case 6: num_args_expected = 15; break; - case 7: num_args_expected = 16; break; + case 7: + // Version 8 adds a new dexopt flag: DEXOPT_GENERATE_COMPACT_DEX + case 8: num_args_expected = 16; break; default: LOG(ERROR) << "Don't know how to read arguments for version " << version; return false; @@ -302,6 +308,10 @@ bool OTAPreoptParameters::ReadArgumentsPostV1(uint32_t version, const char** arg case 6: dexopt_flags = atoi(param); + // Add CompactDex generation flag for versions less than 8 since it wasn't passed + // from the package manager. Only conditionally set the flag here so that it can + // be fully controlled by the package manager. + dexopt_flags |= (version < 8) ? DEXOPT_GENERATE_COMPACT_DEX : 0u; break; case 7: diff --git a/cmds/installd/tests/installd_otapreopt_test.cpp b/cmds/installd/tests/installd_otapreopt_test.cpp index 82bf932bee..63426cb4e0 100644 --- a/cmds/installd/tests/installd_otapreopt_test.cpp +++ b/cmds/installd/tests/installd_otapreopt_test.cpp @@ -20,6 +20,7 @@ #include <android-base/logging.h> #include <gtest/gtest.h> +#include "installd_constants.h" #include "otapreopt_parameters.h" namespace android { @@ -61,7 +62,7 @@ protected: ASSERT_STREQ(params.instruction_set, args[i++]); ASSERT_EQ(params.dexopt_needed, atoi(args[i++])); ASSERT_STREQ(params.oat_dir, args[i++]); - ASSERT_EQ(params.dexopt_flags, atoi(args[i++])); + const int dexopt_flags = atoi(args[i++]); ASSERT_STREQ(params.compiler_filter, args[i++]); ASSERT_STREQ(params.volume_uuid, ParseNull(args[i++])); ASSERT_STREQ(params.shared_libraries, ParseNull(args[i++])); @@ -78,7 +79,7 @@ protected: if (version > 3) { ASSERT_EQ(params.target_sdk_version, atoi(args[i++])); } else { - ASSERT_EQ(params.target_sdk_version, 0); + ASSERT_EQ(params.target_sdk_version, 0); } if (version > 4) { ASSERT_STREQ(params.profile_name, ParseNull(args[i++])); @@ -95,6 +96,11 @@ protected: } else { ASSERT_STREQ(params.compilation_reason, "ab-ota"); } + if (version > 7) { + ASSERT_EQ(params.dexopt_flags, dexopt_flags); + } else { + ASSERT_EQ(params.dexopt_flags, dexopt_flags | DEXOPT_GENERATE_COMPACT_DEX); + } } const char* getVersionCStr(uint32_t version) { @@ -106,6 +112,7 @@ protected: case 5: return "5"; case 6: return "6"; case 7: return "7"; + case 8: return "8"; } return nullptr; } |