Snap for 4801384 from 05cd4b895e5d78ef82448cb9bf71fba6b1ad48ae to pi-release

Change-Id: I9302ca41fad7b7d8c0790c183d9051867da452e0
diff --git a/Android.bp b/Android.bp
index 34b35eb..9391926 100644
--- a/Android.bp
+++ b/Android.bp
@@ -240,6 +240,11 @@
   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 de4a436..5f1c31d 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 2097906..d94b72a 100644
--- a/include/perfetto/tracing/core/trace_config.h
+++ b/include/perfetto/tracing/core/trace_config.h
@@ -52,6 +52,7 @@
 class TestConfig;
 class TraceConfig_ProducerConfig;
 class TraceConfig_StatsdMetadata;
+class TraceConfig_GuardrailOverrides;
 }  // namespace protos
 }  // namespace perfetto
 
@@ -203,6 +204,34 @@
     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 @@
   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 @@
   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 23abaf2..8c795ad 100644
--- a/perfetto.rc
+++ b/perfetto.rc
@@ -39,6 +39,12 @@
 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 48202b8..f75fccb 100644
--- a/protos/perfetto/config/perfetto_config.proto
+++ b/protos/perfetto/config/perfetto_config.proto
@@ -287,6 +287,16 @@
   // 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 36a02bb..9422337 100644
--- a/protos/perfetto/config/trace_config.proto
+++ b/protos/perfetto/config/trace_config.proto
@@ -125,4 +125,14 @@
   // 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 20e9228..9614642 100644
--- a/src/perfetto_cmd/perfetto_cmd.cc
+++ b/src/perfetto_cmd/perfetto_cmd.cc
@@ -230,6 +230,10 @@
   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 f4df2fc..1e2ef4f 100644
--- a/src/perfetto_cmd/rate_limiter.cc
+++ b/src/perfetto_cmd/rate_limiter.cc
@@ -96,7 +96,10 @@
 
   // 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 c163357..0d89b7d 100644
--- a/src/perfetto_cmd/rate_limiter.h
+++ b/src/perfetto_cmd/rate_limiter.h
@@ -28,6 +28,7 @@
     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 17ac97c..753e0e6 100644
--- a/src/perfetto_cmd/rate_limiter_unittest.cc
+++ b/src/perfetto_cmd/rate_limiter_unittest.cc
@@ -277,6 +277,22 @@
   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 f3bfca5..b4d0081 100644
--- a/src/tracing/core/trace_config.cc
+++ b/src/tracing/core/trace_config.cc
@@ -90,6 +90,8 @@
       "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 @@
   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 @@
   *(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 f71e001..d48c91c 100755
--- a/tools/gen_android_bp
+++ b/tools/gen_android_bp
@@ -176,6 +176,7 @@
         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 @@
         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 @@
         '-fvisibility=hidden',
         '-Oz',
     ]
+    defaults.user_debug_flag = True
 
     blueprint.add_module(defaults)
     for target in targets: