userdebug: support perfetto traces as a section in incident reports

This set of patches adds a way for the perfetto command line client to
save a trace to a hardcoded location,
/data/misc/perfetto-traces/incident-trace, and call into incidentd to
start a report, which will include said trace in a new section.

This is not a long-term solution, and is structured to minimize changes
to perfetto and incidentd. The latter is currently architected in a way
where it can only pull pre-defined information out of the system, so
we're resorting to persisting the intermediate results in a hardcoded
location.

This will introduce at most two more linked files at the same time.

Bug: 130543265
Tested: manually on blueline-userdebug
Change-Id: Iaaa312d2d9da73ca329807211227a8c7a049102c
This commit is contained in:
Ryan Savitski
2019-06-03 23:57:09 +01:00
parent 277082c2d8
commit 09a847902f
4 changed files with 16 additions and 3 deletions

View File

@@ -72,6 +72,8 @@ static TextParserBase* selectParser(int section) {
return new PsParser();
case 2006:
return new BatteryTypeParser();
case 3026: // system_trace is already a serialized protobuf
return new NoopParser();
default:
// Return no op parser when no specific ones are implemented.
return new NoopParser();

View File

@@ -67,6 +67,8 @@ bool section_requires_specific_mention(int sectionId) {
switch (sectionId) {
case 3025: // restricted_images
return true;
case 3026: // system_trace
return true;
default:
return false;
}

View File

@@ -321,6 +321,14 @@ message IncidentProto {
(section).args = "incidentcompanion --restricted_image"
];
// System trace as a serialized protobuf.
optional bytes system_trace = 3026 [
(section).type = SECTION_FILE,
(section).args = "/data/misc/perfetto-traces/incident-trace",
(privacy).dest = DEST_AUTOMATIC,
(section).userdebug_and_eng_only = true
];
// Reserved for OEMs.
extensions 50000 to 100000;
}

View File

@@ -408,9 +408,10 @@ static bool generateSectionListCpp(Descriptor const* descriptor) {
for (int i=0; i<descriptor->field_count(); i++) {
const FieldDescriptor* field = descriptor->field(i);
if (field->type() != FieldDescriptor::TYPE_MESSAGE
&& field->type() != FieldDescriptor::TYPE_STRING) {
continue;
if (field->type() != FieldDescriptor::TYPE_MESSAGE &&
field->type() != FieldDescriptor::TYPE_STRING &&
field->type() != FieldDescriptor::TYPE_BYTES) {
continue;
}
const SectionFlags s = getSectionFlags(field);