aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2018-05-24 07:24:37 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2018-05-24 07:24:37 +0000
commitf33903d03a446fd2ccdf4c8ee169ca9420cb6d17 (patch)
tree217282da512b0f30837f55d75901cfd7ee002c64
parentd90fafc70ac04ae28230a196fc200f1aa17661c8 (diff)
parent05cd4b895e5d78ef82448cb9bf71fba6b1ad48ae (diff)
downloadperfetto-security-pi-release.tar.gz
Snap for 4801384 from 05cd4b895e5d78ef82448cb9bf71fba6b1ad48ae to pi-releaseandroid-wear-9.0.0_r9android-wear-9.0.0_r8android-wear-9.0.0_r7android-wear-9.0.0_r6android-wear-9.0.0_r5android-wear-9.0.0_r4android-wear-9.0.0_r34android-wear-9.0.0_r33android-wear-9.0.0_r32android-wear-9.0.0_r31android-wear-9.0.0_r30android-wear-9.0.0_r3android-wear-9.0.0_r29android-wear-9.0.0_r28android-wear-9.0.0_r27android-wear-9.0.0_r26android-wear-9.0.0_r25android-wear-9.0.0_r24android-wear-9.0.0_r23android-wear-9.0.0_r22android-wear-9.0.0_r21android-wear-9.0.0_r20android-wear-9.0.0_r2android-wear-9.0.0_r19android-wear-9.0.0_r18android-wear-9.0.0_r17android-wear-9.0.0_r16android-wear-9.0.0_r15android-wear-9.0.0_r14android-wear-9.0.0_r13android-wear-9.0.0_r12android-wear-9.0.0_r11android-wear-9.0.0_r10android-wear-9.0.0_r1android-vts-9.0_r9android-vts-9.0_r8android-vts-9.0_r7android-vts-9.0_r6android-vts-9.0_r5android-vts-9.0_r4android-vts-9.0_r19android-vts-9.0_r18android-vts-9.0_r17android-vts-9.0_r16android-vts-9.0_r15android-vts-9.0_r14android-vts-9.0_r13android-vts-9.0_r12android-vts-9.0_r11android-vts-9.0_r10android-security-9.0.0_r76android-security-9.0.0_r75android-security-9.0.0_r74android-security-9.0.0_r73android-security-9.0.0_r72android-security-9.0.0_r71android-security-9.0.0_r70android-security-9.0.0_r69android-security-9.0.0_r68android-security-9.0.0_r67android-security-9.0.0_r66android-security-9.0.0_r65android-security-9.0.0_r64android-security-9.0.0_r63android-security-9.0.0_r62android-cts-9.0_r9android-cts-9.0_r8android-cts-9.0_r7android-cts-9.0_r6android-cts-9.0_r5android-cts-9.0_r4android-cts-9.0_r3android-cts-9.0_r2android-cts-9.0_r13android-cts-9.0_r12android-cts-9.0_r11android-cts-9.0_r10android-cts-9.0_r1android-9.0.0_r9android-9.0.0_r8android-9.0.0_r7android-9.0.0_r61android-9.0.0_r60android-9.0.0_r6android-9.0.0_r59android-9.0.0_r58android-9.0.0_r57android-9.0.0_r56android-9.0.0_r55android-9.0.0_r54android-9.0.0_r53android-9.0.0_r52android-9.0.0_r51android-9.0.0_r50android-9.0.0_r5android-9.0.0_r49android-9.0.0_r48android-9.0.0_r3android-9.0.0_r2android-9.0.0_r18android-9.0.0_r17android-9.0.0_r10android-9.0.0_r1security-pi-releasepie-vts-releasepie-security-releasepie-s2-releasepie-release-2pie-releasepie-r2-s2-releasepie-r2-s1-releasepie-r2-release
Change-Id: I9302ca41fad7b7d8c0790c183d9051867da452e0
-rw-r--r--Android.bp5
-rw-r--r--include/perfetto/base/build_config.h6
-rw-r--r--include/perfetto/tracing/core/trace_config.h37
-rw-r--r--perfetto.rc6
-rw-r--r--protos/perfetto/config/perfetto_config.proto10
-rw-r--r--protos/perfetto/config/trace_config.proto10
-rw-r--r--src/perfetto_cmd/perfetto_cmd.cc4
-rw-r--r--src/perfetto_cmd/rate_limiter.cc5
-rw-r--r--src/perfetto_cmd/rate_limiter.h1
-rw-r--r--src/perfetto_cmd/rate_limiter_unittest.cc16
-rw-r--r--src/tracing/core/trace_config.cc38
-rwxr-xr-xtools/gen_android_bp17
12 files changed, 150 insertions, 5 deletions
diff --git a/Android.bp b/Android.bp
index 34b35eba0..93919262f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -240,6 +240,11 @@ cc_defaults {
local_include_dirs: [
"include",
],
+ product_variables: {
+ debuggable: {
+ cflags: ["-DPERFETTO_BUILD_WITH_ANDROID_USERDEBUG"],
+ },
+ },
}
// GN target: //:perfetto_integrationtests
diff --git a/include/perfetto/base/build_config.h b/include/perfetto/base/build_config.h
index de4a43691..5f1c31dc3 100644
--- a/include/perfetto/base/build_config.h
+++ b/include/perfetto/base/build_config.h
@@ -58,4 +58,10 @@
#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_START_DAEMONS() 0
#endif
+#if defined(PERFETTO_BUILD_WITH_ANDROID_USERDEBUG)
+#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_ANDROID_USERDEBUG_BUILD() 1
+#else
+#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_ANDROID_USERDEBUG_BUILD() 0
+#endif
+
#endif // INCLUDE_PERFETTO_BASE_BUILD_CONFIG_H_
diff --git a/include/perfetto/tracing/core/trace_config.h b/include/perfetto/tracing/core/trace_config.h
index 2097906ec..d94b72aec 100644
--- a/include/perfetto/tracing/core/trace_config.h
+++ b/include/perfetto/tracing/core/trace_config.h
@@ -52,6 +52,7 @@ class ProcessStatsConfig;
class TestConfig;
class TraceConfig_ProducerConfig;
class TraceConfig_StatsdMetadata;
+class TraceConfig_GuardrailOverrides;
} // namespace protos
} // namespace perfetto
@@ -203,6 +204,34 @@ class PERFETTO_EXPORT TraceConfig {
std::string unknown_fields_;
};
+ class PERFETTO_EXPORT GuardrailOverrides {
+ public:
+ GuardrailOverrides();
+ ~GuardrailOverrides();
+ GuardrailOverrides(GuardrailOverrides&&) noexcept;
+ GuardrailOverrides& operator=(GuardrailOverrides&&);
+ GuardrailOverrides(const GuardrailOverrides&);
+ GuardrailOverrides& operator=(const GuardrailOverrides&);
+
+ // Conversion methods from/to the corresponding protobuf types.
+ void FromProto(const perfetto::protos::TraceConfig_GuardrailOverrides&);
+ void ToProto(perfetto::protos::TraceConfig_GuardrailOverrides*) const;
+
+ uint64_t max_upload_per_day_bytes() const {
+ return max_upload_per_day_bytes_;
+ }
+ void set_max_upload_per_day_bytes(uint64_t value) {
+ max_upload_per_day_bytes_ = value;
+ }
+
+ private:
+ uint64_t max_upload_per_day_bytes_ = {};
+
+ // Allows to preserve unknown protobuf fields for compatibility
+ // with future versions of .proto files.
+ std::string unknown_fields_;
+ };
+
TraceConfig();
~TraceConfig();
TraceConfig(TraceConfig&&) noexcept;
@@ -264,6 +293,13 @@ class PERFETTO_EXPORT TraceConfig {
uint64_t max_file_size_bytes() const { return max_file_size_bytes_; }
void set_max_file_size_bytes(uint64_t value) { max_file_size_bytes_ = value; }
+ const GuardrailOverrides& guardrail_overrides() const {
+ return guardrail_overrides_;
+ }
+ GuardrailOverrides* mutable_guardrail_overrides() {
+ return &guardrail_overrides_;
+ }
+
private:
std::vector<BufferConfig> buffers_;
std::vector<DataSource> data_sources_;
@@ -275,6 +311,7 @@ class PERFETTO_EXPORT TraceConfig {
bool write_into_file_ = {};
uint32_t file_write_period_ms_ = {};
uint64_t max_file_size_bytes_ = {};
+ GuardrailOverrides guardrail_overrides_ = {};
// Allows to preserve unknown protobuf fields for compatibility
// with future versions of .proto files.
diff --git a/perfetto.rc b/perfetto.rc
index 23abaf25e..8c795ad3b 100644
--- a/perfetto.rc
+++ b/perfetto.rc
@@ -39,6 +39,12 @@ on property:sys.traced.enable_override=1
on property:sys.traced.enable_override=0
setprop persist.traced.enable 0
+on property:debug.atrace.user_initiated=1
+ stop traced_probes
+
+on property:persist.traced.enable=1 && property:debug.atrace.user_initiated=""
+ start traced_probes
+
on property:persist.traced.enable=1
# Trace files need to be:
# - Written by either uid:shell or uid:statsd.
diff --git a/protos/perfetto/config/perfetto_config.proto b/protos/perfetto/config/perfetto_config.proto
index 48202b8a7..f75fccb05 100644
--- a/protos/perfetto/config/perfetto_config.proto
+++ b/protos/perfetto/config/perfetto_config.proto
@@ -287,6 +287,16 @@ message TraceConfig {
// have been written into the file. Tracing is disabled when this limit is
// reached, even if |duration_ms| has not been reached yet.
optional uint64 max_file_size_bytes = 10;
+
+ // Contains flags which override the default values of the guardrails inside
+ // Perfetto. These values are only affect userdebug builds.
+ message GuardrailOverrides {
+ // Override the default limit (in bytes) for uploading data to server within
+ // a 24 hour period.
+ optional uint64 max_upload_per_day_bytes = 1;
+ }
+
+ optional GuardrailOverrides guardrail_overrides = 11;
}
// End of protos/perfetto/config/trace_config.proto
diff --git a/protos/perfetto/config/trace_config.proto b/protos/perfetto/config/trace_config.proto
index 36a02bbec..94223374f 100644
--- a/protos/perfetto/config/trace_config.proto
+++ b/protos/perfetto/config/trace_config.proto
@@ -125,4 +125,14 @@ message TraceConfig {
// have been written into the file. Tracing is disabled when this limit is
// reached, even if |duration_ms| has not been reached yet.
optional uint64 max_file_size_bytes = 10;
+
+ // Contains flags which override the default values of the guardrails inside
+ // Perfetto. These values are only affect userdebug builds.
+ message GuardrailOverrides {
+ // Override the default limit (in bytes) for uploading data to server within
+ // a 24 hour period.
+ optional uint64 max_upload_per_day_bytes = 1;
+ }
+
+ optional GuardrailOverrides guardrail_overrides = 11;
}
diff --git a/src/perfetto_cmd/perfetto_cmd.cc b/src/perfetto_cmd/perfetto_cmd.cc
index 20e922864..9614642c9 100644
--- a/src/perfetto_cmd/perfetto_cmd.cc
+++ b/src/perfetto_cmd/perfetto_cmd.cc
@@ -230,6 +230,10 @@ int PerfettoCmd::Main(int argc, char** argv) {
args.is_dropbox = !dropbox_tag_.empty();
args.current_time = base::GetWallTimeS();
args.ignore_guardrails = ignore_guardrails;
+#if PERFETTO_BUILDFLAG(PERFETTO_ANDROID_USERDEBUG_BUILD)
+ args.max_upload_bytes_override =
+ trace_config_->guardrail_overrides().max_upload_per_day_bytes();
+#endif
if (!limiter.ShouldTrace(args))
return 1;
diff --git a/src/perfetto_cmd/rate_limiter.cc b/src/perfetto_cmd/rate_limiter.cc
index f4df2fca1..1e2ef4f1e 100644
--- a/src/perfetto_cmd/rate_limiter.cc
+++ b/src/perfetto_cmd/rate_limiter.cc
@@ -96,7 +96,10 @@ bool RateLimiter::ShouldTrace(const Args& args) {
// If we've uploaded more than 10mb in the last 24 hours we shouldn't trace
// now.
- if (state_.total_bytes_uploaded() > kMaxUploadInBytes) {
+ uint64_t max_upload_guardrail = args.max_upload_bytes_override > 0
+ ? args.max_upload_bytes_override
+ : kMaxUploadInBytes;
+ if (state_.total_bytes_uploaded() > max_upload_guardrail) {
PERFETTO_ELOG("Guardrail: Uploaded >10mb DropBox in the last 24h.");
if (!args.ignore_guardrails)
return false;
diff --git a/src/perfetto_cmd/rate_limiter.h b/src/perfetto_cmd/rate_limiter.h
index c1633572a..0d89b7da6 100644
--- a/src/perfetto_cmd/rate_limiter.h
+++ b/src/perfetto_cmd/rate_limiter.h
@@ -28,6 +28,7 @@ class RateLimiter {
bool is_dropbox = false;
bool ignore_guardrails = false;
base::TimeSeconds current_time = base::TimeSeconds(0);
+ uint64_t max_upload_bytes_override = 0;
};
RateLimiter();
diff --git a/src/perfetto_cmd/rate_limiter_unittest.cc b/src/perfetto_cmd/rate_limiter_unittest.cc
index 17ac97c1a..753e0e678 100644
--- a/src/perfetto_cmd/rate_limiter_unittest.cc
+++ b/src/perfetto_cmd/rate_limiter_unittest.cc
@@ -277,6 +277,22 @@ TEST(RateLimiterTest, DropBox_TooMuch) {
ASSERT_FALSE(limiter.ShouldTrace(args));
}
+TEST(RateLimiterTest, DropBox_TooMuch_Override) {
+ StrictMock<MockRateLimiter> limiter;
+ RateLimiter::Args args;
+
+ PerfettoCmdState input{};
+ input.set_total_bytes_uploaded(10 * 1024 * 1024 + 1);
+ ASSERT_TRUE(limiter.SaveStateConcrete(input));
+
+ args.is_dropbox = true;
+ args.current_time = base::TimeSeconds(60 * 60);
+ args.max_upload_bytes_override = 10 * 1024 * 1024 + 2;
+
+ EXPECT_CALL(limiter, LoadState(_));
+ ASSERT_TRUE(limiter.ShouldTrace(args));
+}
+
TEST(RateLimiterTest, DropBox_TooMuchWasUploaded) {
StrictMock<MockRateLimiter> limiter;
RateLimiter::Args args;
diff --git a/src/tracing/core/trace_config.cc b/src/tracing/core/trace_config.cc
index f3bfca5cb..b4d008177 100644
--- a/src/tracing/core/trace_config.cc
+++ b/src/tracing/core/trace_config.cc
@@ -90,6 +90,8 @@ void TraceConfig::FromProto(const perfetto::protos::TraceConfig& proto) {
"size mismatch");
max_file_size_bytes_ =
static_cast<decltype(max_file_size_bytes_)>(proto.max_file_size_bytes());
+
+ guardrail_overrides_.FromProto(proto.guardrail_overrides());
unknown_fields_ = proto.unknown_fields();
}
@@ -148,6 +150,8 @@ void TraceConfig::ToProto(perfetto::protos::TraceConfig* proto) const {
proto->set_max_file_size_bytes(
static_cast<decltype(proto->max_file_size_bytes())>(
max_file_size_bytes_));
+
+ guardrail_overrides_.ToProto(proto->mutable_guardrail_overrides());
*(proto->mutable_unknown_fields()) = unknown_fields_;
}
@@ -336,4 +340,38 @@ void TraceConfig::StatsdMetadata::ToProto(
*(proto->mutable_unknown_fields()) = unknown_fields_;
}
+TraceConfig::GuardrailOverrides::GuardrailOverrides() = default;
+TraceConfig::GuardrailOverrides::~GuardrailOverrides() = default;
+TraceConfig::GuardrailOverrides::GuardrailOverrides(
+ const TraceConfig::GuardrailOverrides&) = default;
+TraceConfig::GuardrailOverrides& TraceConfig::GuardrailOverrides::operator=(
+ const TraceConfig::GuardrailOverrides&) = default;
+TraceConfig::GuardrailOverrides::GuardrailOverrides(
+ TraceConfig::GuardrailOverrides&&) noexcept = default;
+TraceConfig::GuardrailOverrides& TraceConfig::GuardrailOverrides::operator=(
+ TraceConfig::GuardrailOverrides&&) = default;
+
+void TraceConfig::GuardrailOverrides::FromProto(
+ const perfetto::protos::TraceConfig_GuardrailOverrides& proto) {
+ static_assert(sizeof(max_upload_per_day_bytes_) ==
+ sizeof(proto.max_upload_per_day_bytes()),
+ "size mismatch");
+ max_upload_per_day_bytes_ = static_cast<decltype(max_upload_per_day_bytes_)>(
+ proto.max_upload_per_day_bytes());
+ unknown_fields_ = proto.unknown_fields();
+}
+
+void TraceConfig::GuardrailOverrides::ToProto(
+ perfetto::protos::TraceConfig_GuardrailOverrides* proto) const {
+ proto->Clear();
+
+ static_assert(sizeof(max_upload_per_day_bytes_) ==
+ sizeof(proto->max_upload_per_day_bytes()),
+ "size mismatch");
+ proto->set_max_upload_per_day_bytes(
+ static_cast<decltype(proto->max_upload_per_day_bytes())>(
+ max_upload_per_day_bytes_));
+ *(proto->mutable_unknown_fields()) = unknown_fields_;
+}
+
} // namespace perfetto
diff --git a/tools/gen_android_bp b/tools/gen_android_bp
index f71e00183..d48c91cca 100755
--- a/tools/gen_android_bp
+++ b/tools/gen_android_bp
@@ -176,6 +176,7 @@ class Module(object):
self.defaults = []
self.cflags = set()
self.local_include_dirs = []
+ self.user_debug_flag = False
def to_string(self, output):
if self.comment:
@@ -196,11 +197,18 @@ class Module(object):
self._output_field(output, 'defaults')
self._output_field(output, 'cflags')
self._output_field(output, 'local_include_dirs')
- if any(name in library_not_in_pdk for name in self.shared_libs):
+
+ disable_pdk = any(name in library_not_in_pdk for name in self.shared_libs)
+ if self.user_debug_flag or disable_pdk:
output.append(' product_variables: {')
- output.append(' pdk: {')
- output.append(' enabled: false,')
- output.append(' },')
+ if disable_pdk:
+ output.append(' pdk: {')
+ output.append(' enabled: false,')
+ output.append(' },')
+ if self.user_debug_flag:
+ output.append(' debuggable: {')
+ output.append(' cflags: ["-DPERFETTO_BUILD_WITH_ANDROID_USERDEBUG"],')
+ output.append(' },')
output.append(' },')
output.append('}')
output.append('')
@@ -561,6 +569,7 @@ def create_blueprint_for_targets(desc, targets):
'-fvisibility=hidden',
'-Oz',
]
+ defaults.user_debug_flag = True
blueprint.add_module(defaults)
for target in targets: