1 // Copyright (C) 2017 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "statsd_test_util.h"
16
17 #include <aggregator.pb.h>
18 #include <aidl/android/util/StatsEventParcel.h>
19 #include <android-base/properties.h>
20 #include <android-base/stringprintf.h>
21
22 #include "matchers/SimpleAtomMatchingTracker.h"
23 #include "stats_annotations.h"
24 #include "stats_event.h"
25 #include "stats_util.h"
26
27 using aidl::android::util::StatsEventParcel;
28 using android::base::SetProperty;
29 using android::base::StringPrintf;
30 using std::shared_ptr;
31 using zetasketch::android::AggregatorStateProto;
32
33 namespace android {
34 namespace os {
35 namespace statsd {
36
outputStreamToProto(ProtoOutputStream * proto)37 StatsLogReport outputStreamToProto(ProtoOutputStream* proto) {
38 vector<uint8_t> bytes;
39 bytes.resize(proto->size());
40 size_t pos = 0;
41 sp<ProtoReader> reader = proto->data();
42
43 while (reader->readBuffer() != NULL) {
44 size_t toRead = reader->currentToRead();
45 std::memcpy(&((bytes)[pos]), reader->readBuffer(), toRead);
46 pos += toRead;
47 reader->move(toRead);
48 }
49
50 StatsLogReport report;
51 report.ParseFromArray(bytes.data(), bytes.size());
52 return report;
53 }
54
CreateSimpleAtomMatcher(const string & name,int atomId)55 AtomMatcher CreateSimpleAtomMatcher(const string& name, int atomId) {
56 AtomMatcher atom_matcher;
57 atom_matcher.set_id(StringToId(name));
58 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
59 simple_atom_matcher->set_atom_id(atomId);
60 return atom_matcher;
61 }
62
CreateTemperatureAtomMatcher()63 AtomMatcher CreateTemperatureAtomMatcher() {
64 return CreateSimpleAtomMatcher("TemperatureMatcher", util::TEMPERATURE);
65 }
66
CreateScheduledJobStateChangedAtomMatcher(const string & name,ScheduledJobStateChanged::State state)67 AtomMatcher CreateScheduledJobStateChangedAtomMatcher(const string& name,
68 ScheduledJobStateChanged::State state) {
69 AtomMatcher atom_matcher;
70 atom_matcher.set_id(StringToId(name));
71 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
72 simple_atom_matcher->set_atom_id(util::SCHEDULED_JOB_STATE_CHANGED);
73 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
74 field_value_matcher->set_field(3); // State field.
75 field_value_matcher->set_eq_int(state);
76 return atom_matcher;
77 }
78
CreateStartScheduledJobAtomMatcher()79 AtomMatcher CreateStartScheduledJobAtomMatcher() {
80 return CreateScheduledJobStateChangedAtomMatcher("ScheduledJobStart",
81 ScheduledJobStateChanged::STARTED);
82 }
83
CreateFinishScheduledJobAtomMatcher()84 AtomMatcher CreateFinishScheduledJobAtomMatcher() {
85 return CreateScheduledJobStateChangedAtomMatcher("ScheduledJobFinish",
86 ScheduledJobStateChanged::FINISHED);
87 }
88
CreateScreenBrightnessChangedAtomMatcher()89 AtomMatcher CreateScreenBrightnessChangedAtomMatcher() {
90 AtomMatcher atom_matcher;
91 atom_matcher.set_id(StringToId("ScreenBrightnessChanged"));
92 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
93 simple_atom_matcher->set_atom_id(util::SCREEN_BRIGHTNESS_CHANGED);
94 return atom_matcher;
95 }
96
CreateUidProcessStateChangedAtomMatcher()97 AtomMatcher CreateUidProcessStateChangedAtomMatcher() {
98 AtomMatcher atom_matcher;
99 atom_matcher.set_id(StringToId("UidProcessStateChanged"));
100 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
101 simple_atom_matcher->set_atom_id(util::UID_PROCESS_STATE_CHANGED);
102 return atom_matcher;
103 }
104
CreateWakelockStateChangedAtomMatcher(const string & name,WakelockStateChanged::State state)105 AtomMatcher CreateWakelockStateChangedAtomMatcher(const string& name,
106 WakelockStateChanged::State state) {
107 AtomMatcher atom_matcher;
108 atom_matcher.set_id(StringToId(name));
109 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
110 simple_atom_matcher->set_atom_id(util::WAKELOCK_STATE_CHANGED);
111 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
112 field_value_matcher->set_field(4); // State field.
113 field_value_matcher->set_eq_int(state);
114 return atom_matcher;
115 }
116
CreateAcquireWakelockAtomMatcher()117 AtomMatcher CreateAcquireWakelockAtomMatcher() {
118 return CreateWakelockStateChangedAtomMatcher("AcquireWakelock", WakelockStateChanged::ACQUIRE);
119 }
120
CreateReleaseWakelockAtomMatcher()121 AtomMatcher CreateReleaseWakelockAtomMatcher() {
122 return CreateWakelockStateChangedAtomMatcher("ReleaseWakelock", WakelockStateChanged::RELEASE);
123 }
124
CreateBatterySaverModeStateChangedAtomMatcher(const string & name,BatterySaverModeStateChanged::State state)125 AtomMatcher CreateBatterySaverModeStateChangedAtomMatcher(
126 const string& name, BatterySaverModeStateChanged::State state) {
127 AtomMatcher atom_matcher;
128 atom_matcher.set_id(StringToId(name));
129 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
130 simple_atom_matcher->set_atom_id(util::BATTERY_SAVER_MODE_STATE_CHANGED);
131 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
132 field_value_matcher->set_field(1); // State field.
133 field_value_matcher->set_eq_int(state);
134 return atom_matcher;
135 }
136
CreateBatterySaverModeStartAtomMatcher()137 AtomMatcher CreateBatterySaverModeStartAtomMatcher() {
138 return CreateBatterySaverModeStateChangedAtomMatcher(
139 "BatterySaverModeStart", BatterySaverModeStateChanged::ON);
140 }
141
142
CreateBatterySaverModeStopAtomMatcher()143 AtomMatcher CreateBatterySaverModeStopAtomMatcher() {
144 return CreateBatterySaverModeStateChangedAtomMatcher(
145 "BatterySaverModeStop", BatterySaverModeStateChanged::OFF);
146 }
147
CreateBatteryStateChangedAtomMatcher(const string & name,BatteryPluggedStateEnum state)148 AtomMatcher CreateBatteryStateChangedAtomMatcher(const string& name,
149 BatteryPluggedStateEnum state) {
150 AtomMatcher atom_matcher;
151 atom_matcher.set_id(StringToId(name));
152 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
153 simple_atom_matcher->set_atom_id(util::PLUGGED_STATE_CHANGED);
154 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
155 field_value_matcher->set_field(1); // State field.
156 field_value_matcher->set_eq_int(state);
157 return atom_matcher;
158 }
159
CreateBatteryStateNoneMatcher()160 AtomMatcher CreateBatteryStateNoneMatcher() {
161 return CreateBatteryStateChangedAtomMatcher("BatteryPluggedNone",
162 BatteryPluggedStateEnum::BATTERY_PLUGGED_NONE);
163 }
164
CreateBatteryStateUsbMatcher()165 AtomMatcher CreateBatteryStateUsbMatcher() {
166 return CreateBatteryStateChangedAtomMatcher("BatteryPluggedUsb",
167 BatteryPluggedStateEnum::BATTERY_PLUGGED_USB);
168 }
169
CreateScreenStateChangedAtomMatcher(const string & name,android::view::DisplayStateEnum state)170 AtomMatcher CreateScreenStateChangedAtomMatcher(
171 const string& name, android::view::DisplayStateEnum state) {
172 AtomMatcher atom_matcher;
173 atom_matcher.set_id(StringToId(name));
174 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
175 simple_atom_matcher->set_atom_id(util::SCREEN_STATE_CHANGED);
176 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
177 field_value_matcher->set_field(1); // State field.
178 field_value_matcher->set_eq_int(state);
179 return atom_matcher;
180 }
181
CreateScreenTurnedOnAtomMatcher()182 AtomMatcher CreateScreenTurnedOnAtomMatcher() {
183 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOn",
184 android::view::DisplayStateEnum::DISPLAY_STATE_ON);
185 }
186
CreateScreenTurnedOffAtomMatcher()187 AtomMatcher CreateScreenTurnedOffAtomMatcher() {
188 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOff",
189 ::android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
190 }
191
CreateSyncStateChangedAtomMatcher(const string & name,SyncStateChanged::State state)192 AtomMatcher CreateSyncStateChangedAtomMatcher(
193 const string& name, SyncStateChanged::State state) {
194 AtomMatcher atom_matcher;
195 atom_matcher.set_id(StringToId(name));
196 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
197 simple_atom_matcher->set_atom_id(util::SYNC_STATE_CHANGED);
198 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
199 field_value_matcher->set_field(3); // State field.
200 field_value_matcher->set_eq_int(state);
201 return atom_matcher;
202 }
203
CreateSyncStartAtomMatcher()204 AtomMatcher CreateSyncStartAtomMatcher() {
205 return CreateSyncStateChangedAtomMatcher("SyncStart", SyncStateChanged::ON);
206 }
207
CreateSyncEndAtomMatcher()208 AtomMatcher CreateSyncEndAtomMatcher() {
209 return CreateSyncStateChangedAtomMatcher("SyncEnd", SyncStateChanged::OFF);
210 }
211
CreateActivityForegroundStateChangedAtomMatcher(const string & name,ActivityForegroundStateChanged::State state)212 AtomMatcher CreateActivityForegroundStateChangedAtomMatcher(
213 const string& name, ActivityForegroundStateChanged::State state) {
214 AtomMatcher atom_matcher;
215 atom_matcher.set_id(StringToId(name));
216 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
217 simple_atom_matcher->set_atom_id(util::ACTIVITY_FOREGROUND_STATE_CHANGED);
218 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
219 field_value_matcher->set_field(4); // Activity field.
220 field_value_matcher->set_eq_int(state);
221 return atom_matcher;
222 }
223
CreateMoveToBackgroundAtomMatcher()224 AtomMatcher CreateMoveToBackgroundAtomMatcher() {
225 return CreateActivityForegroundStateChangedAtomMatcher(
226 "Background", ActivityForegroundStateChanged::BACKGROUND);
227 }
228
CreateMoveToForegroundAtomMatcher()229 AtomMatcher CreateMoveToForegroundAtomMatcher() {
230 return CreateActivityForegroundStateChangedAtomMatcher(
231 "Foreground", ActivityForegroundStateChanged::FOREGROUND);
232 }
233
CreateProcessLifeCycleStateChangedAtomMatcher(const string & name,ProcessLifeCycleStateChanged::State state)234 AtomMatcher CreateProcessLifeCycleStateChangedAtomMatcher(
235 const string& name, ProcessLifeCycleStateChanged::State state) {
236 AtomMatcher atom_matcher;
237 atom_matcher.set_id(StringToId(name));
238 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
239 simple_atom_matcher->set_atom_id(util::PROCESS_LIFE_CYCLE_STATE_CHANGED);
240 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
241 field_value_matcher->set_field(3); // Process state field.
242 field_value_matcher->set_eq_int(state);
243 return atom_matcher;
244 }
245
CreateProcessCrashAtomMatcher()246 AtomMatcher CreateProcessCrashAtomMatcher() {
247 return CreateProcessLifeCycleStateChangedAtomMatcher(
248 "Crashed", ProcessLifeCycleStateChanged::CRASHED);
249 }
250
CreateAppStartOccurredAtomMatcher()251 AtomMatcher CreateAppStartOccurredAtomMatcher() {
252 return CreateSimpleAtomMatcher("AppStartOccurredMatcher", util::APP_START_OCCURRED);
253 }
254
CreateTestAtomRepeatedStateAtomMatcher(const string & name,TestAtomReported::State state,Position position)255 AtomMatcher CreateTestAtomRepeatedStateAtomMatcher(const string& name,
256 TestAtomReported::State state,
257 Position position) {
258 AtomMatcher atom_matcher;
259 atom_matcher.set_id(StringToId(name));
260 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
261 simple_atom_matcher->set_atom_id(util::TEST_ATOM_REPORTED);
262 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
263 field_value_matcher->set_field(14); // Repeated enum field.
264 field_value_matcher->set_eq_int(state);
265 field_value_matcher->set_position(position);
266 return atom_matcher;
267 }
268
CreateTestAtomRepeatedStateFirstOffAtomMatcher()269 AtomMatcher CreateTestAtomRepeatedStateFirstOffAtomMatcher() {
270 return CreateTestAtomRepeatedStateAtomMatcher("TestFirstStateOff", TestAtomReported::OFF,
271 Position::FIRST);
272 }
273
CreateTestAtomRepeatedStateFirstOnAtomMatcher()274 AtomMatcher CreateTestAtomRepeatedStateFirstOnAtomMatcher() {
275 return CreateTestAtomRepeatedStateAtomMatcher("TestFirstStateOn", TestAtomReported::ON,
276 Position::FIRST);
277 }
278
CreateTestAtomRepeatedStateAnyOnAtomMatcher()279 AtomMatcher CreateTestAtomRepeatedStateAnyOnAtomMatcher() {
280 return CreateTestAtomRepeatedStateAtomMatcher("TestAnyStateOn", TestAtomReported::ON,
281 Position::ANY);
282 }
283
addMatcherToMatcherCombination(const AtomMatcher & matcher,AtomMatcher * combinationMatcher)284 void addMatcherToMatcherCombination(const AtomMatcher& matcher, AtomMatcher* combinationMatcher) {
285 combinationMatcher->mutable_combination()->add_matcher(matcher.id());
286 }
287
CreateScheduledJobPredicate()288 Predicate CreateScheduledJobPredicate() {
289 Predicate predicate;
290 predicate.set_id(StringToId("ScheduledJobRunningPredicate"));
291 predicate.mutable_simple_predicate()->set_start(StringToId("ScheduledJobStart"));
292 predicate.mutable_simple_predicate()->set_stop(StringToId("ScheduledJobFinish"));
293 return predicate;
294 }
295
CreateBatterySaverModePredicate()296 Predicate CreateBatterySaverModePredicate() {
297 Predicate predicate;
298 predicate.set_id(StringToId("BatterySaverIsOn"));
299 predicate.mutable_simple_predicate()->set_start(StringToId("BatterySaverModeStart"));
300 predicate.mutable_simple_predicate()->set_stop(StringToId("BatterySaverModeStop"));
301 return predicate;
302 }
303
CreateDeviceUnpluggedPredicate()304 Predicate CreateDeviceUnpluggedPredicate() {
305 Predicate predicate;
306 predicate.set_id(StringToId("DeviceUnplugged"));
307 predicate.mutable_simple_predicate()->set_start(StringToId("BatteryPluggedNone"));
308 predicate.mutable_simple_predicate()->set_stop(StringToId("BatteryPluggedUsb"));
309 return predicate;
310 }
311
CreateScreenIsOnPredicate()312 Predicate CreateScreenIsOnPredicate() {
313 Predicate predicate;
314 predicate.set_id(StringToId("ScreenIsOn"));
315 predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOn"));
316 predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOff"));
317 return predicate;
318 }
319
CreateScreenIsOffPredicate()320 Predicate CreateScreenIsOffPredicate() {
321 Predicate predicate;
322 predicate.set_id(1111123);
323 predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOff"));
324 predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOn"));
325 return predicate;
326 }
327
CreateHoldingWakelockPredicate()328 Predicate CreateHoldingWakelockPredicate() {
329 Predicate predicate;
330 predicate.set_id(StringToId("HoldingWakelock"));
331 predicate.mutable_simple_predicate()->set_start(StringToId("AcquireWakelock"));
332 predicate.mutable_simple_predicate()->set_stop(StringToId("ReleaseWakelock"));
333 return predicate;
334 }
335
CreateIsSyncingPredicate()336 Predicate CreateIsSyncingPredicate() {
337 Predicate predicate;
338 predicate.set_id(33333333333333);
339 predicate.mutable_simple_predicate()->set_start(StringToId("SyncStart"));
340 predicate.mutable_simple_predicate()->set_stop(StringToId("SyncEnd"));
341 return predicate;
342 }
343
CreateIsInBackgroundPredicate()344 Predicate CreateIsInBackgroundPredicate() {
345 Predicate predicate;
346 predicate.set_id(StringToId("IsInBackground"));
347 predicate.mutable_simple_predicate()->set_start(StringToId("Background"));
348 predicate.mutable_simple_predicate()->set_stop(StringToId("Foreground"));
349 return predicate;
350 }
351
CreateTestAtomRepeatedStateFirstOffPredicate()352 Predicate CreateTestAtomRepeatedStateFirstOffPredicate() {
353 Predicate predicate;
354 predicate.set_id(StringToId("TestFirstStateIsOff"));
355 predicate.mutable_simple_predicate()->set_start(StringToId("TestFirstStateOff"));
356 predicate.mutable_simple_predicate()->set_stop(StringToId("TestFirstStateOn"));
357 return predicate;
358 }
359
CreateScreenState()360 State CreateScreenState() {
361 State state;
362 state.set_id(StringToId("ScreenState"));
363 state.set_atom_id(util::SCREEN_STATE_CHANGED);
364 return state;
365 }
366
CreateUidProcessState()367 State CreateUidProcessState() {
368 State state;
369 state.set_id(StringToId("UidProcessState"));
370 state.set_atom_id(util::UID_PROCESS_STATE_CHANGED);
371 return state;
372 }
373
CreateOverlayState()374 State CreateOverlayState() {
375 State state;
376 state.set_id(StringToId("OverlayState"));
377 state.set_atom_id(util::OVERLAY_STATE_CHANGED);
378 return state;
379 }
380
CreateScreenStateWithOnOffMap(int64_t screenOnId,int64_t screenOffId)381 State CreateScreenStateWithOnOffMap(int64_t screenOnId, int64_t screenOffId) {
382 State state;
383 state.set_id(StringToId("ScreenStateOnOff"));
384 state.set_atom_id(util::SCREEN_STATE_CHANGED);
385
386 auto map = CreateScreenStateOnOffMap(screenOnId, screenOffId);
387 *state.mutable_map() = map;
388
389 return state;
390 }
391
CreateScreenStateWithSimpleOnOffMap(int64_t screenOnId,int64_t screenOffId)392 State CreateScreenStateWithSimpleOnOffMap(int64_t screenOnId, int64_t screenOffId) {
393 State state;
394 state.set_id(StringToId("ScreenStateSimpleOnOff"));
395 state.set_atom_id(util::SCREEN_STATE_CHANGED);
396
397 auto map = CreateScreenStateSimpleOnOffMap(screenOnId, screenOffId);
398 *state.mutable_map() = map;
399
400 return state;
401 }
402
CreateScreenStateOnGroup(int64_t screenOnId)403 StateMap_StateGroup CreateScreenStateOnGroup(int64_t screenOnId) {
404 StateMap_StateGroup group;
405 group.set_group_id(screenOnId);
406 group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_ON);
407 group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_VR);
408 group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_ON_SUSPEND);
409 return group;
410 }
411
CreateScreenStateOffGroup(int64_t screenOffId)412 StateMap_StateGroup CreateScreenStateOffGroup(int64_t screenOffId) {
413 StateMap_StateGroup group;
414 group.set_group_id(screenOffId);
415 group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
416 group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_DOZE);
417 group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_DOZE_SUSPEND);
418 return group;
419 }
420
CreateScreenStateSimpleOnGroup(int64_t screenOnId)421 StateMap_StateGroup CreateScreenStateSimpleOnGroup(int64_t screenOnId) {
422 StateMap_StateGroup group;
423 group.set_group_id(screenOnId);
424 group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_ON);
425 return group;
426 }
427
CreateScreenStateSimpleOffGroup(int64_t screenOffId)428 StateMap_StateGroup CreateScreenStateSimpleOffGroup(int64_t screenOffId) {
429 StateMap_StateGroup group;
430 group.set_group_id(screenOffId);
431 group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
432 return group;
433 }
434
CreateScreenStateOnOffMap(int64_t screenOnId,int64_t screenOffId)435 StateMap CreateScreenStateOnOffMap(int64_t screenOnId, int64_t screenOffId) {
436 StateMap map;
437 *map.add_group() = CreateScreenStateOnGroup(screenOnId);
438 *map.add_group() = CreateScreenStateOffGroup(screenOffId);
439 return map;
440 }
441
CreateScreenStateSimpleOnOffMap(int64_t screenOnId,int64_t screenOffId)442 StateMap CreateScreenStateSimpleOnOffMap(int64_t screenOnId, int64_t screenOffId) {
443 StateMap map;
444 *map.add_group() = CreateScreenStateSimpleOnGroup(screenOnId);
445 *map.add_group() = CreateScreenStateSimpleOffGroup(screenOffId);
446 return map;
447 }
448
addPredicateToPredicateCombination(const Predicate & predicate,Predicate * combinationPredicate)449 void addPredicateToPredicateCombination(const Predicate& predicate,
450 Predicate* combinationPredicate) {
451 combinationPredicate->mutable_combination()->add_predicate(predicate.id());
452 }
453
CreateAttributionUidDimensions(const int atomId,const std::vector<Position> & positions)454 FieldMatcher CreateAttributionUidDimensions(const int atomId,
455 const std::vector<Position>& positions) {
456 FieldMatcher dimensions;
457 dimensions.set_field(atomId);
458 for (const auto position : positions) {
459 auto child = dimensions.add_child();
460 child->set_field(1);
461 child->set_position(position);
462 child->add_child()->set_field(1);
463 }
464 return dimensions;
465 }
466
CreateAttributionUidAndTagDimensions(const int atomId,const std::vector<Position> & positions)467 FieldMatcher CreateAttributionUidAndTagDimensions(const int atomId,
468 const std::vector<Position>& positions) {
469 FieldMatcher dimensions;
470 dimensions.set_field(atomId);
471 for (const auto position : positions) {
472 auto child = dimensions.add_child();
473 child->set_field(1);
474 child->set_position(position);
475 child->add_child()->set_field(1);
476 child->add_child()->set_field(2);
477 }
478 return dimensions;
479 }
480
CreateDimensions(const int atomId,const std::vector<int> & fields)481 FieldMatcher CreateDimensions(const int atomId, const std::vector<int>& fields) {
482 FieldMatcher dimensions;
483 dimensions.set_field(atomId);
484 for (const int field : fields) {
485 dimensions.add_child()->set_field(field);
486 }
487 return dimensions;
488 }
489
CreateRepeatedDimensions(const int atomId,const std::vector<int> & fields,const std::vector<Position> & positions)490 FieldMatcher CreateRepeatedDimensions(const int atomId, const std::vector<int>& fields,
491 const std::vector<Position>& positions) {
492 FieldMatcher dimensions;
493 if (fields.size() != positions.size()) {
494 return dimensions;
495 }
496
497 dimensions.set_field(atomId);
498 for (size_t i = 0; i < fields.size(); i++) {
499 auto child = dimensions.add_child();
500 child->set_field(fields[i]);
501 child->set_position(positions[i]);
502 }
503 return dimensions;
504 }
505
CreateAttributionUidAndOtherDimensions(const int atomId,const std::vector<Position> & positions,const std::vector<int> & fields)506 FieldMatcher CreateAttributionUidAndOtherDimensions(const int atomId,
507 const std::vector<Position>& positions,
508 const std::vector<int>& fields) {
509 FieldMatcher dimensions = CreateAttributionUidDimensions(atomId, positions);
510
511 for (const int field : fields) {
512 dimensions.add_child()->set_field(field);
513 }
514 return dimensions;
515 }
516
createEventMetric(const string & name,const int64_t what,const optional<int64_t> & condition)517 EventMetric createEventMetric(const string& name, const int64_t what,
518 const optional<int64_t>& condition) {
519 EventMetric metric;
520 metric.set_id(StringToId(name));
521 metric.set_what(what);
522 if (condition) {
523 metric.set_condition(condition.value());
524 }
525 return metric;
526 }
527
createCountMetric(const string & name,const int64_t what,const optional<int64_t> & condition,const vector<int64_t> & states)528 CountMetric createCountMetric(const string& name, const int64_t what,
529 const optional<int64_t>& condition, const vector<int64_t>& states) {
530 CountMetric metric;
531 metric.set_id(StringToId(name));
532 metric.set_what(what);
533 metric.set_bucket(TEN_MINUTES);
534 if (condition) {
535 metric.set_condition(condition.value());
536 }
537 for (const int64_t state : states) {
538 metric.add_slice_by_state(state);
539 }
540 return metric;
541 }
542
createDurationMetric(const string & name,const int64_t what,const optional<int64_t> & condition,const vector<int64_t> & states)543 DurationMetric createDurationMetric(const string& name, const int64_t what,
544 const optional<int64_t>& condition,
545 const vector<int64_t>& states) {
546 DurationMetric metric;
547 metric.set_id(StringToId(name));
548 metric.set_what(what);
549 metric.set_bucket(TEN_MINUTES);
550 if (condition) {
551 metric.set_condition(condition.value());
552 }
553 for (const int64_t state : states) {
554 metric.add_slice_by_state(state);
555 }
556 return metric;
557 }
558
createGaugeMetric(const string & name,const int64_t what,const GaugeMetric::SamplingType samplingType,const optional<int64_t> & condition,const optional<int64_t> & triggerEvent)559 GaugeMetric createGaugeMetric(const string& name, const int64_t what,
560 const GaugeMetric::SamplingType samplingType,
561 const optional<int64_t>& condition,
562 const optional<int64_t>& triggerEvent) {
563 GaugeMetric metric;
564 metric.set_id(StringToId(name));
565 metric.set_what(what);
566 metric.set_bucket(TEN_MINUTES);
567 metric.set_sampling_type(samplingType);
568 if (condition) {
569 metric.set_condition(condition.value());
570 }
571 if (triggerEvent) {
572 metric.set_trigger_event(triggerEvent.value());
573 }
574 metric.mutable_gauge_fields_filter()->set_include_all(true);
575 return metric;
576 }
577
createValueMetric(const string & name,const AtomMatcher & what,const int valueField,const optional<int64_t> & condition,const vector<int64_t> & states)578 ValueMetric createValueMetric(const string& name, const AtomMatcher& what, const int valueField,
579 const optional<int64_t>& condition, const vector<int64_t>& states) {
580 ValueMetric metric;
581 metric.set_id(StringToId(name));
582 metric.set_what(what.id());
583 metric.set_bucket(TEN_MINUTES);
584 metric.mutable_value_field()->set_field(what.simple_atom_matcher().atom_id());
585 metric.mutable_value_field()->add_child()->set_field(valueField);
586 if (condition) {
587 metric.set_condition(condition.value());
588 }
589 for (const int64_t state : states) {
590 metric.add_slice_by_state(state);
591 }
592 return metric;
593 }
594
createKllMetric(const string & name,const AtomMatcher & what,const int valueField,const optional<int64_t> & condition)595 KllMetric createKllMetric(const string& name, const AtomMatcher& what, const int valueField,
596 const optional<int64_t>& condition) {
597 KllMetric metric;
598 metric.set_id(StringToId(name));
599 metric.set_what(what.id());
600 metric.set_bucket(TEN_MINUTES);
601 metric.mutable_kll_field()->set_field(what.simple_atom_matcher().atom_id());
602 metric.mutable_kll_field()->add_child()->set_field(valueField);
603 if (condition) {
604 metric.set_condition(condition.value());
605 }
606 return metric;
607 }
608
createAlert(const string & name,const int64_t metricId,const int buckets,const int64_t triggerSum)609 Alert createAlert(const string& name, const int64_t metricId, const int buckets,
610 const int64_t triggerSum) {
611 Alert alert;
612 alert.set_id(StringToId(name));
613 alert.set_metric_id(metricId);
614 alert.set_num_buckets(buckets);
615 alert.set_trigger_if_sum_gt(triggerSum);
616 return alert;
617 }
618
createAlarm(const string & name,const int64_t offsetMillis,const int64_t periodMillis)619 Alarm createAlarm(const string& name, const int64_t offsetMillis, const int64_t periodMillis) {
620 Alarm alarm;
621 alarm.set_id(StringToId(name));
622 alarm.set_offset_millis(offsetMillis);
623 alarm.set_period_millis(periodMillis);
624 return alarm;
625 }
626
createSubscription(const string & name,const Subscription_RuleType type,const int64_t ruleId)627 Subscription createSubscription(const string& name, const Subscription_RuleType type,
628 const int64_t ruleId) {
629 Subscription subscription;
630 subscription.set_id(StringToId(name));
631 subscription.set_rule_type(type);
632 subscription.set_rule_id(ruleId);
633 subscription.mutable_broadcast_subscriber_details();
634 return subscription;
635 }
636
637 // START: get primary key functions
getUidProcessKey(int uid,HashableDimensionKey * key)638 void getUidProcessKey(int uid, HashableDimensionKey* key) {
639 int pos1[] = {1, 0, 0};
640 Field field1(27 /* atom id */, pos1, 0 /* depth */);
641 Value value1((int32_t)uid);
642
643 key->addValue(FieldValue(field1, value1));
644 }
645
getOverlayKey(int uid,string packageName,HashableDimensionKey * key)646 void getOverlayKey(int uid, string packageName, HashableDimensionKey* key) {
647 int pos1[] = {1, 0, 0};
648 int pos2[] = {2, 0, 0};
649
650 Field field1(59 /* atom id */, pos1, 0 /* depth */);
651 Field field2(59 /* atom id */, pos2, 0 /* depth */);
652
653 Value value1((int32_t)uid);
654 Value value2(packageName);
655
656 key->addValue(FieldValue(field1, value1));
657 key->addValue(FieldValue(field2, value2));
658 }
659
getPartialWakelockKey(int uid,const std::string & tag,HashableDimensionKey * key)660 void getPartialWakelockKey(int uid, const std::string& tag, HashableDimensionKey* key) {
661 int pos1[] = {1, 1, 1};
662 int pos3[] = {2, 0, 0};
663 int pos4[] = {3, 0, 0};
664
665 Field field1(10 /* atom id */, pos1, 2 /* depth */);
666
667 Field field3(10 /* atom id */, pos3, 0 /* depth */);
668 Field field4(10 /* atom id */, pos4, 0 /* depth */);
669
670 Value value1((int32_t)uid);
671 Value value3((int32_t)1 /*partial*/);
672 Value value4(tag);
673
674 key->addValue(FieldValue(field1, value1));
675 key->addValue(FieldValue(field3, value3));
676 key->addValue(FieldValue(field4, value4));
677 }
678
getPartialWakelockKey(int uid,HashableDimensionKey * key)679 void getPartialWakelockKey(int uid, HashableDimensionKey* key) {
680 int pos1[] = {1, 1, 1};
681 int pos3[] = {2, 0, 0};
682
683 Field field1(10 /* atom id */, pos1, 2 /* depth */);
684 Field field3(10 /* atom id */, pos3, 0 /* depth */);
685
686 Value value1((int32_t)uid);
687 Value value3((int32_t)1 /*partial*/);
688
689 key->addValue(FieldValue(field1, value1));
690 key->addValue(FieldValue(field3, value3));
691 }
692 // END: get primary key functions
693
writeAttribution(AStatsEvent * statsEvent,const vector<int> & attributionUids,const vector<string> & attributionTags)694 void writeAttribution(AStatsEvent* statsEvent, const vector<int>& attributionUids,
695 const vector<string>& attributionTags) {
696 vector<const char*> cTags(attributionTags.size());
697 for (int i = 0; i < cTags.size(); i++) {
698 cTags[i] = attributionTags[i].c_str();
699 }
700
701 AStatsEvent_writeAttributionChain(statsEvent,
702 reinterpret_cast<const uint32_t*>(attributionUids.data()),
703 cTags.data(), attributionUids.size());
704 }
705
parseStatsEventToLogEvent(AStatsEvent * statsEvent,LogEvent * logEvent)706 void parseStatsEventToLogEvent(AStatsEvent* statsEvent, LogEvent* logEvent) {
707 AStatsEvent_build(statsEvent);
708
709 size_t size;
710 uint8_t* buf = AStatsEvent_getBuffer(statsEvent, &size);
711 logEvent->parseBuffer(buf, size);
712
713 AStatsEvent_release(statsEvent);
714 }
715
CreateTwoValueLogEvent(LogEvent * logEvent,int atomId,int64_t eventTimeNs,int32_t value1,int32_t value2)716 void CreateTwoValueLogEvent(LogEvent* logEvent, int atomId, int64_t eventTimeNs, int32_t value1,
717 int32_t value2) {
718 AStatsEvent* statsEvent = AStatsEvent_obtain();
719 AStatsEvent_setAtomId(statsEvent, atomId);
720 AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
721
722 AStatsEvent_writeInt32(statsEvent, value1);
723 AStatsEvent_writeInt32(statsEvent, value2);
724
725 parseStatsEventToLogEvent(statsEvent, logEvent);
726 }
727
CreateTwoValueLogEvent(int atomId,int64_t eventTimeNs,int32_t value1,int32_t value2)728 shared_ptr<LogEvent> CreateTwoValueLogEvent(int atomId, int64_t eventTimeNs, int32_t value1,
729 int32_t value2) {
730 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
731 CreateTwoValueLogEvent(logEvent.get(), atomId, eventTimeNs, value1, value2);
732 return logEvent;
733 }
734
CreateThreeValueLogEvent(LogEvent * logEvent,int atomId,int64_t eventTimeNs,int32_t value1,int32_t value2,int32_t value3)735 void CreateThreeValueLogEvent(LogEvent* logEvent, int atomId, int64_t eventTimeNs, int32_t value1,
736 int32_t value2, int32_t value3) {
737 AStatsEvent* statsEvent = AStatsEvent_obtain();
738 AStatsEvent_setAtomId(statsEvent, atomId);
739 AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
740
741 AStatsEvent_writeInt32(statsEvent, value1);
742 AStatsEvent_writeInt32(statsEvent, value2);
743 AStatsEvent_writeInt32(statsEvent, value3);
744
745 parseStatsEventToLogEvent(statsEvent, logEvent);
746 }
747
CreateThreeValueLogEvent(int atomId,int64_t eventTimeNs,int32_t value1,int32_t value2,int32_t value3)748 shared_ptr<LogEvent> CreateThreeValueLogEvent(int atomId, int64_t eventTimeNs, int32_t value1,
749 int32_t value2, int32_t value3) {
750 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
751 CreateThreeValueLogEvent(logEvent.get(), atomId, eventTimeNs, value1, value2, value3);
752 return logEvent;
753 }
754
CreateRepeatedValueLogEvent(LogEvent * logEvent,int atomId,int64_t eventTimeNs,int32_t value)755 void CreateRepeatedValueLogEvent(LogEvent* logEvent, int atomId, int64_t eventTimeNs,
756 int32_t value) {
757 AStatsEvent* statsEvent = AStatsEvent_obtain();
758 AStatsEvent_setAtomId(statsEvent, atomId);
759 AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
760
761 AStatsEvent_writeInt32(statsEvent, value);
762 AStatsEvent_writeInt32(statsEvent, value);
763
764 parseStatsEventToLogEvent(statsEvent, logEvent);
765 }
766
CreateRepeatedValueLogEvent(int atomId,int64_t eventTimeNs,int32_t value)767 shared_ptr<LogEvent> CreateRepeatedValueLogEvent(int atomId, int64_t eventTimeNs, int32_t value) {
768 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
769 CreateRepeatedValueLogEvent(logEvent.get(), atomId, eventTimeNs, value);
770 return logEvent;
771 }
772
CreateNoValuesLogEvent(LogEvent * logEvent,int atomId,int64_t eventTimeNs)773 void CreateNoValuesLogEvent(LogEvent* logEvent, int atomId, int64_t eventTimeNs) {
774 AStatsEvent* statsEvent = AStatsEvent_obtain();
775 AStatsEvent_setAtomId(statsEvent, atomId);
776 AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
777
778 parseStatsEventToLogEvent(statsEvent, logEvent);
779 }
780
CreateNoValuesLogEvent(int atomId,int64_t eventTimeNs)781 shared_ptr<LogEvent> CreateNoValuesLogEvent(int atomId, int64_t eventTimeNs) {
782 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
783 CreateNoValuesLogEvent(logEvent.get(), atomId, eventTimeNs);
784 return logEvent;
785 }
786
makeUidStatsEvent(int atomId,int64_t eventTimeNs,int uid,int data1,int data2)787 AStatsEvent* makeUidStatsEvent(int atomId, int64_t eventTimeNs, int uid, int data1, int data2) {
788 AStatsEvent* statsEvent = AStatsEvent_obtain();
789 AStatsEvent_setAtomId(statsEvent, atomId);
790 AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
791
792 AStatsEvent_writeInt32(statsEvent, uid);
793 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
794 AStatsEvent_writeInt32(statsEvent, data1);
795 AStatsEvent_writeInt32(statsEvent, data2);
796
797 return statsEvent;
798 }
799
makeUidStatsEvent(int atomId,int64_t eventTimeNs,int uid,int data1,const vector<int> & data2)800 AStatsEvent* makeUidStatsEvent(int atomId, int64_t eventTimeNs, int uid, int data1,
801 const vector<int>& data2) {
802 AStatsEvent* statsEvent = AStatsEvent_obtain();
803 AStatsEvent_setAtomId(statsEvent, atomId);
804 AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
805 AStatsEvent_writeInt32(statsEvent, uid);
806 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
807 AStatsEvent_writeInt32(statsEvent, data1);
808 AStatsEvent_writeInt32Array(statsEvent, data2.data(), data2.size());
809
810 return statsEvent;
811 }
812
makeUidLogEvent(int atomId,int64_t eventTimeNs,int uid,int data1,int data2)813 shared_ptr<LogEvent> makeUidLogEvent(int atomId, int64_t eventTimeNs, int uid, int data1,
814 int data2) {
815 AStatsEvent* statsEvent = makeUidStatsEvent(atomId, eventTimeNs, uid, data1, data2);
816
817 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
818 parseStatsEventToLogEvent(statsEvent, logEvent.get());
819 return logEvent;
820 }
821
makeUidLogEvent(int atomId,int64_t eventTimeNs,int uid,int data1,const vector<int> & data2)822 shared_ptr<LogEvent> makeUidLogEvent(int atomId, int64_t eventTimeNs, int uid, int data1,
823 const vector<int>& data2) {
824 AStatsEvent* statsEvent = makeUidStatsEvent(atomId, eventTimeNs, uid, data1, data2);
825
826 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
827 parseStatsEventToLogEvent(statsEvent, logEvent.get());
828 return logEvent;
829 }
830
makeExtraUidsLogEvent(int atomId,int64_t eventTimeNs,int uid1,int data1,int data2,const vector<int> & extraUids)831 shared_ptr<LogEvent> makeExtraUidsLogEvent(int atomId, int64_t eventTimeNs, int uid1, int data1,
832 int data2, const vector<int>& extraUids) {
833 AStatsEvent* statsEvent = makeUidStatsEvent(atomId, eventTimeNs, uid1, data1, data2);
834 for (const int extraUid : extraUids) {
835 AStatsEvent_writeInt32(statsEvent, extraUid);
836 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
837 }
838
839 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
840 parseStatsEventToLogEvent(statsEvent, logEvent.get());
841 return logEvent;
842 }
843
makeRepeatedUidLogEvent(int atomId,int64_t eventTimeNs,const vector<int> & uids)844 shared_ptr<LogEvent> makeRepeatedUidLogEvent(int atomId, int64_t eventTimeNs,
845 const vector<int>& uids) {
846 AStatsEvent* statsEvent = AStatsEvent_obtain();
847 AStatsEvent_setAtomId(statsEvent, atomId);
848 AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
849 AStatsEvent_writeInt32Array(statsEvent, uids.data(), uids.size());
850 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
851
852 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
853 parseStatsEventToLogEvent(statsEvent, logEvent.get());
854
855 return logEvent;
856 }
857
makeRepeatedUidLogEvent(int atomId,int64_t eventTimeNs,const vector<int> & uids,int data1,int data2)858 shared_ptr<LogEvent> makeRepeatedUidLogEvent(int atomId, int64_t eventTimeNs,
859 const vector<int>& uids, int data1, int data2) {
860 AStatsEvent* statsEvent = AStatsEvent_obtain();
861 AStatsEvent_setAtomId(statsEvent, atomId);
862 AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
863 AStatsEvent_writeInt32Array(statsEvent, uids.data(), uids.size());
864 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
865 AStatsEvent_writeInt32(statsEvent, data1);
866 AStatsEvent_writeInt32(statsEvent, data2);
867
868 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
869 parseStatsEventToLogEvent(statsEvent, logEvent.get());
870
871 return logEvent;
872 }
873
makeRepeatedUidLogEvent(int atomId,int64_t eventTimeNs,const vector<int> & uids,int data1,const vector<int> & data2)874 shared_ptr<LogEvent> makeRepeatedUidLogEvent(int atomId, int64_t eventTimeNs,
875 const vector<int>& uids, int data1,
876 const vector<int>& data2) {
877 AStatsEvent* statsEvent = AStatsEvent_obtain();
878 AStatsEvent_setAtomId(statsEvent, atomId);
879 AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
880 AStatsEvent_writeInt32Array(statsEvent, uids.data(), uids.size());
881 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
882 AStatsEvent_writeInt32(statsEvent, data1);
883 AStatsEvent_writeInt32Array(statsEvent, data2.data(), data2.size());
884
885 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
886 parseStatsEventToLogEvent(statsEvent, logEvent.get());
887
888 return logEvent;
889 }
890
makeAttributionLogEvent(int atomId,int64_t eventTimeNs,const vector<int> & uids,const vector<string> & tags,int data1,int data2)891 shared_ptr<LogEvent> makeAttributionLogEvent(int atomId, int64_t eventTimeNs,
892 const vector<int>& uids, const vector<string>& tags,
893 int data1, int data2) {
894 AStatsEvent* statsEvent = AStatsEvent_obtain();
895 AStatsEvent_setAtomId(statsEvent, atomId);
896 AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
897
898 writeAttribution(statsEvent, uids, tags);
899 AStatsEvent_writeInt32(statsEvent, data1);
900 AStatsEvent_writeInt32(statsEvent, data2);
901
902 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
903 parseStatsEventToLogEvent(statsEvent, logEvent.get());
904 return logEvent;
905 }
906
makeMockUidMapForHosts(const map<int,vector<int>> & hostUidToIsolatedUidsMap)907 sp<MockUidMap> makeMockUidMapForHosts(const map<int, vector<int>>& hostUidToIsolatedUidsMap) {
908 sp<MockUidMap> uidMap = new NaggyMock<MockUidMap>();
909 EXPECT_CALL(*uidMap, getHostUidOrSelf(_)).WillRepeatedly(ReturnArg<0>());
910 for (const auto& [hostUid, isolatedUids] : hostUidToIsolatedUidsMap) {
911 for (const int isolatedUid : isolatedUids) {
912 EXPECT_CALL(*uidMap, getHostUidOrSelf(isolatedUid)).WillRepeatedly(Return(hostUid));
913 }
914 }
915
916 return uidMap;
917 }
918
makeMockUidMapForPackage(const string & pkg,const set<int32_t> & uids)919 sp<MockUidMap> makeMockUidMapForPackage(const string& pkg, const set<int32_t>& uids) {
920 sp<MockUidMap> uidMap = new StrictMock<MockUidMap>();
921 EXPECT_CALL(*uidMap, getAppUid(_)).Times(AnyNumber());
922 EXPECT_CALL(*uidMap, getAppUid(pkg)).WillRepeatedly(Return(uids));
923
924 return uidMap;
925 }
926
CreateScreenStateChangedEvent(uint64_t timestampNs,const android::view::DisplayStateEnum state,int loggerUid)927 std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(uint64_t timestampNs,
928 const android::view::DisplayStateEnum state,
929 int loggerUid) {
930 AStatsEvent* statsEvent = AStatsEvent_obtain();
931 AStatsEvent_setAtomId(statsEvent, util::SCREEN_STATE_CHANGED);
932 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
933 AStatsEvent_writeInt32(statsEvent, state);
934 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_EXCLUSIVE_STATE, true);
935 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_STATE_NESTED, false);
936
937 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(loggerUid, /*pid=*/0);
938 parseStatsEventToLogEvent(statsEvent, logEvent.get());
939 return logEvent;
940 }
941
CreateBatterySaverOnEvent(uint64_t timestampNs)942 std::unique_ptr<LogEvent> CreateBatterySaverOnEvent(uint64_t timestampNs) {
943 AStatsEvent* statsEvent = AStatsEvent_obtain();
944 AStatsEvent_setAtomId(statsEvent, util::BATTERY_SAVER_MODE_STATE_CHANGED);
945 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
946 AStatsEvent_writeInt32(statsEvent, BatterySaverModeStateChanged::ON);
947 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_EXCLUSIVE_STATE, true);
948 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_STATE_NESTED, false);
949
950 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
951 parseStatsEventToLogEvent(statsEvent, logEvent.get());
952 return logEvent;
953 }
954
CreateBatterySaverOffEvent(uint64_t timestampNs)955 std::unique_ptr<LogEvent> CreateBatterySaverOffEvent(uint64_t timestampNs) {
956 AStatsEvent* statsEvent = AStatsEvent_obtain();
957 AStatsEvent_setAtomId(statsEvent, util::BATTERY_SAVER_MODE_STATE_CHANGED);
958 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
959 AStatsEvent_writeInt32(statsEvent, BatterySaverModeStateChanged::OFF);
960 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_EXCLUSIVE_STATE, true);
961 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_STATE_NESTED, false);
962
963 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
964 parseStatsEventToLogEvent(statsEvent, logEvent.get());
965 return logEvent;
966 }
967
CreateBatteryStateChangedEvent(const uint64_t timestampNs,const BatteryPluggedStateEnum state)968 std::unique_ptr<LogEvent> CreateBatteryStateChangedEvent(const uint64_t timestampNs, const BatteryPluggedStateEnum state) {
969 AStatsEvent* statsEvent = AStatsEvent_obtain();
970 AStatsEvent_setAtomId(statsEvent, util::PLUGGED_STATE_CHANGED);
971 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
972 AStatsEvent_writeInt32(statsEvent, state);
973
974 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
975 parseStatsEventToLogEvent(statsEvent, logEvent.get());
976 return logEvent;
977 }
978
CreateScreenBrightnessChangedEvent(uint64_t timestampNs,int level)979 std::unique_ptr<LogEvent> CreateScreenBrightnessChangedEvent(uint64_t timestampNs, int level) {
980 AStatsEvent* statsEvent = AStatsEvent_obtain();
981 AStatsEvent_setAtomId(statsEvent, util::SCREEN_BRIGHTNESS_CHANGED);
982 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
983 AStatsEvent_writeInt32(statsEvent, level);
984
985 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
986 parseStatsEventToLogEvent(statsEvent, logEvent.get());
987 return logEvent;
988 }
989
CreateScheduledJobStateChangedEvent(const vector<int> & attributionUids,const vector<string> & attributionTags,const string & jobName,const ScheduledJobStateChanged::State state,uint64_t timestampNs)990 std::unique_ptr<LogEvent> CreateScheduledJobStateChangedEvent(
991 const vector<int>& attributionUids, const vector<string>& attributionTags,
992 const string& jobName, const ScheduledJobStateChanged::State state, uint64_t timestampNs) {
993 AStatsEvent* statsEvent = AStatsEvent_obtain();
994 AStatsEvent_setAtomId(statsEvent, util::SCHEDULED_JOB_STATE_CHANGED);
995 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
996
997 writeAttribution(statsEvent, attributionUids, attributionTags);
998 AStatsEvent_writeString(statsEvent, jobName.c_str());
999 AStatsEvent_writeInt32(statsEvent, state);
1000
1001 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1002 parseStatsEventToLogEvent(statsEvent, logEvent.get());
1003 return logEvent;
1004 }
1005
CreateStartScheduledJobEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & jobName)1006 std::unique_ptr<LogEvent> CreateStartScheduledJobEvent(uint64_t timestampNs,
1007 const vector<int>& attributionUids,
1008 const vector<string>& attributionTags,
1009 const string& jobName) {
1010 return CreateScheduledJobStateChangedEvent(attributionUids, attributionTags, jobName,
1011 ScheduledJobStateChanged::STARTED, timestampNs);
1012 }
1013
1014 // Create log event when scheduled job finishes.
CreateFinishScheduledJobEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & jobName)1015 std::unique_ptr<LogEvent> CreateFinishScheduledJobEvent(uint64_t timestampNs,
1016 const vector<int>& attributionUids,
1017 const vector<string>& attributionTags,
1018 const string& jobName) {
1019 return CreateScheduledJobStateChangedEvent(attributionUids, attributionTags, jobName,
1020 ScheduledJobStateChanged::FINISHED, timestampNs);
1021 }
1022
CreateTestAtomReportedEventVariableRepeatedFields(uint64_t timestampNs,const vector<int> & repeatedIntField,const vector<int64_t> & repeatedLongField,const vector<float> & repeatedFloatField,const vector<string> & repeatedStringField,const bool * repeatedBoolField,const size_t repeatedBoolFieldLength,const vector<int> & repeatedEnumField)1023 std::unique_ptr<LogEvent> CreateTestAtomReportedEventVariableRepeatedFields(
1024 uint64_t timestampNs, const vector<int>& repeatedIntField,
1025 const vector<int64_t>& repeatedLongField, const vector<float>& repeatedFloatField,
1026 const vector<string>& repeatedStringField, const bool* repeatedBoolField,
1027 const size_t repeatedBoolFieldLength, const vector<int>& repeatedEnumField) {
1028 return CreateTestAtomReportedEvent(timestampNs, {1001, 1002}, {"app1", "app2"}, 5, 1000l, 21.9f,
1029 "string", 1, TestAtomReported::ON, {8, 1, 8, 2, 8, 3},
1030 repeatedIntField, repeatedLongField, repeatedFloatField,
1031 repeatedStringField, repeatedBoolField,
1032 repeatedBoolFieldLength, repeatedEnumField);
1033 }
1034
CreateTestAtomReportedEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const int intField,const long longField,const float floatField,const string & stringField,const bool boolField,const TestAtomReported::State enumField,const vector<uint8_t> & bytesField,const vector<int> & repeatedIntField,const vector<int64_t> & repeatedLongField,const vector<float> & repeatedFloatField,const vector<string> & repeatedStringField,const bool * repeatedBoolField,const size_t repeatedBoolFieldLength,const vector<int> & repeatedEnumField)1035 std::unique_ptr<LogEvent> CreateTestAtomReportedEvent(
1036 uint64_t timestampNs, const vector<int>& attributionUids,
1037 const vector<string>& attributionTags, const int intField, const long longField,
1038 const float floatField, const string& stringField, const bool boolField,
1039 const TestAtomReported::State enumField, const vector<uint8_t>& bytesField,
1040 const vector<int>& repeatedIntField, const vector<int64_t>& repeatedLongField,
1041 const vector<float>& repeatedFloatField, const vector<string>& repeatedStringField,
1042 const bool* repeatedBoolField, const size_t repeatedBoolFieldLength,
1043 const vector<int>& repeatedEnumField) {
1044 vector<const char*> cRepeatedStringField(repeatedStringField.size());
1045 for (int i = 0; i < cRepeatedStringField.size(); i++) {
1046 cRepeatedStringField[i] = repeatedStringField[i].c_str();
1047 }
1048
1049 AStatsEvent* statsEvent = AStatsEvent_obtain();
1050 AStatsEvent_setAtomId(statsEvent, util::TEST_ATOM_REPORTED);
1051 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1052
1053 writeAttribution(statsEvent, attributionUids, attributionTags);
1054 AStatsEvent_writeInt32(statsEvent, intField);
1055 AStatsEvent_writeInt64(statsEvent, longField);
1056 AStatsEvent_writeFloat(statsEvent, floatField);
1057 AStatsEvent_writeString(statsEvent, stringField.c_str());
1058 AStatsEvent_writeBool(statsEvent, boolField);
1059 AStatsEvent_writeInt32(statsEvent, enumField);
1060 AStatsEvent_writeByteArray(statsEvent, bytesField.data(), bytesField.size());
1061 AStatsEvent_writeInt32Array(statsEvent, repeatedIntField.data(), repeatedIntField.size());
1062 AStatsEvent_writeInt64Array(statsEvent, repeatedLongField.data(), repeatedLongField.size());
1063 AStatsEvent_writeFloatArray(statsEvent, repeatedFloatField.data(), repeatedFloatField.size());
1064 AStatsEvent_writeStringArray(statsEvent, cRepeatedStringField.data(),
1065 repeatedStringField.size());
1066 AStatsEvent_writeBoolArray(statsEvent, repeatedBoolField, repeatedBoolFieldLength);
1067 AStatsEvent_writeInt32Array(statsEvent, repeatedEnumField.data(), repeatedEnumField.size());
1068
1069 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1070 parseStatsEventToLogEvent(statsEvent, logEvent.get());
1071 return logEvent;
1072 }
1073
CreateWakelockStateChangedEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & wakelockName,const WakelockStateChanged::State state)1074 std::unique_ptr<LogEvent> CreateWakelockStateChangedEvent(uint64_t timestampNs,
1075 const vector<int>& attributionUids,
1076 const vector<string>& attributionTags,
1077 const string& wakelockName,
1078 const WakelockStateChanged::State state) {
1079 AStatsEvent* statsEvent = AStatsEvent_obtain();
1080 AStatsEvent_setAtomId(statsEvent, util::WAKELOCK_STATE_CHANGED);
1081 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1082
1083 writeAttribution(statsEvent, attributionUids, attributionTags);
1084 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, true);
1085 AStatsEvent_writeInt32(statsEvent, android::os::WakeLockLevelEnum::PARTIAL_WAKE_LOCK);
1086 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1087 AStatsEvent_writeString(statsEvent, wakelockName.c_str());
1088 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1089 AStatsEvent_writeInt32(statsEvent, state);
1090 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_EXCLUSIVE_STATE, true);
1091 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_STATE_NESTED, true);
1092
1093 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1094 parseStatsEventToLogEvent(statsEvent, logEvent.get());
1095 return logEvent;
1096 }
1097
CreateAcquireWakelockEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & wakelockName)1098 std::unique_ptr<LogEvent> CreateAcquireWakelockEvent(uint64_t timestampNs,
1099 const vector<int>& attributionUids,
1100 const vector<string>& attributionTags,
1101 const string& wakelockName) {
1102 return CreateWakelockStateChangedEvent(timestampNs, attributionUids, attributionTags,
1103 wakelockName, WakelockStateChanged::ACQUIRE);
1104 }
1105
CreateReleaseWakelockEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & wakelockName)1106 std::unique_ptr<LogEvent> CreateReleaseWakelockEvent(uint64_t timestampNs,
1107 const vector<int>& attributionUids,
1108 const vector<string>& attributionTags,
1109 const string& wakelockName) {
1110 return CreateWakelockStateChangedEvent(timestampNs, attributionUids, attributionTags,
1111 wakelockName, WakelockStateChanged::RELEASE);
1112 }
1113
CreateActivityForegroundStateChangedEvent(uint64_t timestampNs,const int uid,const ActivityForegroundStateChanged::State state)1114 std::unique_ptr<LogEvent> CreateActivityForegroundStateChangedEvent(
1115 uint64_t timestampNs, const int uid, const ActivityForegroundStateChanged::State state) {
1116 AStatsEvent* statsEvent = AStatsEvent_obtain();
1117 AStatsEvent_setAtomId(statsEvent, util::ACTIVITY_FOREGROUND_STATE_CHANGED);
1118 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1119
1120 AStatsEvent_writeInt32(statsEvent, uid);
1121 AStatsEvent_writeString(statsEvent, "pkg_name");
1122 AStatsEvent_writeString(statsEvent, "class_name");
1123 AStatsEvent_writeInt32(statsEvent, state);
1124
1125 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1126 parseStatsEventToLogEvent(statsEvent, logEvent.get());
1127 return logEvent;
1128 }
1129
CreateMoveToBackgroundEvent(uint64_t timestampNs,const int uid)1130 std::unique_ptr<LogEvent> CreateMoveToBackgroundEvent(uint64_t timestampNs, const int uid) {
1131 return CreateActivityForegroundStateChangedEvent(timestampNs, uid,
1132 ActivityForegroundStateChanged::BACKGROUND);
1133 }
1134
CreateMoveToForegroundEvent(uint64_t timestampNs,const int uid)1135 std::unique_ptr<LogEvent> CreateMoveToForegroundEvent(uint64_t timestampNs, const int uid) {
1136 return CreateActivityForegroundStateChangedEvent(timestampNs, uid,
1137 ActivityForegroundStateChanged::FOREGROUND);
1138 }
1139
CreateSyncStateChangedEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & name,const SyncStateChanged::State state)1140 std::unique_ptr<LogEvent> CreateSyncStateChangedEvent(uint64_t timestampNs,
1141 const vector<int>& attributionUids,
1142 const vector<string>& attributionTags,
1143 const string& name,
1144 const SyncStateChanged::State state) {
1145 AStatsEvent* statsEvent = AStatsEvent_obtain();
1146 AStatsEvent_setAtomId(statsEvent, util::SYNC_STATE_CHANGED);
1147 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1148
1149 writeAttribution(statsEvent, attributionUids, attributionTags);
1150 AStatsEvent_writeString(statsEvent, name.c_str());
1151 AStatsEvent_writeInt32(statsEvent, state);
1152
1153 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1154 parseStatsEventToLogEvent(statsEvent, logEvent.get());
1155 return logEvent;
1156 }
1157
CreateSyncStartEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & name)1158 std::unique_ptr<LogEvent> CreateSyncStartEvent(uint64_t timestampNs,
1159 const vector<int>& attributionUids,
1160 const vector<string>& attributionTags,
1161 const string& name) {
1162 return CreateSyncStateChangedEvent(timestampNs, attributionUids, attributionTags, name,
1163 SyncStateChanged::ON);
1164 }
1165
CreateSyncEndEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & name)1166 std::unique_ptr<LogEvent> CreateSyncEndEvent(uint64_t timestampNs,
1167 const vector<int>& attributionUids,
1168 const vector<string>& attributionTags,
1169 const string& name) {
1170 return CreateSyncStateChangedEvent(timestampNs, attributionUids, attributionTags, name,
1171 SyncStateChanged::OFF);
1172 }
1173
CreateProcessLifeCycleStateChangedEvent(uint64_t timestampNs,const int uid,const ProcessLifeCycleStateChanged::State state)1174 std::unique_ptr<LogEvent> CreateProcessLifeCycleStateChangedEvent(
1175 uint64_t timestampNs, const int uid, const ProcessLifeCycleStateChanged::State state) {
1176 AStatsEvent* statsEvent = AStatsEvent_obtain();
1177 AStatsEvent_setAtomId(statsEvent, util::PROCESS_LIFE_CYCLE_STATE_CHANGED);
1178 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1179
1180 AStatsEvent_writeInt32(statsEvent, uid);
1181 AStatsEvent_writeString(statsEvent, "");
1182 AStatsEvent_writeInt32(statsEvent, state);
1183
1184 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1185 parseStatsEventToLogEvent(statsEvent, logEvent.get());
1186 return logEvent;
1187 }
1188
CreateAppCrashEvent(uint64_t timestampNs,const int uid)1189 std::unique_ptr<LogEvent> CreateAppCrashEvent(uint64_t timestampNs, const int uid) {
1190 return CreateProcessLifeCycleStateChangedEvent(timestampNs, uid,
1191 ProcessLifeCycleStateChanged::CRASHED);
1192 }
1193
CreateAppCrashOccurredEvent(uint64_t timestampNs,const int uid)1194 std::unique_ptr<LogEvent> CreateAppCrashOccurredEvent(uint64_t timestampNs, const int uid) {
1195 AStatsEvent* statsEvent = AStatsEvent_obtain();
1196 AStatsEvent_setAtomId(statsEvent, util::APP_CRASH_OCCURRED);
1197 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1198
1199 AStatsEvent_writeInt32(statsEvent, uid);
1200 AStatsEvent_writeString(statsEvent, "eventType");
1201 AStatsEvent_writeString(statsEvent, "processName");
1202
1203 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1204 parseStatsEventToLogEvent(statsEvent, logEvent.get());
1205 return logEvent;
1206 }
1207
CreateIsolatedUidChangedEvent(uint64_t timestampNs,int hostUid,int isolatedUid,bool is_create)1208 std::unique_ptr<LogEvent> CreateIsolatedUidChangedEvent(uint64_t timestampNs, int hostUid,
1209 int isolatedUid, bool is_create) {
1210 AStatsEvent* statsEvent = AStatsEvent_obtain();
1211 AStatsEvent_setAtomId(statsEvent, util::ISOLATED_UID_CHANGED);
1212 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1213
1214 AStatsEvent_writeInt32(statsEvent, hostUid);
1215 AStatsEvent_writeInt32(statsEvent, isolatedUid);
1216 AStatsEvent_writeInt32(statsEvent, is_create);
1217
1218 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1219 parseStatsEventToLogEvent(statsEvent, logEvent.get());
1220 return logEvent;
1221 }
1222
CreateUidProcessStateChangedEvent(uint64_t timestampNs,int uid,const android::app::ProcessStateEnum state)1223 std::unique_ptr<LogEvent> CreateUidProcessStateChangedEvent(
1224 uint64_t timestampNs, int uid, const android::app::ProcessStateEnum state) {
1225 AStatsEvent* statsEvent = AStatsEvent_obtain();
1226 AStatsEvent_setAtomId(statsEvent, util::UID_PROCESS_STATE_CHANGED);
1227 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1228
1229 AStatsEvent_writeInt32(statsEvent, uid);
1230 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
1231 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1232 AStatsEvent_writeInt32(statsEvent, state);
1233 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_EXCLUSIVE_STATE, true);
1234 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_STATE_NESTED, false);
1235
1236 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1237 parseStatsEventToLogEvent(statsEvent, logEvent.get());
1238 return logEvent;
1239 }
1240
CreateBleScanStateChangedEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const BleScanStateChanged::State state,const bool filtered,const bool firstMatch,const bool opportunistic)1241 std::unique_ptr<LogEvent> CreateBleScanStateChangedEvent(uint64_t timestampNs,
1242 const vector<int>& attributionUids,
1243 const vector<string>& attributionTags,
1244 const BleScanStateChanged::State state,
1245 const bool filtered, const bool firstMatch,
1246 const bool opportunistic) {
1247 AStatsEvent* statsEvent = AStatsEvent_obtain();
1248 AStatsEvent_setAtomId(statsEvent, util::BLE_SCAN_STATE_CHANGED);
1249 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1250
1251 writeAttribution(statsEvent, attributionUids, attributionTags);
1252 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, true);
1253 AStatsEvent_writeInt32(statsEvent, state);
1254 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_EXCLUSIVE_STATE, true);
1255 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_STATE_NESTED, true);
1256 if (state == util::BLE_SCAN_STATE_CHANGED__STATE__RESET) {
1257 AStatsEvent_addInt32Annotation(statsEvent, ANNOTATION_ID_TRIGGER_STATE_RESET,
1258 util::BLE_SCAN_STATE_CHANGED__STATE__OFF);
1259 }
1260 AStatsEvent_writeBool(statsEvent, filtered); // filtered
1261 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1262 AStatsEvent_writeBool(statsEvent, firstMatch); // first match
1263 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1264 AStatsEvent_writeBool(statsEvent, opportunistic); // opportunistic
1265 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1266
1267 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1268 parseStatsEventToLogEvent(statsEvent, logEvent.get());
1269 return logEvent;
1270 }
1271
CreateOverlayStateChangedEvent(int64_t timestampNs,const int32_t uid,const string & packageName,const bool usingAlertWindow,const OverlayStateChanged::State state)1272 std::unique_ptr<LogEvent> CreateOverlayStateChangedEvent(int64_t timestampNs, const int32_t uid,
1273 const string& packageName,
1274 const bool usingAlertWindow,
1275 const OverlayStateChanged::State state) {
1276 AStatsEvent* statsEvent = AStatsEvent_obtain();
1277 AStatsEvent_setAtomId(statsEvent, util::OVERLAY_STATE_CHANGED);
1278 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1279
1280 AStatsEvent_writeInt32(statsEvent, uid);
1281 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
1282 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1283 AStatsEvent_writeString(statsEvent, packageName.c_str());
1284 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1285 AStatsEvent_writeBool(statsEvent, usingAlertWindow);
1286 AStatsEvent_writeInt32(statsEvent, state);
1287 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_EXCLUSIVE_STATE, true);
1288 AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_STATE_NESTED, false);
1289
1290 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1291 parseStatsEventToLogEvent(statsEvent, logEvent.get());
1292 return logEvent;
1293 }
1294
CreateAppStartOccurredEvent(uint64_t timestampNs,const int uid,const string & pkgName,AppStartOccurred::TransitionType type,const string & activityName,const string & callingPkgName,const bool isInstantApp,int64_t activityStartMs)1295 std::unique_ptr<LogEvent> CreateAppStartOccurredEvent(
1296 uint64_t timestampNs, const int uid, const string& pkgName,
1297 AppStartOccurred::TransitionType type, const string& activityName,
1298 const string& callingPkgName, const bool isInstantApp, int64_t activityStartMs) {
1299 AStatsEvent* statsEvent = AStatsEvent_obtain();
1300 AStatsEvent_setAtomId(statsEvent, util::APP_START_OCCURRED);
1301 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1302
1303 AStatsEvent_writeInt32(statsEvent, uid);
1304 AStatsEvent_writeString(statsEvent, pkgName.c_str());
1305 AStatsEvent_writeInt32(statsEvent, type);
1306 AStatsEvent_writeString(statsEvent, activityName.c_str());
1307 AStatsEvent_writeString(statsEvent, callingPkgName.c_str());
1308 AStatsEvent_writeInt32(statsEvent, isInstantApp);
1309 AStatsEvent_writeInt32(statsEvent, activityStartMs);
1310
1311 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1312 parseStatsEventToLogEvent(statsEvent, logEvent.get());
1313 return logEvent;
1314 }
1315
CreateStatsLogProcessor(const int64_t timeBaseNs,const int64_t currentTimeNs,const StatsdConfig & config,const ConfigKey & key,const shared_ptr<IPullAtomCallback> & puller,const int32_t atomTag,const sp<UidMap> uidMap)1316 sp<StatsLogProcessor> CreateStatsLogProcessor(const int64_t timeBaseNs, const int64_t currentTimeNs,
1317 const StatsdConfig& config, const ConfigKey& key,
1318 const shared_ptr<IPullAtomCallback>& puller,
1319 const int32_t atomTag, const sp<UidMap> uidMap) {
1320 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
1321 if (puller != nullptr) {
1322 pullerManager->RegisterPullAtomCallback(/*uid=*/0, atomTag, NS_PER_SEC, NS_PER_SEC * 10, {},
1323 puller);
1324 }
1325 sp<AlarmMonitor> anomalyAlarmMonitor =
1326 new AlarmMonitor(1,
1327 [](const shared_ptr<IStatsCompanionService>&, int64_t){},
1328 [](const shared_ptr<IStatsCompanionService>&){});
1329 sp<AlarmMonitor> periodicAlarmMonitor =
1330 new AlarmMonitor(1,
1331 [](const shared_ptr<IStatsCompanionService>&, int64_t){},
1332 [](const shared_ptr<IStatsCompanionService>&){});
1333 sp<StatsLogProcessor> processor =
1334 new StatsLogProcessor(uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor,
1335 timeBaseNs, [](const ConfigKey&) { return true; },
1336 [](const int&, const vector<int64_t>&) {return true;});
1337 processor->OnConfigUpdated(currentTimeNs, key, config);
1338 return processor;
1339 }
1340
sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> * events)1341 void sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> *events) {
1342 std::sort(events->begin(), events->end(),
1343 [](const std::unique_ptr<LogEvent>& a, const std::unique_ptr<LogEvent>& b) {
1344 return a->GetElapsedTimestampNs() < b->GetElapsedTimestampNs();
1345 });
1346 }
1347
StringToId(const string & str)1348 int64_t StringToId(const string& str) {
1349 return static_cast<int64_t>(std::hash<std::string>()(str));
1350 }
1351
createEventMatcherWizard(int tagId,int matcherIndex,const vector<FieldValueMatcher> & fieldValueMatchers)1352 sp<EventMatcherWizard> createEventMatcherWizard(
1353 int tagId, int matcherIndex, const vector<FieldValueMatcher>& fieldValueMatchers) {
1354 sp<UidMap> uidMap = new UidMap();
1355 SimpleAtomMatcher atomMatcher;
1356 atomMatcher.set_atom_id(tagId);
1357 for (const FieldValueMatcher& fvm : fieldValueMatchers) {
1358 *atomMatcher.add_field_value_matcher() = fvm;
1359 }
1360 uint64_t matcherHash = 0x12345678;
1361 int64_t matcherId = 678;
1362 return new EventMatcherWizard({new SimpleAtomMatchingTracker(
1363 matcherId, matcherIndex, matcherHash, atomMatcher, uidMap)});
1364 }
1365
CreateAttributionUidDimensionsValueParcel(const int atomId,const int uid)1366 StatsDimensionsValueParcel CreateAttributionUidDimensionsValueParcel(const int atomId,
1367 const int uid) {
1368 StatsDimensionsValueParcel root;
1369 root.field = atomId;
1370 root.valueType = STATS_DIMENSIONS_VALUE_TUPLE_TYPE;
1371 StatsDimensionsValueParcel attrNode;
1372 attrNode.field = 1;
1373 attrNode.valueType = STATS_DIMENSIONS_VALUE_TUPLE_TYPE;
1374 StatsDimensionsValueParcel posInAttrChain;
1375 posInAttrChain.field = 1;
1376 posInAttrChain.valueType = STATS_DIMENSIONS_VALUE_TUPLE_TYPE;
1377 StatsDimensionsValueParcel uidNode;
1378 uidNode.field = 1;
1379 uidNode.valueType = STATS_DIMENSIONS_VALUE_INT_TYPE;
1380 uidNode.intValue = uid;
1381 posInAttrChain.tupleValue.push_back(uidNode);
1382 attrNode.tupleValue.push_back(posInAttrChain);
1383 root.tupleValue.push_back(attrNode);
1384 return root;
1385 }
1386
ValidateUidDimension(const DimensionsValue & value,int atomId,int uid)1387 void ValidateUidDimension(const DimensionsValue& value, int atomId, int uid) {
1388 EXPECT_EQ(value.field(), atomId);
1389 ASSERT_EQ(value.value_tuple().dimensions_value_size(), 1);
1390 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
1391 EXPECT_EQ(value.value_tuple().dimensions_value(0).value_int(), uid);
1392 }
1393
ValidateWakelockAttributionUidAndTagDimension(const DimensionsValue & value,const int atomId,const int uid,const string & tag)1394 void ValidateWakelockAttributionUidAndTagDimension(const DimensionsValue& value, const int atomId,
1395 const int uid, const string& tag) {
1396 EXPECT_EQ(value.field(), atomId);
1397 ASSERT_EQ(value.value_tuple().dimensions_value_size(), 2);
1398 // Attribution field.
1399 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
1400 // Uid field.
1401 ASSERT_EQ(value.value_tuple().dimensions_value(0).value_tuple().dimensions_value_size(), 1);
1402 EXPECT_EQ(value.value_tuple().dimensions_value(0).value_tuple().dimensions_value(0).field(), 1);
1403 EXPECT_EQ(value.value_tuple().dimensions_value(0).value_tuple().dimensions_value(0).value_int(),
1404 uid);
1405 // Tag field.
1406 EXPECT_EQ(value.value_tuple().dimensions_value(1).field(), 3);
1407 EXPECT_EQ(value.value_tuple().dimensions_value(1).value_str(), tag);
1408 }
1409
ValidateAttributionUidDimension(const DimensionsValue & value,int atomId,int uid)1410 void ValidateAttributionUidDimension(const DimensionsValue& value, int atomId, int uid) {
1411 EXPECT_EQ(value.field(), atomId);
1412 ASSERT_EQ(value.value_tuple().dimensions_value_size(), 1);
1413 // Attribution field.
1414 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
1415 // Uid only.
1416 EXPECT_EQ(value.value_tuple().dimensions_value(0)
1417 .value_tuple().dimensions_value_size(), 1);
1418 EXPECT_EQ(value.value_tuple().dimensions_value(0)
1419 .value_tuple().dimensions_value(0).field(), 1);
1420 EXPECT_EQ(value.value_tuple().dimensions_value(0)
1421 .value_tuple().dimensions_value(0).value_int(), uid);
1422 }
1423
ValidateUidDimension(const DimensionsValue & value,int node_idx,int atomId,int uid)1424 void ValidateUidDimension(const DimensionsValue& value, int node_idx, int atomId, int uid) {
1425 EXPECT_EQ(value.field(), atomId);
1426 ASSERT_GT(value.value_tuple().dimensions_value_size(), node_idx);
1427 // Attribution field.
1428 EXPECT_EQ(value.value_tuple().dimensions_value(node_idx).field(), 1);
1429 EXPECT_EQ(value.value_tuple().dimensions_value(node_idx)
1430 .value_tuple().dimensions_value(0).field(), 1);
1431 EXPECT_EQ(value.value_tuple().dimensions_value(node_idx)
1432 .value_tuple().dimensions_value(0).value_int(), uid);
1433 }
1434
ValidateAttributionUidAndTagDimension(const DimensionsValue & value,int node_idx,int atomId,int uid,const std::string & tag)1435 void ValidateAttributionUidAndTagDimension(
1436 const DimensionsValue& value, int node_idx, int atomId, int uid, const std::string& tag) {
1437 EXPECT_EQ(value.field(), atomId);
1438 ASSERT_GT(value.value_tuple().dimensions_value_size(), node_idx);
1439 // Attribution field.
1440 EXPECT_EQ(1, value.value_tuple().dimensions_value(node_idx).field());
1441 // Uid only.
1442 EXPECT_EQ(2, value.value_tuple().dimensions_value(node_idx)
1443 .value_tuple().dimensions_value_size());
1444 EXPECT_EQ(1, value.value_tuple().dimensions_value(node_idx)
1445 .value_tuple().dimensions_value(0).field());
1446 EXPECT_EQ(uid, value.value_tuple().dimensions_value(node_idx)
1447 .value_tuple().dimensions_value(0).value_int());
1448 EXPECT_EQ(2, value.value_tuple().dimensions_value(node_idx)
1449 .value_tuple().dimensions_value(1).field());
1450 EXPECT_EQ(tag, value.value_tuple().dimensions_value(node_idx)
1451 .value_tuple().dimensions_value(1).value_str());
1452 }
1453
ValidateAttributionUidAndTagDimension(const DimensionsValue & value,int atomId,int uid,const std::string & tag)1454 void ValidateAttributionUidAndTagDimension(
1455 const DimensionsValue& value, int atomId, int uid, const std::string& tag) {
1456 EXPECT_EQ(value.field(), atomId);
1457 ASSERT_EQ(1, value.value_tuple().dimensions_value_size());
1458 // Attribution field.
1459 EXPECT_EQ(1, value.value_tuple().dimensions_value(0).field());
1460 // Uid only.
1461 EXPECT_EQ(value.value_tuple().dimensions_value(0)
1462 .value_tuple().dimensions_value_size(), 2);
1463 EXPECT_EQ(value.value_tuple().dimensions_value(0)
1464 .value_tuple().dimensions_value(0).field(), 1);
1465 EXPECT_EQ(value.value_tuple().dimensions_value(0)
1466 .value_tuple().dimensions_value(0).value_int(), uid);
1467 EXPECT_EQ(value.value_tuple().dimensions_value(0)
1468 .value_tuple().dimensions_value(1).field(), 2);
1469 EXPECT_EQ(value.value_tuple().dimensions_value(0)
1470 .value_tuple().dimensions_value(1).value_str(), tag);
1471 }
1472
ValidateStateValue(const google::protobuf::RepeatedPtrField<StateValue> & stateValues,int atomId,int64_t value)1473 void ValidateStateValue(const google::protobuf::RepeatedPtrField<StateValue>& stateValues,
1474 int atomId, int64_t value) {
1475 ASSERT_EQ(stateValues.size(), 1);
1476 ASSERT_EQ(stateValues[0].atom_id(), atomId);
1477 switch (stateValues[0].contents_case()) {
1478 case StateValue::ContentsCase::kValue:
1479 EXPECT_EQ(stateValues[0].value(), (int32_t)value);
1480 break;
1481 case StateValue::ContentsCase::kGroupId:
1482 EXPECT_EQ(stateValues[0].group_id(), value);
1483 break;
1484 default:
1485 FAIL() << "State value should have either a value or a group id";
1486 }
1487 }
1488
ValidateCountBucket(const CountBucketInfo & countBucket,int64_t startTimeNs,int64_t endTimeNs,int64_t count)1489 void ValidateCountBucket(const CountBucketInfo& countBucket, int64_t startTimeNs, int64_t endTimeNs,
1490 int64_t count) {
1491 EXPECT_EQ(countBucket.start_bucket_elapsed_nanos(), startTimeNs);
1492 EXPECT_EQ(countBucket.end_bucket_elapsed_nanos(), endTimeNs);
1493 EXPECT_EQ(countBucket.count(), count);
1494 }
1495
ValidateDurationBucket(const DurationBucketInfo & bucket,int64_t startTimeNs,int64_t endTimeNs,int64_t durationNs)1496 void ValidateDurationBucket(const DurationBucketInfo& bucket, int64_t startTimeNs,
1497 int64_t endTimeNs, int64_t durationNs) {
1498 EXPECT_EQ(bucket.start_bucket_elapsed_nanos(), startTimeNs);
1499 EXPECT_EQ(bucket.end_bucket_elapsed_nanos(), endTimeNs);
1500 EXPECT_EQ(bucket.duration_nanos(), durationNs);
1501 }
1502
ValidateGaugeBucketTimes(const GaugeBucketInfo & gaugeBucket,int64_t startTimeNs,int64_t endTimeNs,vector<int64_t> eventTimesNs)1503 void ValidateGaugeBucketTimes(const GaugeBucketInfo& gaugeBucket, int64_t startTimeNs,
1504 int64_t endTimeNs, vector<int64_t> eventTimesNs) {
1505 EXPECT_EQ(gaugeBucket.start_bucket_elapsed_nanos(), startTimeNs);
1506 EXPECT_EQ(gaugeBucket.end_bucket_elapsed_nanos(), endTimeNs);
1507 EXPECT_EQ(gaugeBucket.elapsed_timestamp_nanos_size(), eventTimesNs.size());
1508 for (int i = 0; i < eventTimesNs.size(); i++) {
1509 EXPECT_EQ(gaugeBucket.elapsed_timestamp_nanos(i), eventTimesNs[i]);
1510 }
1511 }
1512
ValidateValueBucket(const ValueBucketInfo & bucket,int64_t startTimeNs,int64_t endTimeNs,const vector<int64_t> & values,int64_t conditionTrueNs,int64_t conditionCorrectionNs)1513 void ValidateValueBucket(const ValueBucketInfo& bucket, int64_t startTimeNs, int64_t endTimeNs,
1514 const vector<int64_t>& values, int64_t conditionTrueNs,
1515 int64_t conditionCorrectionNs) {
1516 EXPECT_EQ(bucket.start_bucket_elapsed_nanos(), startTimeNs);
1517 EXPECT_EQ(bucket.end_bucket_elapsed_nanos(), endTimeNs);
1518 ASSERT_EQ(bucket.values_size(), values.size());
1519 for (int i = 0; i < values.size(); ++i) {
1520 if (bucket.values(i).has_value_double()) {
1521 EXPECT_EQ((int64_t)bucket.values(i).value_double(), values[i]);
1522 } else {
1523 EXPECT_EQ(bucket.values(i).value_long(), values[i]);
1524 }
1525 }
1526 if (conditionTrueNs > 0) {
1527 EXPECT_EQ(bucket.condition_true_nanos(), conditionTrueNs);
1528 if (conditionCorrectionNs > 0) {
1529 EXPECT_EQ(bucket.condition_correction_nanos(), conditionCorrectionNs);
1530 }
1531 }
1532 }
1533
ValidateKllBucket(const KllBucketInfo & bucket,int64_t startTimeNs,int64_t endTimeNs,const vector<int64_t> sketchSizes,int64_t conditionTrueNs)1534 void ValidateKllBucket(const KllBucketInfo& bucket, int64_t startTimeNs, int64_t endTimeNs,
1535 const vector<int64_t> sketchSizes, int64_t conditionTrueNs) {
1536 EXPECT_EQ(bucket.start_bucket_elapsed_nanos(), startTimeNs);
1537 EXPECT_EQ(bucket.end_bucket_elapsed_nanos(), endTimeNs);
1538 ASSERT_EQ(bucket.sketches_size(), sketchSizes.size());
1539 for (int i = 0; i < sketchSizes.size(); ++i) {
1540 AggregatorStateProto aggProto;
1541 EXPECT_TRUE(aggProto.ParseFromString(bucket.sketches(i).kll_sketch()));
1542 EXPECT_EQ(aggProto.num_values(), sketchSizes[i]);
1543 }
1544 if (conditionTrueNs > 0) {
1545 EXPECT_EQ(bucket.condition_true_nanos(), conditionTrueNs);
1546 }
1547 }
1548
EqualsTo(const DimensionsValue & s1,const DimensionsValue & s2)1549 bool EqualsTo(const DimensionsValue& s1, const DimensionsValue& s2) {
1550 if (s1.field() != s2.field()) {
1551 return false;
1552 }
1553 if (s1.value_case() != s2.value_case()) {
1554 return false;
1555 }
1556 switch (s1.value_case()) {
1557 case DimensionsValue::ValueCase::kValueStr:
1558 return (s1.value_str() == s2.value_str());
1559 case DimensionsValue::ValueCase::kValueInt:
1560 return s1.value_int() == s2.value_int();
1561 case DimensionsValue::ValueCase::kValueLong:
1562 return s1.value_long() == s2.value_long();
1563 case DimensionsValue::ValueCase::kValueBool:
1564 return s1.value_bool() == s2.value_bool();
1565 case DimensionsValue::ValueCase::kValueFloat:
1566 return s1.value_float() == s2.value_float();
1567 case DimensionsValue::ValueCase::kValueTuple: {
1568 if (s1.value_tuple().dimensions_value_size() !=
1569 s2.value_tuple().dimensions_value_size()) {
1570 return false;
1571 }
1572 bool allMatched = true;
1573 for (int i = 0; allMatched && i < s1.value_tuple().dimensions_value_size(); ++i) {
1574 allMatched &= EqualsTo(s1.value_tuple().dimensions_value(i),
1575 s2.value_tuple().dimensions_value(i));
1576 }
1577 return allMatched;
1578 }
1579 case DimensionsValue::ValueCase::VALUE_NOT_SET:
1580 default:
1581 return true;
1582 }
1583 }
1584
LessThan(const google::protobuf::RepeatedPtrField<StateValue> & s1,const google::protobuf::RepeatedPtrField<StateValue> & s2)1585 bool LessThan(const google::protobuf::RepeatedPtrField<StateValue>& s1,
1586 const google::protobuf::RepeatedPtrField<StateValue>& s2) {
1587 if (s1.size() != s2.size()) {
1588 return s1.size() < s2.size();
1589 }
1590 for (int i = 0; i < s1.size(); i++) {
1591 const StateValue& state1 = s1[i];
1592 const StateValue& state2 = s2[i];
1593 if (state1.atom_id() != state2.atom_id()) {
1594 return state1.atom_id() < state2.atom_id();
1595 }
1596 if (state1.value() != state2.value()) {
1597 return state1.value() < state2.value();
1598 }
1599 if (state1.group_id() != state2.group_id()) {
1600 return state1.group_id() < state2.group_id();
1601 }
1602 }
1603 return false;
1604 }
1605
LessThan(const DimensionsValue & s1,const DimensionsValue & s2)1606 bool LessThan(const DimensionsValue& s1, const DimensionsValue& s2) {
1607 if (s1.field() != s2.field()) {
1608 return s1.field() < s2.field();
1609 }
1610 if (s1.value_case() != s2.value_case()) {
1611 return s1.value_case() < s2.value_case();
1612 }
1613 switch (s1.value_case()) {
1614 case DimensionsValue::ValueCase::kValueStr:
1615 return s1.value_str() < s2.value_str();
1616 case DimensionsValue::ValueCase::kValueInt:
1617 return s1.value_int() < s2.value_int();
1618 case DimensionsValue::ValueCase::kValueLong:
1619 return s1.value_long() < s2.value_long();
1620 case DimensionsValue::ValueCase::kValueBool:
1621 return (int)s1.value_bool() < (int)s2.value_bool();
1622 case DimensionsValue::ValueCase::kValueFloat:
1623 return s1.value_float() < s2.value_float();
1624 case DimensionsValue::ValueCase::kValueTuple: {
1625 if (s1.value_tuple().dimensions_value_size() !=
1626 s2.value_tuple().dimensions_value_size()) {
1627 return s1.value_tuple().dimensions_value_size() <
1628 s2.value_tuple().dimensions_value_size();
1629 }
1630 for (int i = 0; i < s1.value_tuple().dimensions_value_size(); ++i) {
1631 if (EqualsTo(s1.value_tuple().dimensions_value(i),
1632 s2.value_tuple().dimensions_value(i))) {
1633 continue;
1634 } else {
1635 return LessThan(s1.value_tuple().dimensions_value(i),
1636 s2.value_tuple().dimensions_value(i));
1637 }
1638 }
1639 return false;
1640 }
1641 case DimensionsValue::ValueCase::VALUE_NOT_SET:
1642 default:
1643 return false;
1644 }
1645 }
1646
LessThan(const DimensionsPair & s1,const DimensionsPair & s2)1647 bool LessThan(const DimensionsPair& s1, const DimensionsPair& s2) {
1648 if (LessThan(s1.dimInWhat, s2.dimInWhat)) {
1649 return true;
1650 } else if (LessThan(s2.dimInWhat, s1.dimInWhat)) {
1651 return false;
1652 }
1653
1654 return LessThan(s1.stateValues, s2.stateValues);
1655 }
1656
backfillStringInDimension(const std::map<uint64_t,string> & str_map,DimensionsValue * dimension)1657 void backfillStringInDimension(const std::map<uint64_t, string>& str_map,
1658 DimensionsValue* dimension) {
1659 if (dimension->has_value_str_hash()) {
1660 auto it = str_map.find((uint64_t)(dimension->value_str_hash()));
1661 if (it != str_map.end()) {
1662 dimension->clear_value_str_hash();
1663 dimension->set_value_str(it->second);
1664 } else {
1665 ALOGE("Can not find the string hash: %llu",
1666 (unsigned long long)dimension->value_str_hash());
1667 }
1668 } else if (dimension->has_value_tuple()) {
1669 auto value_tuple = dimension->mutable_value_tuple();
1670 for (int i = 0; i < value_tuple->dimensions_value_size(); ++i) {
1671 backfillStringInDimension(str_map, value_tuple->mutable_dimensions_value(i));
1672 }
1673 }
1674 }
1675
backfillStringInReport(ConfigMetricsReport * config_report)1676 void backfillStringInReport(ConfigMetricsReport *config_report) {
1677 std::map<uint64_t, string> str_map;
1678 for (const auto& str : config_report->strings()) {
1679 uint64_t hash = Hash64(str);
1680 if (str_map.find(hash) != str_map.end()) {
1681 ALOGE("String hash conflicts: %s %s", str.c_str(), str_map[hash].c_str());
1682 }
1683 str_map[hash] = str;
1684 }
1685 for (int i = 0; i < config_report->metrics_size(); ++i) {
1686 auto metric_report = config_report->mutable_metrics(i);
1687 if (metric_report->has_count_metrics()) {
1688 backfillStringInDimension(str_map, metric_report->mutable_count_metrics());
1689 } else if (metric_report->has_duration_metrics()) {
1690 backfillStringInDimension(str_map, metric_report->mutable_duration_metrics());
1691 } else if (metric_report->has_gauge_metrics()) {
1692 backfillStringInDimension(str_map, metric_report->mutable_gauge_metrics());
1693 } else if (metric_report->has_value_metrics()) {
1694 backfillStringInDimension(str_map, metric_report->mutable_value_metrics());
1695 }
1696 }
1697 // Backfill the package names.
1698 for (int i = 0 ; i < config_report->uid_map().snapshots_size(); ++i) {
1699 auto snapshot = config_report->mutable_uid_map()->mutable_snapshots(i);
1700 for (int j = 0 ; j < snapshot->package_info_size(); ++j) {
1701 auto package_info = snapshot->mutable_package_info(j);
1702 if (package_info->has_name_hash()) {
1703 auto it = str_map.find((uint64_t)(package_info->name_hash()));
1704 if (it != str_map.end()) {
1705 package_info->clear_name_hash();
1706 package_info->set_name(it->second);
1707 } else {
1708 ALOGE("Can not find the string package name hash: %llu",
1709 (unsigned long long)package_info->name_hash());
1710 }
1711
1712 }
1713 }
1714 }
1715 // Backfill the app name in app changes.
1716 for (int i = 0 ; i < config_report->uid_map().changes_size(); ++i) {
1717 auto change = config_report->mutable_uid_map()->mutable_changes(i);
1718 if (change->has_app_hash()) {
1719 auto it = str_map.find((uint64_t)(change->app_hash()));
1720 if (it != str_map.end()) {
1721 change->clear_app_hash();
1722 change->set_app(it->second);
1723 } else {
1724 ALOGE("Can not find the string change app name hash: %llu",
1725 (unsigned long long)change->app_hash());
1726 }
1727 }
1728 }
1729 }
1730
backfillStringInReport(ConfigMetricsReportList * config_report_list)1731 void backfillStringInReport(ConfigMetricsReportList *config_report_list) {
1732 for (int i = 0; i < config_report_list->reports_size(); ++i) {
1733 backfillStringInReport(config_report_list->mutable_reports(i));
1734 }
1735 }
1736
backfillDimensionPath(const DimensionsValue & path,const google::protobuf::RepeatedPtrField<DimensionsValue> & leafValues,int * leafIndex,DimensionsValue * dimension)1737 bool backfillDimensionPath(const DimensionsValue& path,
1738 const google::protobuf::RepeatedPtrField<DimensionsValue>& leafValues,
1739 int* leafIndex, DimensionsValue* dimension) {
1740 dimension->set_field(path.field());
1741 if (path.has_value_tuple()) {
1742 for (int i = 0; i < path.value_tuple().dimensions_value_size(); ++i) {
1743 if (!backfillDimensionPath(path.value_tuple().dimensions_value(i), leafValues,
1744 leafIndex,
1745 dimension->mutable_value_tuple()->add_dimensions_value())) {
1746 return false;
1747 }
1748 }
1749 } else {
1750 if (*leafIndex < 0 || *leafIndex >= leafValues.size()) {
1751 return false;
1752 }
1753 dimension->MergeFrom(leafValues.Get(*leafIndex));
1754 (*leafIndex)++;
1755 }
1756 return true;
1757 }
1758
backfillDimensionPath(const DimensionsValue & path,const google::protobuf::RepeatedPtrField<DimensionsValue> & leafValues,DimensionsValue * dimension)1759 bool backfillDimensionPath(const DimensionsValue& path,
1760 const google::protobuf::RepeatedPtrField<DimensionsValue>& leafValues,
1761 DimensionsValue* dimension) {
1762 int leafIndex = 0;
1763 return backfillDimensionPath(path, leafValues, &leafIndex, dimension);
1764 }
1765
backfillDimensionPath(StatsLogReport * report)1766 void backfillDimensionPath(StatsLogReport* report) {
1767 if (report->has_dimensions_path_in_what() || report->has_dimensions_path_in_condition()) {
1768 auto whatPath = report->dimensions_path_in_what();
1769 auto conditionPath = report->dimensions_path_in_condition();
1770 if (report->has_count_metrics()) {
1771 backfillDimensionPath(whatPath, conditionPath, report->mutable_count_metrics());
1772 } else if (report->has_duration_metrics()) {
1773 backfillDimensionPath(whatPath, conditionPath, report->mutable_duration_metrics());
1774 } else if (report->has_gauge_metrics()) {
1775 backfillDimensionPath(whatPath, conditionPath, report->mutable_gauge_metrics());
1776 } else if (report->has_value_metrics()) {
1777 backfillDimensionPath(whatPath, conditionPath, report->mutable_value_metrics());
1778 }
1779 report->clear_dimensions_path_in_what();
1780 report->clear_dimensions_path_in_condition();
1781 }
1782 }
1783
backfillDimensionPath(ConfigMetricsReport * config_report)1784 void backfillDimensionPath(ConfigMetricsReport* config_report) {
1785 for (int i = 0; i < config_report->metrics_size(); ++i) {
1786 backfillDimensionPath(config_report->mutable_metrics(i));
1787 }
1788 }
1789
backfillDimensionPath(ConfigMetricsReportList * config_report_list)1790 void backfillDimensionPath(ConfigMetricsReportList* config_report_list) {
1791 for (int i = 0; i < config_report_list->reports_size(); ++i) {
1792 backfillDimensionPath(config_report_list->mutable_reports(i));
1793 }
1794 }
1795
backfillStartEndTimestamp(StatsLogReport * report)1796 void backfillStartEndTimestamp(StatsLogReport *report) {
1797 const int64_t timeBaseNs = report->time_base_elapsed_nano_seconds();
1798 const int64_t bucketSizeNs = report->bucket_size_nano_seconds();
1799 if (report->has_count_metrics()) {
1800 backfillStartEndTimestampForMetrics(
1801 timeBaseNs, bucketSizeNs, report->mutable_count_metrics());
1802 } else if (report->has_duration_metrics()) {
1803 backfillStartEndTimestampForMetrics(
1804 timeBaseNs, bucketSizeNs, report->mutable_duration_metrics());
1805 } else if (report->has_gauge_metrics()) {
1806 backfillStartEndTimestampForMetrics(
1807 timeBaseNs, bucketSizeNs, report->mutable_gauge_metrics());
1808 if (report->gauge_metrics().skipped_size() > 0) {
1809 backfillStartEndTimestampForSkippedBuckets(
1810 timeBaseNs, report->mutable_gauge_metrics());
1811 }
1812 } else if (report->has_value_metrics()) {
1813 backfillStartEndTimestampForMetrics(
1814 timeBaseNs, bucketSizeNs, report->mutable_value_metrics());
1815 if (report->value_metrics().skipped_size() > 0) {
1816 backfillStartEndTimestampForSkippedBuckets(
1817 timeBaseNs, report->mutable_value_metrics());
1818 }
1819 } else if (report->has_kll_metrics()) {
1820 backfillStartEndTimestampForMetrics(timeBaseNs, bucketSizeNs,
1821 report->mutable_kll_metrics());
1822 if (report->kll_metrics().skipped_size() > 0) {
1823 backfillStartEndTimestampForSkippedBuckets(timeBaseNs, report->mutable_kll_metrics());
1824 }
1825 }
1826 }
1827
backfillStartEndTimestamp(ConfigMetricsReport * config_report)1828 void backfillStartEndTimestamp(ConfigMetricsReport *config_report) {
1829 for (int j = 0; j < config_report->metrics_size(); ++j) {
1830 backfillStartEndTimestamp(config_report->mutable_metrics(j));
1831 }
1832 }
1833
backfillStartEndTimestamp(ConfigMetricsReportList * config_report_list)1834 void backfillStartEndTimestamp(ConfigMetricsReportList *config_report_list) {
1835 for (int i = 0; i < config_report_list->reports_size(); ++i) {
1836 backfillStartEndTimestamp(config_report_list->mutable_reports(i));
1837 }
1838 }
1839
backfillAggregatedAtoms(ConfigMetricsReportList * config_report_list)1840 void backfillAggregatedAtoms(ConfigMetricsReportList* config_report_list) {
1841 for (int i = 0; i < config_report_list->reports_size(); ++i) {
1842 backfillAggregatedAtoms(config_report_list->mutable_reports(i));
1843 }
1844 }
1845
backfillAggregatedAtoms(ConfigMetricsReport * config_report)1846 void backfillAggregatedAtoms(ConfigMetricsReport* config_report) {
1847 for (int i = 0; i < config_report->metrics_size(); ++i) {
1848 backfillAggregatedAtoms(config_report->mutable_metrics(i));
1849 }
1850 }
1851
backfillAggregatedAtoms(StatsLogReport * report)1852 void backfillAggregatedAtoms(StatsLogReport* report) {
1853 if (report->has_event_metrics()) {
1854 backfillAggregatedAtomsInEventMetric(report->mutable_event_metrics());
1855 }
1856 if (report->has_gauge_metrics()) {
1857 backfillAggregatedAtomsInGaugeMetric(report->mutable_gauge_metrics());
1858 }
1859 }
1860
backfillAggregatedAtomsInEventMetric(StatsLogReport::EventMetricDataWrapper * wrapper)1861 void backfillAggregatedAtomsInEventMetric(StatsLogReport::EventMetricDataWrapper* wrapper) {
1862 std::vector<EventMetricData> metricData;
1863 for (int i = 0; i < wrapper->data_size(); ++i) {
1864 AggregatedAtomInfo* atomInfo = wrapper->mutable_data(i)->mutable_aggregated_atom_info();
1865 for (int j = 0; j < atomInfo->elapsed_timestamp_nanos_size(); j++) {
1866 EventMetricData data;
1867 *(data.mutable_atom()) = atomInfo->atom();
1868 data.set_elapsed_timestamp_nanos(atomInfo->elapsed_timestamp_nanos(j));
1869 metricData.push_back(data);
1870 }
1871 }
1872
1873 if (metricData.size() == 0) {
1874 return;
1875 }
1876
1877 sort(metricData.begin(), metricData.end(),
1878 [](const EventMetricData& lhs, const EventMetricData& rhs) {
1879 return lhs.elapsed_timestamp_nanos() < rhs.elapsed_timestamp_nanos();
1880 });
1881
1882 wrapper->clear_data();
1883 for (int i = 0; i < metricData.size(); ++i) {
1884 *(wrapper->add_data()) = metricData[i];
1885 }
1886 }
1887
backfillAggregatedAtomsInGaugeMetric(StatsLogReport::GaugeMetricDataWrapper * wrapper)1888 void backfillAggregatedAtomsInGaugeMetric(StatsLogReport::GaugeMetricDataWrapper* wrapper) {
1889 for (int i = 0; i < wrapper->data_size(); ++i) {
1890 for (int j = 0; j < wrapper->data(i).bucket_info_size(); ++j) {
1891 GaugeBucketInfo* bucketInfo = wrapper->mutable_data(i)->mutable_bucket_info(j);
1892 vector<pair<Atom, int64_t>> atomData = unnestGaugeAtomData(*bucketInfo);
1893
1894 if (atomData.size() == 0) {
1895 return;
1896 }
1897
1898 bucketInfo->clear_aggregated_atom_info();
1899 ASSERT_EQ(bucketInfo->atom_size(), 0);
1900 ASSERT_EQ(bucketInfo->elapsed_timestamp_nanos_size(), 0);
1901
1902 for (int k = 0; k < atomData.size(); ++k) {
1903 *(bucketInfo->add_atom()) = atomData[k].first;
1904 bucketInfo->add_elapsed_timestamp_nanos(atomData[k].second);
1905 }
1906 }
1907 }
1908 }
1909
unnestGaugeAtomData(const GaugeBucketInfo & bucketInfo)1910 vector<pair<Atom, int64_t>> unnestGaugeAtomData(const GaugeBucketInfo& bucketInfo) {
1911 vector<pair<Atom, int64_t>> atomData;
1912 for (int k = 0; k < bucketInfo.aggregated_atom_info_size(); ++k) {
1913 const AggregatedAtomInfo& atomInfo = bucketInfo.aggregated_atom_info(k);
1914 for (int l = 0; l < atomInfo.elapsed_timestamp_nanos_size(); ++l) {
1915 atomData.push_back(make_pair(atomInfo.atom(), atomInfo.elapsed_timestamp_nanos(l)));
1916 }
1917 }
1918
1919 sort(atomData.begin(), atomData.end(),
1920 [](const pair<Atom, int64_t>& lhs, const pair<Atom, int64_t>& rhs) {
1921 return lhs.second < rhs.second;
1922 });
1923
1924 return atomData;
1925 }
1926
sortReportsByElapsedTime(ConfigMetricsReportList * configReportList)1927 void sortReportsByElapsedTime(ConfigMetricsReportList* configReportList) {
1928 RepeatedPtrField<ConfigMetricsReport>* reports = configReportList->mutable_reports();
1929 sort(reports->pointer_begin(), reports->pointer_end(),
1930 [](const ConfigMetricsReport* lhs, const ConfigMetricsReport* rhs) {
1931 return lhs->current_report_elapsed_nanos() < rhs->current_report_elapsed_nanos();
1932 });
1933 }
1934
onPullAtom(int atomTag,const shared_ptr<IPullAtomResultReceiver> & resultReceiver)1935 Status FakeSubsystemSleepCallback::onPullAtom(int atomTag,
1936 const shared_ptr<IPullAtomResultReceiver>& resultReceiver) {
1937 // Convert stats_events into StatsEventParcels.
1938 std::vector<StatsEventParcel> parcels;
1939 for (int i = 1; i < 3; i++) {
1940 AStatsEvent* event = AStatsEvent_obtain();
1941 AStatsEvent_setAtomId(event, atomTag);
1942 std::string subsystemName = "subsystem_name_";
1943 subsystemName = subsystemName + std::to_string(i);
1944 AStatsEvent_writeString(event, subsystemName.c_str());
1945 AStatsEvent_writeString(event, "subsystem_subname foo");
1946 AStatsEvent_writeInt64(event, /*count= */ i);
1947 AStatsEvent_writeInt64(event, /*time_millis= */ pullNum * pullNum * 100 + i);
1948 AStatsEvent_build(event);
1949 size_t size;
1950 uint8_t* buffer = AStatsEvent_getBuffer(event, &size);
1951
1952 StatsEventParcel p;
1953 // vector.assign() creates a copy, but this is inevitable unless
1954 // stats_event.h/c uses a vector as opposed to a buffer.
1955 p.buffer.assign(buffer, buffer + size);
1956 parcels.push_back(std::move(p));
1957 AStatsEvent_release(event);
1958 }
1959 pullNum++;
1960 resultReceiver->pullFinished(atomTag, /*success=*/true, parcels);
1961 return Status::ok();
1962 }
1963
writeFlag(const string & flagName,const string & flagValue)1964 void writeFlag(const string& flagName, const string& flagValue) {
1965 SetProperty(StringPrintf("persist.device_config.%s.%s", STATSD_NATIVE_NAMESPACE.c_str(),
1966 flagName.c_str()),
1967 flagValue);
1968 }
1969
writeBootFlag(const string & flagName,const string & flagValue)1970 void writeBootFlag(const string& flagName, const string& flagValue) {
1971 SetProperty(StringPrintf("persist.device_config.%s.%s", STATSD_NATIVE_BOOT_NAMESPACE.c_str(),
1972 flagName.c_str()),
1973 flagValue);
1974 }
1975 } // namespace statsd
1976 } // namespace os
1977 } // namespace android
1978