| /* |
| * Copyright (C) 2016 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 = "proto3"; |
| |
| package profiler.proto; |
| option java_package = "com.android.tools.profiler.proto"; |
| option java_outer_classname = "Common"; |
| |
| import "app_inspection.proto"; |
| import "cpu_data.proto"; |
| import "echo.proto"; |
| import "energy_data.proto"; |
| import "interaction_data.proto"; |
| import "memory_data.proto"; |
| import "network_data.proto"; |
| import "user_counter_data.proto"; |
| import "layout_inspector.proto"; |
| |
| |
| message Event { |
| enum Kind { |
| NONE = 0; |
| // group_id: stream id |
| STREAM = 1; |
| // group_id: process id |
| PROCESS = 2; |
| // No specified group_id. All agent events belonging to the same stream and |
| // process are inherently in one group. |
| AGENT = 3; |
| |
| // Profilers Prefix = 100 |
| // Session is a profiler only concept. |
| // group_id: session id |
| SESSION = 101; |
| |
| // Network Profiler Prefix = 200 |
| // group_id: |NETWORK_TX| or |NETWORK_RX| |
| NETWORK_SPEED = 201; |
| // No specified group_id |
| NETWORK_CONNECTION_COUNT = 202; |
| // group_id: connection id |
| NETWORK_HTTP_CONNECTION = 203; |
| // group_id: connection id |
| NETWORK_HTTP_THREAD = 204; |
| // No specified group_id |
| NETWORK_TYPE = 205; |
| |
| // Cpu Profiler Prefix = 300 |
| // group_id: process id |
| CPU_USAGE = 301; |
| // group_id: thread id |
| CPU_THREAD = 302; |
| // group_id: device id |
| CPU_CORE_CONFIG = 303; |
| // group_id:: trace id |
| CPU_TRACE = 304; |
| // group_id:: trace id (populated only if the trace record exists) |
| CPU_TRACE_STATUS = 305; |
| |
| // Memory Profiler Prefix = 400 |
| // no specified group id. |
| MEMORY_USAGE = 401; |
| // no specified group id. |
| MEMORY_GC = 402; |
| // group_id: hprof id (timestamp) |
| MEMORY_HEAP_DUMP = 403; |
| // group_id: hprof id |
| MEMORY_HEAP_DUMP_STATUS = 404; |
| // no specified gropu id. |
| MEMORY_ALLOC_SAMPLING = 405; |
| // group_id: track id (start timestamp) |
| MEMORY_ALLOC_TRACKING = 406; |
| // group_id: track id |
| MEMORY_ALLOC_TRACKING_STATUS = 407; |
| // no specified group id. |
| MEMORY_ALLOC_CONTEXTS = 408; |
| // no specified group id. |
| MEMORY_ALLOC_EVENTS = 409; |
| // no specified group id. |
| MEMORY_JNI_REF_EVENTS = 410; |
| // no specified group id. |
| MEMORY_ALLOC_STATS = 411; |
| // group_id: capture id (start timestamp) |
| MEMORY_NATIVE_SAMPLE_CAPTURE = 412; |
| // group_id: capture id (start timestamp) |
| MEMORY_NATIVE_SAMPLE_STATUS = 413; |
| |
| // Energy Profiler Prefix = 500 |
| // no specified group id. |
| ENERGY_USAGE = 501; |
| // group_id: event_id |
| ENERGY_EVENT = 502; |
| |
| // Event Profiler Prefix = 600 |
| INTERACTION = 601; |
| VIEW = 602; |
| |
| // Custom Event Visualization prefix = 700; |
| USER_COUNTERS = 701; |
| |
| // Demo echo event = 1000 |
| ECHO = 1000; |
| |
| // Layout inspector prefix = 1100 |
| LAYOUT_INSPECTOR_FOREGROUND_PROCESS = 1101; |
| LAYOUT_INSPECTOR_TRACKING_FOREGROUND_PROCESS_SUPPORTED = 1102; |
| |
| // App inspection prefix = 1200. |
| APP_INSPECTION_EVENT = 1201; |
| APP_INSPECTION_RESPONSE = 1202; |
| // group_id: unique ID representing that payload |
| APP_INSPECTION_PAYLOAD = 1203; |
| } |
| |
| // Fixed ID for pre-determined EventGroup. Event.Type is reserved for data |
| // types that contain multiple states. So we use these group Ids to categorize |
| // data that belong to the same Event.kind. |
| enum EventGroupIds { |
| INVALID = 0; |
| |
| // Network Profiler Prefix = 100 |
| NETWORK_TX = 101; // for NETWORK_SPEED sent data |
| NETWORK_RX = 102; // for NETWORK_SPEED received data |
| |
| // Cpu Profiler Prefix = 200 |
| |
| // Memory Profiler Prefix = 300 |
| |
| // Energy Profiler Prefix = 400 |
| |
| // Event Profiler Prefix = 500 |
| |
| // App inspection prefix = 1200 |
| } |
| |
| // The process the event belongs to. |
| int32 pid = 1; |
| |
| // The id of the group this event belongs to. This is not unique, for concepts |
| // that span across a range of time (network requests, threads, etc), they |
| // will all share the same |group_id|. |
| int64 group_id = 2; |
| |
| // The kind of event (a higher level grouping of events that belong to the |
| // same area) Useful for queries such as "all the groups of "kind" SESSION. |
| Event.Kind kind = 3; |
| |
| // Timestamp in device wall clock time (ns). |
| int64 timestamp = 4; |
| |
| // Indicate whether the event group has ended. Note that the |group_id| can |
| // be recycled afterwards within the same |Event.Kind|. |
| bool is_ended = 5; |
| |
| // Id of the command that triggered the event. |
| int32 command_id = 6; |
| |
| oneof union { |
| // General tranport event prefix = 10 |
| StreamData stream = 10; |
| ProcessData process = 11; |
| AgentData agent_data = 12; |
| |
| // Profiler Prefix = 100 |
| SessionData session = 101; |
| |
| // Network Profiler Prefix = 200 |
| // Populated when |kind| is |NETWORK_SPEED| |
| NetworkSpeedData network_speed = 201; |
| // Populated when |kind| is |NETWORK_CONNECTION_COUNT| |
| NetworkConnectionData network_connections = 202; |
| // Populated when |kind| is |NETWORK_HTTP_CONNECTION| |
| NetworkHttpConnectionData network_http_connection = 203; |
| // Populated when |kind| is |NETWORK_HTTP_THREAD| |
| NetworkHttpThreadData network_http_thread = 204; |
| // Populated when |kind| is |NETWORK_TYPE| |
| NetworkTypeData network_type = 205; |
| |
| // Cpu Profiler Prefix = 300 |
| CpuUsageData cpu_usage = 301; |
| CpuThreadData cpu_thread = 302; |
| CpuCoreConfigData cpu_core_config = 303; |
| CpuTraceData cpu_trace = 304; |
| CpuTraceStatusData cpu_trace_status = 305; |
| |
| // Memory Profiler Prefix = 400 |
| MemoryUsageData memory_usage = 401; |
| MemoryGcData memory_gc = 402; |
| MemoryHeapDumpData memory_heapdump = 403; |
| MemoryHeapDumpStatusData memory_heapdump_status = 404; |
| MemoryAllocSamplingData memory_alloc_sampling = 405; |
| MemoryAllocTrackingData memory_alloc_tracking = 406; |
| MemoryAllocTrackingStatusData memory_alloc_tracking_status = 407; |
| MemoryAllocContextsData memory_alloc_contexts = 408; |
| MemoryAllocEventsData memory_alloc_events = 409; |
| MemoryJniRefData memory_jni_ref_events = 410; |
| MemoryAllocStatsData memory_alloc_Stats = 411; |
| MemoryNativeTrackingData memory_native_tracking_status = 412; |
| MemoryNativeSampleData memory_native_sample = 413; |
| |
| // Energy Profiler Prefix = 500 |
| // Energy consumption calculated from CPU, network and location activities. |
| // Populated when |kind| is |ENERGY_USAGE|. |
| EnergyUsageData energy_usage = 501; |
| // Energy-impacting system event, e.g. wake locks. |
| // Populated when |kind| is |ENERGY_EVENT|. |
| EnergyEventData energy_event = 502; |
| |
| // Event Profiler Prefix = 600 |
| InteractionData interaction = 601; |
| ViewData view = 602; |
| |
| // Custom Event Visualization Prefix = 700; |
| UserCounterData user_counters = 701; |
| |
| // Echo Event Prefix = 1000 |
| echo.EchoData echo = 1000; |
| |
| // Layout inspector prefix = 1100 |
| layout_inspector.ForegroundProcess layout_inspector_foreground_process = 1101; |
| layout_inspector.TrackingForegroundProcessSupported layout_inspector_tracking_foreground_process_supported = 1102; |
| |
| // App inspection prefix = 1200; |
| app_inspection.AppInspectionEvent app_inspection_event = 1201; |
| app_inspection.AppInspectionResponse app_inspection_response = 1202; |
| app_inspection.AppInspectionPayload app_inspection_payload = 1203; |
| } |
| } |
| |
| // Note that |Device| instance refers to a device (physical/emulator) associated |
| // with a particular boot. e.g. if the same device is started twice, they are |
| // considered two separate |Device| instances. |
| message Device { |
| enum State { |
| UNSPECIFIED = 0; |
| ONLINE = 1; |
| OFFLINE = 2; // e.g. emulator that is turned off |
| DISCONNECTED = 3; // e.g. unplugged |
| } |
| |
| // Numeric representation of the device's |serial| and |boot_id| properties. |
| // Used for quickly indexing the device instead of having to perform string |
| // comparisons. |
| int64 device_id = 1; |
| string manufacturer = 2; // e.g. 'Google', 'Motorola' |
| string model = 3; // e.g. 'Nexus 5', 'Pixel XL' |
| string serial = 4; // unique ID for this device |
| string version = 5; // e.g. '5.1.1', '8.0.0' |
| int32 api_level = 6; // e.g. 19, 25 |
| // |feature_level| will either be the same as |api_level| or |api_level + 1| |
| // if the current device is a preview version. Code should check against |
| // |feature_level|, not |api_level|, to see if a feature is available in the |
| // framework or not. If |feature_level != api_level|, then |codename| will |
| // also be set. |
| int32 feature_level = 7; |
| string codename = 8; // Identifies preview versions by API letter (e.g. 'O'), |
| // or '' for release |
| string boot_id = 9; // unique ID regenerated each boot time |
| bool is_emulator = 10; |
| string build_tags = 11; // property of IDevice.PROP_BUILD_TAGS |
| string build_type = 12; // property of IDevice.PROP_BUILD_TYPE |
| string cpu_abi = 13; // property of IDevice.PROP_DEVICE_CPU_ABI |
| State state = 14; |
| |
| // Should only be set if the pipeline does not support the device. |
| // e.g. pre-Lollipop devices. |
| string unsupported_reason = 15; |
| } |
| |
| message Process { |
| enum State { |
| UNSPECIFIED = 0; |
| ALIVE = 1; |
| DEAD = 2; |
| } |
| // Less to more |
| enum ExposureLevel { |
| UNKNOWN = 0; |
| RELEASE = 1; |
| PROFILEABLE = 2; |
| DEBUGGABLE = 3; |
| } |
| // Full name of the Android application/service |
| string name = 1; |
| // App's PID. Note that this is actually an int16, but gRPC only provides |
| // int32. |
| int32 pid = 2; |
| // References Device's |device_id| property. |
| int64 device_id = 3; |
| State state = 4; |
| // The device time when this Process was first detected by the profiler. |
| int64 start_timestamp_ns = 5; |
| // e.g. 'arm', 'arm86', 'x86', 'x86_64' |
| // Also see SdkConstans.CPU_ARCH_* |
| string abi_cpu_arch = 6; |
| ExposureLevel exposure_level = 7; |
| } |
| |
| // A Session represents a range of profiling data for an app running on a |
| // device. While of course different apps or different devices will imply |
| // separate sessions, the same app on the same device can also be broken up |
| // into several sessions. |
| message Session { |
| // ID uniquely identifying this session. This will be unique across devices. |
| int64 session_id = 1; |
| // The stream from which the session is created. |
| int64 stream_id = 2; |
| // The PID of the app. Note that this is actually an int16, but gRPC only |
| // provides int32. |
| int32 pid = 3; |
| // Start timestamp in device wall clock time.(ns) |
| int64 start_timestamp = 4; |
| // End timestamp in device wall clock time. (ns) |
| // If LLONG_MAX, the session is ongoing and hasn't ended yet. |
| int64 end_timestamp = 5; |
| } |
| |
| // TODO to be deprecated once we have moved completely over to the new data |
| // pipeline. The |SessionStarted| message already encapsulates the same data. |
| message SessionMetaData { |
| enum SessionType { |
| UNSPECIFIED = 0; |
| FULL = 1; |
| MEMORY_CAPTURE = 2; |
| CPU_CAPTURE = 3; |
| } |
| // References Session's |session_id| field |
| int64 session_id = 1; |
| // Session start time (unix epoch) as provided by the BeginSessionRequest. |
| // For Studio-side display only. |
| int64 start_timestamp_epoch_ms = 2; |
| // Session name as provided by the BeginSessionRequest. |
| // For Studio-side display only. |
| string session_name = 3; |
| // Whether JVMTI is used for the session |
| bool jvmti_enabled = 4; |
| // Session's type which indicates what data it has. |
| SessionType type = 6; |
| // See SdkConstans.CPU_ARCH_* as provided by the BeginSessionRequest. |
| string process_abi = 7; |
| } |
| |
| message Stream { |
| // A list of supported stream types. |
| enum Type { |
| UNSPECIFIED_STREAM_TYPE = 0; |
| DEVICE = 1; |
| FILE = 2; |
| } |
| int64 stream_id = 1; |
| Type type = 2; |
| oneof union { Device device = 3; } |
| } |
| |
| message StreamData { |
| message StreamConnected { Stream stream = 1; } |
| |
| oneof union { |
| StreamConnected stream_connected = 1; |
| // Note - the disconnected event contains no payload. |
| } |
| } |
| |
| message ProcessData { |
| message ProcessStarted { Process process = 1; } |
| |
| oneof union { |
| ProcessStarted process_started = 1; |
| // Note - the ended event contains no payload. |
| } |
| } |
| |
| message SessionData { |
| message SessionStarted { |
| // The session type here maps directly to the SessionMetadata.SessionType. |
| // After the move to the new pipeline we can remove SessionMetadata. |
| enum SessionType { |
| UNSPECIFIED = 0; |
| FULL = 1; |
| MEMORY_CAPTURE = 2; |
| CPU_CAPTURE = 3; |
| } |
| |
| // References Session's |session_id| field |
| int64 session_id = 1; |
| // The stream from which the session is created. |
| int64 stream_id = 2; |
| // The PID of the app. Note that this is actually an int16, but gRPC only |
| // provides int32. |
| int32 pid = 3; |
| // Session start time (unix epoch) as provided by the BeginSessionRequest. |
| // For Studio-side display only. |
| int64 start_timestamp_epoch_ms = 4; |
| // Session name as provided by the BeginSessionRequest. |
| // For Studio-side display only. |
| string session_name = 5; |
| // Whether JVMTI is used for the session |
| bool jvmti_enabled = 6; |
| // Session's type which indicates what data it has. |
| SessionType type = 9; |
| // See SdkConstans.CPU_ARCH_* |
| string process_abi = 10; |
| } |
| |
| oneof union { |
| SessionStarted session_started = 1; |
| // Note - the ended event contains no payload. |
| } |
| } |
| |
| message AgentData { |
| enum Status { |
| // Used when we don't know if the app is attachable or not. |
| UNSPECIFIED = 0; |
| // Set when the agent has attached to the application at least once. |
| ATTACHED = 1; |
| // Set when the application is determined to be unattachable. |
| UNATTACHABLE = 2; |
| } |
| Status status = 1; |
| } |
| |
| // Shared by both DaemonConfig and AgentConfig |
| message CommonConfig { |
| enum SocketType { |
| UNSPECIFIED_SOCKET = 0; |
| ABSTRACT_SOCKET = 1; |
| } |
| |
| // Which socket type we are using when setting up our service |
| // if the device is O+ we use service_socket_name and |
| // ABSTRACT_SOCKET. If the device is pre O we use |
| // UNSPECIFIED_SOCKET and use the service_address. |
| SocketType socket_type = 1; |
| // address used for legacy devices (Nougat or older). |
| string service_address = 2; |
| // address used for jvmti devices that use unix sockets. |
| string service_socket_name = 3; |
| // equivalent to StudioFlags.PROFILER_ENERGY_PROFILER_ENABLED. |
| bool energy_profiler_enabled = 4; |
| // equivalent to StudioFlags.PROFILER_UNIFIED_PIPELINE |
| bool profiler_unified_pipeline = 5; |
| // equivalent to StudioFlags.PROFILER_CUSTOM_EVENT_VISUALIZATION |
| bool profiler_custom_event_visualization = 6; |
| } |