/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ syntax = "proto2"; import "frameworks/base/cmds/statsd/src/atoms.proto"; import "frameworks/base/cmds/statsd/src/atom_field_options.proto"; package android.stats_log_api_gen; message IntAtom { optional int32 field1 = 1; } message AnotherIntAtom { optional int32 field1 = 1; } message OutOfOrderAtom { optional int32 field2 = 2; optional int32 field1 = 1; } enum AnEnum { VALUE0 = 0; VALUE1 = 1; } message AllTypesAtom { repeated android.os.statsd.AttributionNode attribution_chain = 1; optional double double_field = 2; optional float float_field = 3; optional int64 int64_field = 4; optional uint64 uint64_field = 5; optional int32 int32_field = 6; optional fixed64 fixed64_field = 7; optional fixed32 fixed32_field = 8; optional bool bool_field = 9; optional string string_field = 10; optional uint32 uint32_field = 11; optional AnEnum enum_field = 12; optional sfixed32 sfixed32_field = 13; optional sfixed64 sfixed64_field = 14; optional sint32 sint32_field = 15; optional sint64 sint64_field = 16; } message Event { oneof event { OutOfOrderAtom out_of_order_atom = 2; IntAtom int_atom = 1; AnotherIntAtom another_int_atom = 3; AllTypesAtom all_types_atom = 4; } } message BadTypesAtom { optional IntAtom bad_int_atom = 1; optional bytes bad_bytes = 2; } message BadTypesEvent { oneof event { BadTypesAtom bad_types_atom = 1; } } message BadSkippedFieldSingleAtom { optional int32 field2 = 2; } message BadSkippedFieldSingle { oneof event { BadSkippedFieldSingleAtom bad = 1; } } message BadSkippedFieldMultipleAtom { optional int32 field1 = 1; optional int32 field3 = 3; optional int32 field5 = 5; } message BadSkippedFieldMultiple { oneof event { BadSkippedFieldMultipleAtom bad = 1; } } message BadAttributionNodePositionAtom { optional int32 field1 = 1; repeated android.os.statsd.AttributionNode attribution = 2; } message BadAttributionNodePosition { oneof event { BadAttributionNodePositionAtom bad = 1; } } message GoodEventWithBinaryFieldAtom { oneof event { GoodBinaryFieldAtom field1 = 1; } } message ComplexField { optional string str = 1; } message GoodBinaryFieldAtom { optional int32 field1 = 1; optional ComplexField bf = 2 [(android.os.statsd.log_mode) = MODE_BYTES]; } message BadEventWithBinaryFieldAtom { oneof event { BadBinaryFieldAtom field1 = 1; } } message BadBinaryFieldAtom { optional int32 field1 = 1; optional ComplexField bf = 2; } message BadStateAtoms { oneof event { BadStateAtom1 bad1 = 1; BadStateAtom2 bad2 = 2; BadStateAtom3 bad3 = 3; } } message GoodStateAtoms { oneof event { GoodStateAtom1 good1 = 1; GoodStateAtom2 good2 = 2; } } // The atom has only primary field but no exclusive state field. message BadStateAtom1 { optional int32 uid = 1 [(android.os.statsd.state_field_option).option = PRIMARY]; } // Only primative types can be annotated. message BadStateAtom2 { repeated android.os.statsd.AttributionNode attribution = 1 [(android.os.statsd.state_field_option).option = PRIMARY]; optional int32 state = 2 [(android.os.statsd.state_field_option).option = EXCLUSIVE]; } // Having 2 exclusive state field in the atom means the atom is badly designed. // E.g., putting bluetooth state and wifi state in the same atom. message BadStateAtom3 { optional int32 uid = 1 [(android.os.statsd.state_field_option).option = PRIMARY]; optional int32 state = 2 [(android.os.statsd.state_field_option).option = EXCLUSIVE]; optional int32 state2 = 3 [(android.os.statsd.state_field_option).option = EXCLUSIVE]; } message GoodStateAtom1 { optional int32 uid = 1 [(android.os.statsd.state_field_option).option = PRIMARY]; optional int32 state = 2 [(android.os.statsd.state_field_option).option = EXCLUSIVE]; } // Atoms can have exclusive state field, but no primary field. That means // the state is globally exclusive (e.g., DisplayState). message GoodStateAtom2 { optional int32 uid = 1; optional int32 state = 2 [(android.os.statsd.state_field_option).option = EXCLUSIVE]; } // We can have more than one primary fields. That means their combination is a // primary key. message GoodStateAtom3 { optional int32 uid = 1 [(android.os.statsd.state_field_option).option = PRIMARY]; optional int32 tid = 2 [(android.os.statsd.state_field_option).option = PRIMARY]; optional int32 state = 3 [(android.os.statsd.state_field_option).option = EXCLUSIVE]; } message WhitelistedAtom { optional int32 field = 1; } message NonWhitelistedAtom { optional int32 field = 1; } message ListedAtoms { oneof event { // Atoms can be whitelisted i.e. they can be triggered by any source WhitelistedAtom whitelisted_atom = 1 [(android.os.statsd.allow_from_any_uid) = true]; // Atoms are not whitelisted by default, so they can only be triggered // by whitelisted sources NonWhitelistedAtom non_whitelisted_atom = 2; } } message ModuleOneAtom { optional int32 field = 1; } message ModuleTwoAtom { optional int32 field = 1; } message NoModuleAtom { optional string field = 1; } message ModuleAtoms { oneof event { ModuleOneAtom module_one_atom = 1 [(android.os.statsd.log_from_module) = "module1"]; ModuleTwoAtom module_two_atom = 2 [(android.os.statsd.log_from_module) = "module2"]; NoModuleAtom no_module_atom = 3; } }