Merge "atrace: only start trace when starting trace" into pi-dev
am: 51e6abd610
Change-Id: Ief96f4d437860a403f1862fc47c3d386cbe87790
diff --git a/cmds/installd/dexopt.cpp b/cmds/installd/dexopt.cpp
index 230853d..e1e73c7 100644
--- a/cmds/installd/dexopt.cpp
+++ b/cmds/installd/dexopt.cpp
@@ -230,7 +230,7 @@
const char* instruction_set, const char* compiler_filter,
bool debuggable, bool post_bootcomplete, bool background_job_compile, int profile_fd,
const char* class_loader_context, int target_sdk_version, bool enable_hidden_api_checks,
- int dex_metadata_fd, const char* compilation_reason) {
+ bool generate_compact_dex, int dex_metadata_fd, const char* compilation_reason) {
static const unsigned int MAX_INSTRUCTION_SET_LEN = 7;
if (strlen(instruction_set) >= MAX_INSTRUCTION_SET_LEN) {
@@ -438,9 +438,7 @@
// Disable cdex if update input vdex is true since this combination of options is not
// supported.
- // Disable cdex for non-background compiles since we don't want to regress app install until
- // there are enough benefits to justify the tradeoff.
- const bool disable_cdex = !background_job_compile || (input_vdex_fd == output_vdex_fd);
+ const bool disable_cdex = !generate_compact_dex || (input_vdex_fd == output_vdex_fd);
const char* argv[9 // program name, mandatory arguments and the final NULL
+ (have_dex2oat_isa_variant ? 1 : 0)
@@ -1960,6 +1958,7 @@
bool is_secondary_dex = (dexopt_flags & DEXOPT_SECONDARY_DEX) != 0;
bool background_job_compile = (dexopt_flags & DEXOPT_IDLE_BACKGROUND_JOB) != 0;
bool enable_hidden_api_checks = (dexopt_flags & DEXOPT_ENABLE_HIDDEN_API_CHECKS) != 0;
+ bool generate_compact_dex = (dexopt_flags & DEXOPT_GENERATE_COMPACT_DEX) != 0;
// Check if we're dealing with a secondary dex file and if we need to compile it.
std::string oat_dir_str;
@@ -2073,6 +2072,7 @@
class_loader_context,
target_sdk_version,
enable_hidden_api_checks,
+ generate_compact_dex,
dex_metadata_fd.get(),
compilation_reason);
} else {
diff --git a/cmds/installd/installd_constants.h b/cmds/installd/installd_constants.h
index 6282ba2..26aa443 100644
--- a/cmds/installd/installd_constants.h
+++ b/cmds/installd/installd_constants.h
@@ -53,6 +53,7 @@
// controls whether extra debugging flags can be used (taking more compile time.)
constexpr int DEXOPT_IDLE_BACKGROUND_JOB = 1 << 9;
constexpr int DEXOPT_ENABLE_HIDDEN_API_CHECKS = 1 << 10;
+constexpr int DEXOPT_GENERATE_COMPACT_DEX = 1 << 11;
/* all known values for dexopt flags */
constexpr int DEXOPT_MASK =
@@ -65,7 +66,8 @@
| DEXOPT_STORAGE_CE
| DEXOPT_STORAGE_DE
| DEXOPT_IDLE_BACKGROUND_JOB
- | DEXOPT_ENABLE_HIDDEN_API_CHECKS;
+ | DEXOPT_ENABLE_HIDDEN_API_CHECKS
+ | DEXOPT_GENERATE_COMPACT_DEX;
// NOTE: keep in sync with StorageManager
constexpr int FLAG_STORAGE_DE = 1 << 0;
diff --git a/cmds/installd/otapreopt.cpp b/cmds/installd/otapreopt.cpp
index c1a1202..58355f9 100644
--- a/cmds/installd/otapreopt.cpp
+++ b/cmds/installd/otapreopt.cpp
@@ -81,8 +81,9 @@
static_assert(DEXOPT_STORAGE_DE == 1 << 8, "DEXOPT_STORAGE_DE unexpected.");
static_assert(DEXOPT_ENABLE_HIDDEN_API_CHECKS == 1 << 10,
"DEXOPT_ENABLE_HIDDEN_API_CHECKS unexpected");
+static_assert(DEXOPT_GENERATE_COMPACT_DEX == 1 << 11, "DEXOPT_GENERATE_COMPACT_DEX unexpected");
-static_assert(DEXOPT_MASK == (0x5fe | DEXOPT_IDLE_BACKGROUND_JOB),
+static_assert(DEXOPT_MASK == (0xdfe | DEXOPT_IDLE_BACKGROUND_JOB),
"DEXOPT_MASK unexpected.");
diff --git a/cmds/installd/otapreopt_parameters.cpp b/cmds/installd/otapreopt_parameters.cpp
index 802d5d7..d56aec9 100644
--- a/cmds/installd/otapreopt_parameters.cpp
+++ b/cmds/installd/otapreopt_parameters.cpp
@@ -133,6 +133,9 @@
// 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 @@
return false;
}
+ SetDefaultsForPostV1Arguments();
+
size_t param_index = 0;
for (;; ++param_index) {
const char* param = argv[3 + param_index];
@@ -193,8 +198,9 @@
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 @@
return false;
}
- SetDefaultsForPostV1Arguments();
-
return true;
}
@@ -239,7 +243,9 @@
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 @@
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/Android.bp b/cmds/installd/tests/Android.bp
index 7438d3d..739f33f 100644
--- a/cmds/installd/tests/Android.bp
+++ b/cmds/installd/tests/Android.bp
@@ -1,6 +1,7 @@
// Build the unit tests for installd
cc_test {
name: "installd_utils_test",
+ test_suites: ["device-tests"],
clang: true,
srcs: ["installd_utils_test.cpp"],
cflags: ["-Wall", "-Werror"],
@@ -18,6 +19,7 @@
cc_test {
name: "installd_cache_test",
+ test_suites: ["device-tests"],
clang: true,
srcs: ["installd_cache_test.cpp"],
cflags: ["-Wall", "-Werror"],
@@ -39,6 +41,7 @@
cc_test {
name: "installd_service_test",
+ test_suites: ["device-tests"],
clang: true,
srcs: ["installd_service_test.cpp"],
cflags: ["-Wall", "-Werror"],
@@ -60,6 +63,7 @@
cc_test {
name: "installd_dexopt_test",
+ test_suites: ["device-tests"],
clang: true,
srcs: ["installd_dexopt_test.cpp"],
cflags: ["-Wall", "-Werror"],
@@ -81,6 +85,7 @@
cc_test {
name: "installd_otapreopt_test",
+ test_suites: ["device-tests"],
clang: true,
srcs: ["installd_otapreopt_test.cpp"],
cflags: ["-Wall", "-Werror"],
diff --git a/cmds/installd/tests/installd_otapreopt_test.cpp b/cmds/installd/tests/installd_otapreopt_test.cpp
index 82bf932..63426cb 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 @@
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 @@
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 @@
} 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 @@
case 5: return "5";
case 6: return "6";
case 7: return "7";
+ case 8: return "8";
}
return nullptr;
}
diff --git a/cmds/lshal/DebugCommand.cpp b/cmds/lshal/DebugCommand.cpp
index dd8812d..0952db6 100644
--- a/cmds/lshal/DebugCommand.cpp
+++ b/cmds/lshal/DebugCommand.cpp
@@ -59,8 +59,8 @@
auto pair = splitFirst(mInterfaceName, '/');
- FQName fqName(pair.first);
- if (!fqName.isValid() || fqName.isIdentifier() || !fqName.isFullyQualified()) {
+ FQName fqName;
+ if (!FQName::parse(pair.first, &fqName) || fqName.isIdentifier() || !fqName.isFullyQualified()) {
mLshal.err() << "Invalid fully-qualified name '" << pair.first << "'\n\n";
return USAGE;
}
diff --git a/cmds/lshal/ListCommand.cpp b/cmds/lshal/ListCommand.cpp
index b9e0139..5545966 100644
--- a/cmds/lshal/ListCommand.cpp
+++ b/cmds/lshal/ListCommand.cpp
@@ -252,16 +252,16 @@
// use a double for loop here because lshal doesn't care about efficiency.
for (TableEntry &packageEntry : mImplementationsTable) {
std::string packageName = packageEntry.interfaceName;
- FQName fqPackageName{packageName.substr(0, packageName.find("::"))};
- if (!fqPackageName.isValid()) {
+ FQName fqPackageName;
+ if (!FQName::parse(packageName.substr(0, packageName.find("::")), &fqPackageName)) {
continue;
}
for (TableEntry &interfaceEntry : mPassthroughRefTable) {
if (interfaceEntry.arch != ARCH_UNKNOWN) {
continue;
}
- FQName interfaceName{splitFirst(interfaceEntry.interfaceName, '/').first};
- if (!interfaceName.isValid()) {
+ FQName interfaceName;
+ if (!FQName::parse(splitFirst(interfaceEntry.interfaceName, '/').first, &interfaceName)) {
continue;
}
if (interfaceName.getPackageAndVersion() == fqPackageName) {
@@ -308,10 +308,10 @@
// Quick hack to work around *'s
replaceAll(&fqInstanceName, '*', 'D');
}
- auto splittedFqInstanceName = splitFirst(fqInstanceName, '/');
- FQName fqName(splittedFqInstanceName.first);
- if (!fqName.isValid()) {
- err() << "Warning: '" << splittedFqInstanceName.first
+ auto splitFqInstanceName = splitFirst(fqInstanceName, '/');
+ FQName fqName;
+ if (!FQName::parse(splitFqInstanceName.first, &fqName)) {
+ err() << "Warning: '" << splitFqInstanceName.first
<< "' is not a valid FQName." << std::endl;
continue;
}
@@ -335,7 +335,7 @@
std::string interfaceName =
&table == &mImplementationsTable ? "" : fqName.name();
std::string instanceName =
- &table == &mImplementationsTable ? "" : splittedFqInstanceName.second;
+ &table == &mImplementationsTable ? "" : splitFqInstanceName.second;
vintf::Version version{fqName.getPackageMajorVersion(),
fqName.getPackageMinorVersion()};