// THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY.
// Generated by //wireless/android/play/playlog/tools:strip_proto_file
// from logs/proto/wireless/android/sdk/stats/studio_stats.proto
// Regenerate by running
//   blaze build //logs/proto/wireless/android/sdk/stats:studio_stats_stripped

// NOTE: Do not use oneof in this proto as we need to compile it with the
//  open source 2.5 version of the protobuf compiler for Android Studio which
//  does not support the oneof feature.
syntax = "proto2";

package android_studio;

option java_package = "com.google.wireless.android.sdk.stats";
option java_outer_classname = "AndroidStudioStats";

message AndroidStudioEvent {
  // Describes a group of event kinds related to each other.
  enum EventCategory {
    // The event was not grouped into any specific category (default).
    NO_EVENT_CATEGORY = 0;
    // The event is related to deployment to a device or emulator.
    DEPLOYMENT = 1;
    // Stats on builds from Studio.
    STUDIO_BUILD = 2;
    // The event is related to usage of 'Google Developer Services'
    //  inside Android Studio.
    DEVELOPER_SERVICES = 3;
    // The event is related to interaction between Android Studio and Gradle.
    GRADLE_SYNC = 4;
    // The event is related to Performance Profiling.
    PROFILING = 5;
    // The event is related to Performance Monitoring.
    MONITOR = 6;
    // The event is related to the SDK Manager.
    SDK_MANAGER = 7;
    // The event is related to project/file templates.
    TEMPLATE = 8;
    // The event is related to Theme Editor.
    THEME_EDITOR = 9;
    // The event is related to App Indexing integration.
    //  (http://go/studio-app-indexing)
    APP_INDEXING = 10;
    // The event is related to C++ debugging.
    LLDB = 11;
    // The event is related to Google Cloud Test Lab integration.
    CLOUD_TESTING = 12;
    // The event is a regular ping from the application.
    PING = 13;
    // The event is related to running tests.
    TESTS = 14;
    // The event is a meta event reporting metrics on metrics.
    META = 15;
    // The event is related to the Emulator UI
    EMULATOR_UI = 16;
    // The event describes System Info
    SYSTEM = 17;
    // The event is related to the Project Structure Dialog.
    PROJECT_STRUCTURE_DIALOG = 18;
    // The event is from the Android Gradle plugin.
    GRADLE = 19;
    // The event is related to the Firebase assistant.
    FIREBASE_ASSISTANT = 20;
    // The event is related to the GPU Profiler.
    GPU_PROFILER = 21;
    // the event is related to the test recorder (Cassette)
    TEST_RECORDER = 22;
  }
  // Specific kind of event, primary separation key of all Android Studio
  //  related events.
  enum EventKind {
    UNKNOWN_EVENT_KIND = 0;
    // An APK (android application) is deployed.
    DEPLOYMENT_APK = 1;
    // A deployment to the emulator.
    DEPLOYMENT_TO_EMULATOR = 2;
    // The developer added a Google Developer Service to their app.
    DEVELOPER_SERVICES_INSTALLED = 3;
    // The developer removed  a Google Developer Service from their app.
    DEVELOPER_SERVICES_REMOVED = 4;
    // A sync between Android Studio and Gradle started.
    GRADLE_SYNC_STARTED = 5;
    // A sync between Android Studio and Gradle ended.
    GRADLE_SYNC_ENDED = 6;
    // A sync between Android Studio and Gradle was skipped.
    GRADLE_SYNC_SKIPPED = 7;
    // A sync between Android Studio and Gradle failed.
    GRADLE_SYNC_FAILURE = 8;
    // A sync between Android Studio and Gradle C++ support completed.
    GRADLE_CPP_SYNC_COMPLETED = 9;
    // Performance profiling capture started.
    PROFILING_CAPTURE = 10;
    // Performance profiling capture opened in the IDE.
    PROFILING_OPEN = 11;
    // Conversion of hprof profiling data in progress.
    PROFILING_CONVERT_HPROF = 12;
    // Analysis of the profiling data in progress.
    PROFILING_ANALYSIS_RUN = 13;
    // Performance monitoring has been activated.
    MONITOR_ACTIVATED = 14;
    // Performance monitoring is running.
    MONITOR_RUNNING = 15;
    // The user selected an action from the SDK Manager Toolbar.
    SDK_MANAGER_TOOLBAR_CLICKED = 16;
    // The standalone SDK Manager was launched.
    SDK_MANAGER_STANDALONE_LAUNCHED = 17;
    // The built-in SDK Manager was launched.
    SDK_MANAGER_LOADED = 18;
    // A new file/project is created based on a template.
    TEMPLATE_RENDER = 19;
    // User opened the Theme Editor.
    THEME_EDITOR_OPEN = 20;
    // A deep link was created for app indexing.
    APP_INDEXING_DEEP_LINK_CREATED = 21;
    // An api code was created for app indexing.
    APP_INDEXING_API_CODE_CREATED = 22;
    // An app indexing deep link was launched.
    APP_INDEXING_DEEP_LINK_LAUNCHED = 23;
    // An app indexing quick fix was applied.
    APP_INDEXING_TRIGGER_QUICKFIX = 24;
    // App Indexing Fetch As Google dialog is shown.
    APP_INDEXING_SHOW_FEAG_DIALOG = 25;
    // App Indexing Fetch As Google task has started.
    APP_INDEXING_START_FEAG_TASK = 26;
    // Native debugger is launched.
    LLDB_LAUNCHED = 27;
    // Native debugger session has started.
    LLDB_SESSION_STARTED = 28;
    // Native debugger session has failed.
    LLDB_SESSION_FAILED = 29;
    // Native debugger session has completed successfully.
    LLDB_SESSION_COMPLETED = 30;
    // SDK Manager QuickFix Wizard is invoked to install LLDB package.
    LLDB_INSTALL_STARTED = 31;
    // SDK Manager QuickFix Wizard invocation to install LLDB package failed.
    LLDB_INSTALL_FAILED = 32;
    // SDK Manager QuickFix Wizard invocation to install LLDB package completed
    //  successfully.
    LLDB_INSTALL_COMPLETED = 33;
    // A watchpoint was added to native code.
    LLDB_SESSION_USED_WATCHPOINTS = 34;
    // A Cloud Device was configured for Cloud Testing.
    CLOUD_TESTING_CONFIGURE_CLOUD_DEVICE = 35;
    // A Matrix of Cloud Devices was configured for Cloud Testing.
    CLOUD_TESTING_CONFIGURE_MATRIX = 36;
    // A Cloud Devices was launched for Cloud Testing.
    CLOUD_TESTING_LAUNCH_CLOUD_DEVICE = 37;
    // A Matrix of Cloud Devices was run for Cloud Testing.
    CLOUD_TESTING_RUN_TEST_MATRIX = 38;
    // Cloud Testing reported a backend error.
    CLOUD_TESTING_BACKEND_ERROR = 39;
    // A Debug session was launched from Cloud Testing results.
    CLOUD_TESTING_DEBUG_FROM_RESULTS = 40;
    // The compare screenshots window was opened from a Cloud Testing run.
    CLOUD_TESTING_COMPARE_SCREENSHOTS_OPENED = 41;
    // Studio crash statistics were sent.
    STUDIO_CRASH = 42;
    // A Gradle Build was run and statistics are available.
    GRADLE_BUILD_DETAILS = 44;
    // Stats on Instant Run.
    INSTANT_RUN = 45;
    // Daily Android Studio ping with version & os details.
    STUDIO_PING = 46;
    // Daily emulator ping with version & os details.
    EMULATOR_PING = 47;
    // Metrics on Metrics.
    META_METRICS = 48;
    // User ran tests.
    TEST_RUN = 50;
    // User clicked something in the Emulator UI.
    EMULATOR_UI_EVENT = 51;
    // Information on the host OS's hypervisor support.
    HYPERVISOR = 52;
    // Provides info on the Emulator Host
    EMULATOR_HOST = 53;
    // Various UI events in the Project Structure Dialog.
    PROJECT_STRUCTURE_DIALOG_OPEN = 54;
    PROJECT_STRUCTURE_DIALOG_SAVE = 55;
    PROJECT_STRUCTURE_DIALOG_TOP_TAB_CLICK = 56;
    PROJECT_STRUCTURE_DIALOG_TOP_TAB_SAVE = 57;
    PROJECT_STRUCTURE_DIALOG_LEFT_NAV_CLICK = 58;
    PROJECT_STRUCTURE_DIALOG_LEFT_NAV_SAVE = 59;
    // A gradle build profile
    GRADLE_BUILD_PROFILE = 60;
    // The LLDB Frontend has unexpectedly exited
    LLDB_FRONTEND_EXITED = 61;
    // The Firebase assistant created a project.
    FIREBASE_ASSISTANT_PROJECT_CREATED = 62;
    // The Firebase assistant failed to create a project.
    FIREBASE_ASSISTANT_PROJECT_CREATE_FAILED = 63;
    // The Firebase assistant upgraded a project.
    FIREBASE_ASSISTANT_PROJECT_UPGRADED = 64;
    // The Firebase assistant failed to upgrade a project.
    FIREBASE_ASSISTANT_PROJECT_UPGRADE_FAILED = 66;
    // The Firebase assistant failed to create a config.
    FIREBASE_ASSISTANT_PROJECT_CONFIG_CREATE_FAILED = 67;
    // The Firebase assistant updated a project.
    FIREBASE_ASSISTANT_PROJECT_UPDATED = 68;
    // The Firebase assistant failed to update a project.
    FIREBASE_ASSISTANT_PROJECT_UPDATE_FAILED = 69;
    // The Firebase assistant failed to write the project config.
    FIREBASE_ASSISTANT_PROJECT_CONFIG_WRITE_FAILED = 70;
    // The Firebase assistant failed as the user did not accept the TOS.
    FIREBASE_ASSISTANT_TOS_FAILED = 71;
    // The Firebase assistant is trying to login.
    FIREBASE_ASSISTANT_ATTEMPT_LOGIN = 72;
    // The Firebase assistant successfully logged in.
    FIREBASE_ASSISTANT_LOGIN_SUCCESS = 73;
    // The Firebase assistant showed the dialog to offer to reconnect.
    FIREBASE_ASSISTANT_RECONNECT_DIALOG_SYNC = 74;
    // The Firebase assistant was requested to connect to the server.
    FIREBASE_ASSISTANT_CONNECT_REQUESTED = 75;
    // The Firebase assistant panel was opened.
    FIREBASE_ASSISTANT_OPEN = 76;
    // The Firebase assistant connect dialog was opened.
    FIREBASE_ASSISTANT_CONNECT_DIALOG_OPENED = 77;
    // The Firebase assistant connect dialog was asked to connect.
    FIREBASE_ASSISTANT_CONNECT_DIALOG_SYNC = 78;
    // The Firebase assistant presented an error to the user.
    FIREBASE_ASSISTANT_ERROR_PRESENTED = 79;
    // The Firebase assistant encounted an error but didn't inform the user.
    FIREBASE_ASSISTANT_SILENT_ERROR = 80;
    // The Firebase assistant reconnect dialog was opened.
    FIREBASE_ASSISTANT_RECONNECT_DIALOG_OPENED = 81;
    // The GPU Debugger tracing had an initialization failure.
    GFX_TRACE_INIT_ERROR = 82;
    // The GPU Debugger tracing was closed.
    GFX_TRACE_CLOSED = 83;
    // The GPU Debugger tracing had a parameter edited.
    GFX_TRACE_PARAMETER_EDITED = 84;
    // The GPU Debugger tracing was started.
    GFX_TRACE_TRACE_STARTED = 85;
    // The GPU Debugger tracing was stopped.
    GFX_TRACE_TRACE_STOPPED = 86;
    // A UI command influencing the the GPU Debugger was selected.
    GFX_TRACE_COMMAND_SELECTED = 87;
    // A link from  the GPU Debugger tracing results was clicked.
    GFX_TRACE_LINK_CLICKED = 88;
    // A memory snapshot from  the GPU Debugger tracing results was clicked.
    GFX_TRACE_MEMORY_VIEWED = 89;
    // A texture from the GPU Debugger tracing results was viewed.
    GFX_TRACE_TEXTURE_VIEWED = 90;
    // A "legacy" IntelliJ style project was loaded.
    LEGACY_IDEA_ANDROID_PROJECT = 91;
    // The user requested the test recorder to generate a test class.
    TEST_RECORDER_GENERATE_TEST_CLASS = 92;
    // The test recorder failed as the project is missing espresso dependencies.
    TEST_RECORDER_MISSING_ESPRESSO_DEPENDENCIES = 93;
    // The test recorder failed as the instrumentation test folder is missing.
    TEST_RECORDER_MISSING_INSTRUMENTATION_TEST_FOLDER = 94;
    // The test recorder was launched.
    TEST_RECORDER_LAUNCH = 95;
  }
  // Represents different Performance Monitoring types.
  enum MonitorType {
    UNKNOWN_MONITOR_TYPE = 0;
    CPU = 1;
    GPU = 2;
    MEMORY = 3;
    NETWORK = 4;
  }
  // Represents different Performance Profiler Capture types.
  enum ProfilerCaptureType {
    UNKNOWN_PROFILER_CAPTURE_TYPE = 0;
    ALLOCATION = 1;
    FILE = 2;
    GFX_TRACE = 3;
    HEAP = 4;
    SYSTEM_INFO = 5;
    VM_TRACE = 6;
    METHOD_TRACING = 7;
    LAYOUT_INSPECTOR_SNAPSHOT = 8;
  }
  // Represents the different Run Configurations the debugger supports.
  enum RunConfigurationType {
    UNKNOWN_RUN_CONFIGURATION_TYPE = 0;
    ANDROID = 1;
    ANDROID_NATIVE = 2;
    ANDROID_TEST = 3;
  }
  // Represents the different debugger types supported.
  enum DebuggerType {
    UNKNOWN_DEBUGGER_TYPE = 0;
    JAVA = 1;
    HYBRID = 2;
    NATIVE = 3;
  }
  // Represents the different Google Developer Services that can be
  //  (semi-)automatically integrated into Android Applications.
  enum DeveloperServiceKind {
    UNKNOWN_DEVELOPER_SERVICE_KIND = 0;
    GOOGLE_CLOUD_MESSAGING = 1;
    AD_MOB = 2;
    GOOGLE_SIGN_IN = 3;
    GOOGLE_ANALYTICS = 4;
    FIREBASE = 5;
    REALTIME_DATABASE = 6;
    AUTHENTICATION = 7;
    CRASH_REPORTING = 8;
    NOTIFICATIONS = 9;
    REMOTE_CONFIG = 10;
    STORAGE = 11;
    APP_INVITES = 12;
    DYNAMIC_LINKS = 13;
  }
  // The various templates the template engine could be asked to render.
  enum TemplateRenderer {
    UNKNOWN_TEMPLATE_RENDERER = 0;
    CUSTOM_TEMPLATE_RENDERER = 1;
    ANDROID_MODULE = 2;
    ANDROID_PROJECT = 3;
    EMPTY_ACTIVITY = 4;
    BLANK_ACTIVITY = 5;
    LAYOUT_XML_FILE = 6;
    FRAGMENT_BLANK = 7;
    NAVIGATION_DRAWER_ACTIVITY = 8;
    VALUES_XML_FILE = 9;
    GOOGLE_MAPS_ACTIVITY = 10;
    LOGIN_ACTIVITY = 11;
    ASSETS_FOLDER = 12;
    TABBED_ACTIVITY = 13;
    SCROLLING_ACTIVITY = 14;
    FULLSCREEN_ACTIVITY = 15;
    SERVICE = 16;
    JAVA_LIBRARY = 17;
    SETTINGS_ACTIVITY = 18;
    FRAGMENT_LIST = 19;
    MASTER_DETAIL_FLOW = 20;
    ANDROID_WEAR_MODULE = 21;
    BROADCAST_RECEIVER = 22;
    AIDL_FILE = 23;
    INTENT_SERVICE = 24;
    JNI_FOLDER = 25;
    JAVA_FOLDER = 26;
    CUSTOM_VIEW = 27;
    ANDROID_TV_MODULE = 28;
    GOOGLE_ADMOBS_ADS_ACTIVITY = 29;
    ALWAYS_ON_WEAR_ACTIVITY = 30;
    RES_FOLDER = 31;
    ANDROID_TV_ACTIVITY = 32;
    BLANK_WEAR_ACTIVITY = 33;
    BASIC_ACTIVITIY = 34;
    APP_WIDGET = 35;
  }
  // Reasons Gradle sync failed.
  enum GradleSyncFailure {
    UNKNOWN_GRADLE_FAILURE = 0;
    CONNECTION_DENIED = 1;
    CLASS_NOT_FOUND = 2;
    DSL_METHOD_NOT_FOUND = 3;
    FAILED_TO_PARSE_SDK = 4;
    METHOD_NOT_FOUND = 5;
    MISSING_ANDROID_PLATFORM = 6;
    MISSING_ANDROID_SUPPORT_REPO = 7;
    MISSING_BUILD_TOOLS = 8;
    OUT_OF_MEMORY = 9;
    SDK_NOT_FOUND = 10;
    UNKNOWN_HOST = 11;
    UNSUPPORTED_ANDROID_MODEL_VERSION = 12;
    UNSUPPORTED_GRADLE_VERSION = 13;
  }
  // Describes a group of event kinds related to each other.
  optional .android_studio.AndroidStudioEvent.EventCategory category = 1;
  // Specific kind of event, primary separation key of all Android Studio
  //  related events.
  optional .android_studio.AndroidStudioEvent.EventKind kind = 2;
  // The session id is a UUID tracking a single instance of Android Studio
  //  to associate events together such as kind = TEST_RUN
  optional string studio_session_id = 3;
  // set when kind = STUDIO_PING
  //  or kind = EMULATOR_PING
  //  or ANDROID_STUDIO_TEST
  //  or ANDROID_STUDIO_THROUGH_GRADLE
  optional .android_studio.ProductDetails product_details = 4;
  // set when kind = MONITOR_ACTIVATED or kind = MONITOR_RUNNING
  optional .android_studio.AndroidStudioEvent.MonitorType monitor_type = 5;
  // set when kind = MONITOR_RUNNING
  optional bool monitor_paused = 6;
  // set when kind = PROFILING_OPEN or PROFILING_CAPTURE
  optional .android_studio.AndroidStudioEvent.ProfilerCaptureType profiler_capture_type = 7;
  // set when kind = CLOUD_TESTING_BACKEND_ERROR
  optional string cloud_testing_error_message = 8;
  // set when kind = CLOUD_TESTING_COMPARE_SCREENSHOTS_OPENED
  optional int32 cloud_testing_loaded_screenshots_count = 9;
  // set when kind = LLDB_SESSION_STARTED
  optional .android_studio.AndroidStudioEvent.RunConfigurationType run_configuration_type = 10;
  // set when kind = LLDB_SESSION_STARTED
  optional .android_studio.AndroidStudioEvent.DebuggerType debugger_type = 11;
  // set when kind = LLDB_LAUNCHED
  //  or kind = DEPLOYMENT_APK
  //  or kind = DEPLOYMENT_EMULATOR
  //  or kind = CLOUD_TESTING_CONFIGURE_CLOUD_DEVICE
  //  or kind = CLOUD_TESTING_LAUNCH_CLOUD_DEVICE
  //  or kind = CLOUD_TESTING_DEBUG_FROM_RESULTS
  //  or kind = TEST_RUN
  optional .android_studio.DeviceInfo device_info = 12;
  // set when kind = LLDB_SESSION_FAILED or kind = LLDB_INSTALL_FAILED
  //  e.g. 'failed to get reply to handshake packet'
  optional string lldb_session_failure_message = 13;
  // set when kind = DEVELOPER_SERVICES_INSTALLED
  //  or kind = DEVELOPER_SERVICES_REMOVED
  optional .android_studio.AndroidStudioEvent.DeveloperServiceKind developer_service_kind = 14;
  // set when category = GRADLE_SYNC
  optional string gradle_version = 15;
  // e.g. '2.10'
  // set when kind = GRADLE_SYNC_FAILURE
  optional .android_studio.AndroidStudioEvent.GradleSyncFailure gradle_sync_failure = 16;
  // set when kind = GRADLE_SYNC_FAILURE and gradle_sync_failure = *_NOT_FOUND
  //  e.g. 'org.gradle.api.internal.DemoClass.demoMethod'
  optional string gradle_missing_signature = 17;
  // set when kind = TEMPLATE_RENDERER
  optional .android_studio.AndroidStudioEvent.TemplateRenderer template_renderer = 18;
  // set when kind = STUDIO_CRASH
  optional .android_studio.StudioCrash studio_crash = 19;
  // set when kind = GRADLE_BUILD_DETAILS
  optional .android_studio.GradleBuildDetails gradle_build_details = 20;
  // set when kind = INSTANT_RUN
  optional .android_studio.InstantRun instant_run = 21;
  // set when kind = META_METRICS
  optional .android_studio.MetaMetrics meta_metrics = 22;
  // set when kind = EMULATOR_PING
  optional .android_studio.EmulatorDetails emulator_details = 23;
  // set when kind = TEST_RUN
  optional .android_studio.TestRun test_run = 24;
  // set when kind = EMULATOR_UI_EVENT
  optional .android_studio.EmulatorUiEvent emulator_ui_event = 25;
  // set when kind = HYPERVISOR
  optional .android_studio.Hypervisor hypervisor = 26;
  // set when kind = EMULATOR_HOST
  optional .android_studio.EmulatorHost emulator_host = 27;
  // set when kind = GRADLE_BUILD_PROFILE
  optional .android_studio.GradleBuildProfile gradle_build_profile = 28;
  // set when kind = LLDB_FRONTEND_EXITED
  optional .android_studio.LLDBFrontendDetails lldb_frontend_details = 29;
  // set when kind = FIREBASE_ASSISTANT_ERROR_PRESENTED or
  //  kind FIREBASE_ASSISTANT_SILENT_ERROR
  optional .android_studio.FirebaseErrorDetails firebase_error_details = 30;
  // Client-side salted (rotating every 28 days), sha256 of the project id.
  //  set when kind = PROJECT_STRUCTURE_*.
  optional string project_id = 31;
  // set when kind = GFX_TRACE_*
  optional .android_studio.GfxTracingDetails gfx_tracing_details = 32;
  // set when kind = TEST_RECORDER_GENERATE_TEST_CLASS
  optional .android_studio.TestRecorderDetails test_recorder_details = 33;
}

// Describes a product, e.g. Android Studio or Emulator.
message ProductDetails {
  // Describes the various Products related to Android Studio.
  enum ProductKind {
    UNKNOWN_PRODUCT = 0;
    STUDIO = 1;
    EMULATOR = 2;
    GRADLE = 3;
    DDMS = 4;
  }
  // Describes the various OS platforms our products run on.
  enum OSKind {
    UNKNOWN_OS_KIND = 0;
    OTHER_OS = 1;
    // Known but not in our list.
    WINDOWS = 2;
    MAC_OSX = 3;
    LINUX = 4;
    FREE_BSD = 5;
  }
  // Chip the software is running on.
  enum CpuArchitecture {
    UNKNOWN_CPU_ARCHITECTURE = 0;
    X86 = 1;
    X86_64 = 2;
  }
  // The product this event relates to.
  optional .android_studio.ProductDetails.ProductKind product = 1;
  // The build ID of Android Studio.
  optional string build = 2;
  // e.g. AI-141.2178183
  // The version of the product.
  optional string version = 3;
  // e.g. 2.0.0.11
  // Whether this product is a preview version.
  optional bool preview = 4;
  // The CPU archtecture the product is running on.
  optional .android_studio.ProductDetails.CpuArchitecture os_architecture = 5;
}

// Describes a emulator or physical Android Device.
message DeviceInfo {
  // Describes tthe ABI of the device/emulator.
  enum ApplicationBinaryInterface {
    UNKNOWN_ABI = 0;
    ARME_ABI_V7A = 1;
    X86_ABI = 2;
    ARM64_V8A_ABI = 3;
    X86_64_ABI = 4;
    ARME_ABI = 5;
    MIPS_ABI = 6;
    MIPS_R2_ABI = 7;
    ARME_ABI_V6L = 8;
    ARME_ABI_V6J = 9;
  }
  // Describes the kind of device being deployed/tested on.
  enum DeviceType {
    UNKNOWN_DEVICE_TYPE = 0;
    LOCAL_PHYSICAL = 1;
    LOCAL_EMULATOR = 2;
    CLOUD_EMULATOR = 3;
    CLOUD_PHYSICAL = 4;
  }
  // serial number of the device, salted & sha256ed on the client.
  optional string anonymized_serial_number = 1;
  // Tags used to build the android version on this device.
  //  e.g. 'release-keys' or 'test-keys' or 'A100_V001'
  //  TODO(jvg): ask loglaunch folks: ST_SOFTWARE_ID datapol?
  optional string build_tags = 2;
  // Type of build this device is running.
  //  e.g. 'user' or 'userdebug' or 'eng' or 'alphabuild'
  //  TODO(jvg): ask loglaunch folks: ST_SOFTWARE_ID datapol?
  optional string build_type = 3;
  // Android version e.g. '5.1.1'
  optional string build_version_release = 4;
  // Historic: doesn't support api levels for code names such as 'N'.
  optional int32 build_api_level = 5;
  // ABI of the device, e.g. 'armeabi-v7a' or 'x86'
  optional .android_studio.DeviceInfo.ApplicationBinaryInterface cpu_abi = 6;
  // Device manufacturer, e.g. 'Motorola' or 'Samsung'
  optional string manufacturer = 7;
  // Device model, e.g. 'Nexus 5' or 'GT-I9500'.
  optional string model = 8;
  // What kind of device is this? Physicial/Emulator/Cloud etc...
  optional .android_studio.DeviceInfo.DeviceType device_type = 9;
  // android api level  e.g. '23' or 'N'
  optional string build_api_level_full = 10;
}

// Metrics on crashes in Android Studio.
message StudioCrash {
  // number of actions since last crash report.
  optional int64 actions = 1;
  // number of exceptions since last crash report.
  optional int64 exceptions = 2;
  // number of crashes since last crash report.
  optional int64 crashes = 3;
  // number of exceptions from plugins bundled with Android Studio.
  optional int64 bundled_plugin_exceptions = 4;
  // number of exceptions from plugins not bundled with Android Studio.
  optional int64 non_bundled_plugin_exceptions = 5;
}

// Emulator guest image's GL info.
message EmulatorGuestGlInfo {
  // GL Driver vendor.
  optional string vendor = 1;
  // GL Driver name.
  optional string renderer = 2;
  // GL Driver version number.
  optional string version = 3;
}

// Emulator: Host GPU info.
message EmulatorGpuInfo {
  // Make of the Graphics card.
  optional string make = 1;
  // Model of the Graphics card.
  optional string model = 2;
  // Device id of the Graphics card.
  optional string device_id = 3;
  // Revision of the graphics card.
  optional string revision_id = 4;
  // Version of the graphics card driver.
  optional string version = 5;
  // Name of the graphics card driver.
  optional string renderer = 6;
}

// Metrics related to the Emulator.
message EmulatorDetails {
  // Emulator instance liveness as determined via adb connectivity.
  enum EmulatorAdbLiveness {
    UNKNOWN_EMULATOR_ADB_LIVENESS = 0;
    FAILURE_NO_ADB = 1;
    ADB_ONLINE = 2;
    FAILURE_ADB_SERVER_DEAD = 3;
    FAILURE_EMULATOR_DEAD = 4;
  }
  // In What phase of the lifetime of the Emulator were the metrics reported.
  enum EmulatorSessionPhase {
    UNKNOWN_EMULATOR_SESSION_PHASE = 0;
    // The custom emulator launcher is running.
    LAUNCHER = 1;
    // Final emulator target is parsing command line arguments.
    PARSE_OPTIONS = 2;
    // Initialization - general.
    INIT_GENERAL = 3;
    // Initializing GPU
    INIT_GPU = 4;
    // Initializing hardware acceleration.
    INIT_ACCEL = 5;
    // Main use case -- init done, emulator is up.
    RUNNING_GENERAL = 6;
    // Exiting
    EXIT_GENERAL = 7;
  }
  // Chip the emulator is emulating for.
  enum GuestCpuArchitecture {
    UNKNOWN_GUEST_CPU_ARCHITECTURE = 0;
    X86 = 1;
    X86_64 = 2;
    ARM = 3;
    ARM_64 = 4;
    MIPS = 5;
    MIPS_64 = 6;
  }
  // Cpu architecture of the guest.
  optional .android_studio.EmulatorDetails.GuestCpuArchitecture guest_arch = 1;
  // cpu time spent in kernel mode in milliseconds since last metrics report.
  optional int64 system_time = 2;
  // cpu time spent in user mode in milliseconds since last metrics report.
  optional int64 user_time = 3;
  // number of crashes since last metrics report.
  optional int64 crashes = 4;
  // real time in milliseconds since last metrics report.
  optional int64 wall_time = 5;
  // True iff a crash occurred while process started its exit routines.
  optional bool exit_started = 6;
  // The API level of the running guest image.
  optional int64 guest_api_level = 7;
  // The value of guest gpu option (ro.kernel.qemu.gles)
  optional bool guest_gpu_enabled = 8;
  // True if we were able to correctly initialize opengl on the host.
  optional bool is_opengl_alive = 10;
  // Connectivity from adb of the running emulator instance.
  optional .android_studio.EmulatorDetails.EmulatorAdbLiveness adb_liveness = 11;
  // Information about the gl implementation in the guest image.
  optional .android_studio.EmulatorGuestGlInfo guest_gl = 12;
  // Information about the host GPUs (one per GPU).
  repeated .android_studio.EmulatorGpuInfo host_gpu = 13;
  // The "phase" of an emulator session where crash happened.
  optional .android_studio.EmulatorDetails.EmulatorSessionPhase session_phase = 14;
}

// Describes a user clicking on some part of the Emulator UI.
message EmulatorUiEvent {
  // Tracks the type of the emulator UI Event.
  enum EmulatorUiEventType {
    UNKONWN_EMULATOR_UI_EVENT_TYPE = 0;
    BUTTON_PRESS = 1;
    // Generated when a user action changes the value of certain field from
    //  its default value.
    OPTION_SET_TO_NON_DEFAULT = 2;
    // Generated to report the index of an option selected by the user in a
    //  drop-down menu / radio button etc.
    OPTION_SELECTED = 3;
  }
  // Tracks the context of the Emulator UI.
  enum EmulatorUiEventContext {
    UNKNOWN_EMULATOR_UI_EVENT_CONTEXT = 0;
    EXTENDED_WINDOW_OPEN = 1;
  }
  // Id of the UI element, baked in the emulator binary.
  //  TODO(jvg): ask logs ticket folks what kind of datapol annotation
  //  it is not freeform, but we cannot make this an enum
  optional string element_id = 1;
  // The type of UI event
  optional .android_studio.EmulatorUiEvent.EmulatorUiEventType type = 2;
  // The current context of the event.
  optional .android_studio.EmulatorUiEvent.EmulatorUiEventContext context = 3;
  // This value is an opaque numeric type. The exact schema of the UI metrics
  //  is not specific here. e.g., |value| may represent a boolean, a "count", or
  //  an index into the list of items in a drop down menu.
  optional int64 value = 4;
}

// Details about a single Gradle run.
message GradleBuildDetails {
  // Version of our Gradle plugin supporting android builds. e.g. '2.0-beta1'
  optional string android_plugin_version = 1;
  // Version of the open source Gradle application used.
  optional string gradle_version = 2;
  // indicates whether the user has instant run enabled in settings
  optional bool user_enabled_ir = 3;
  // indicates whether the IDE thinks whether this plugin version supports IR
  optional bool model_supports_ir = 4;
  // indicates whether the current variant supports IR, but this can be changed
  //  without a notification
  optional bool variant_supports_ir = 5;
  // per library metrics.
  repeated .android_studio.GradleLibrary libraries = 6;
  // per module metrics.
  repeated .android_studio.GradleModule modules = 7;
  // per android module metrics.
  repeated .android_studio.GradleAndroidModule android_modules = 8;
  // per native android module metrics
  repeated .android_studio.GradleNativeAndroidModule native_android_modules = 9;
}

// Per library Gradle metrics.
message GradleLibrary {
  // Number of jar dependencies in this library.
  optional int64 jar_dependency_count = 1;
  // Number of aar dependencies in this library.
  optional int64 aar_dependency_count = 2;
}

// Per module Gradle metrics.
message GradleModule {
  // Total number of modules in this app.
  optional int64 total_module_count = 1;
  // Number of aar modules in  this app.
  optional int64 app_module_count = 2;
  // Number of library modules in this app..
  optional int64 lib_module_count = 3;
}

// Per Android module Gradle metrics.
message GradleAndroidModule {
  // Client-side salted, sha256 of the application id
  //  the app_id is the id for the user's android app
  //  which we salt with a client unique salt and then sha256
  //  so it is anonymized and is unique per user, but has a 1-N relation.
  optional string app_id = 1;
  // Client-side salted, sha256 of the module name.
  optional string module_name = 2;
  // True if this module is a library.
  optional bool is_library = 3;
  // Number of different build types for this module.
  optional int64 build_type_count = 4;
  // Number of different flavor types for this module.
  optional int64 flavor_count = 5;
  // Number of different flavor dimensions for this module.
  optional int64 flavor_dimension = 6;
  // Number of signing configurations for this module.
  optional int64 signing_config_count = 7;
}

// per "native" (C++) android module Gradle metrics.
message GradleNativeAndroidModule {
  // The various native build systems we support to be used from Gradle.
  enum NativeBuildSystemType {
    UNKNOWN_NATIVE_BUILD_SYSTEM_TYPE = 0;
    // The Gradle epxerimental plugin
    GRADLE_EXPERIMENTAL = 1;
    // The compilation part of NDK builds (Android's native build system).
    NDK_COMPILE = 2;
    // full NDK builds (Android's native build system).
    NDK_BUILD = 3;
    // CMake is a very common C++ build system.
    CMAKE = 4;
  }
  // Client-side salted, sha256 of the application id
  //  the app_id is the id for the user's android app
  //  which we salt with a client unique salt and then sha256
  //  so it is anonymized and is unique per user, but has a 1-N relation.
  optional string app_id = 1;
  // Client-side salted, sha256 of the module name.
  optional string module_name = 2;
  // True if this module is a library.
  optional .android_studio.GradleNativeAndroidModule.NativeBuildSystemType build_system_type = 3;
}

// Metrics on InstantRun usage.
message InstantRun {
  // What Instant Run Deployment was used
  enum InstantRunDeploymentKind {
    UNKNOWN_INSTANT_RUN_DEPLOYMENT_KIND = 0;
    LEGACY = 1;
    FULL_APK = 2;
    SPLIT_APK = 3;
    DEX = 4;
    HOT_SWAP = 5;
    WARM_SWAP = 6;
    NO_CHANGES = 7;
  }
  // The different reasons Instant Run had to do a full build.
  enum InstantRunBuildCause {
    UNKNOWN_INSTANT_RUN_BUILD_CAUSE = 0;
    COMPATIBLE = 1;
    MANIFEST_CHANGE = 2;
    FIELD_TYPE_CHANGE = 3;
    FIELD_REMOVED = 4;
    FIELD_ADDED = 5;
    METHOD_DELETED = 6;
    METHOD_ADDED = 7;
    CLASS_ADDED = 8;
    STATIC_INITIALIZER_CHANGE = 9;
    CLASS_ANNOTATION_CHANGE = 10;
    RESOURCE_CHANGE = 11;
    IMPLEMENTS_INTERFACE_CHANGE = 12;
    R_CLASS_CHANGE = 13;
    PARENT_CLASS_CHANGE = 14;
    METHOD_ANNOTATION_CHANGE = 15;
    API_LEVEL_UNSUPPORTED = 16;
    REFLECTION_USED = 17;
  }
  // The different reasons InstantRun chose the build mode it did from the IDE's
  //  perspective.
  enum InstantRunIdeBuildCause {
    // reasons for clean build
    UNKNOWN_INSTANT_RUN_IDE_BUILD_CAUSE = 0;
    NO_DEVICE = 1;
    APP_NOT_INSTALLED = 2;
    MISMATCHING_TIMESTAMPS = 3;
    USER_REQUESTED_CLEAN_BUILD = 4;
    // reasons for full build
    API_TOO_LOW_FOR_INSTANT_RUN = 5;
    // first installation in this Android Studio session
    FIRST_INSTALLATION_TO_DEVICE = 6;
    MANIFEST_RESOURCE_CHANGED = 7;
    FREEZE_SWAP_REQUIRES_API21 = 8;
    FREEZE_SWAP_REQUIRES_WORKING_RUN_AS = 9;
    // reasons for forced cold swap build
    APP_NOT_RUNNING = 10;
    APP_USES_MULTIPLE_PROCESSES = 11;
    INCREMENTAL_BUILD = 12;
    NO_INSTANT_RUN = 13;
  }
  // What kind of Instant Run deployment was chosen.
  optional .android_studio.InstantRun.InstantRunDeploymentKind deployment_kind = 1;
  // what was the reason for chosing that kind of deployment from the gradle
  //  side.
  optional .android_studio.InstantRun.InstantRunBuildCause instant_run_build_cause = 3;
  // time the InstantRun enabled took in seconds.
  optional int64 build_time = 4;
  // The session id is a UUID within a single run of Android Studio
  //  tracking multiple HOT_SWAP & DEX builds in the same
  //  IR session (starting at FULL_APK and ending before FULL_APK).
  optional string session_id = 5;
  // what was the reason for chosing that kind of deployment from the IDE
  //  side.
  optional .android_studio.InstantRun.InstantRunIdeBuildCause ide_build_cause = 6;
}

// describes Metrics on Metrics.
message MetaMetrics {
  // number of times connecting to the clearcut server failed since
  //  the last successful upload.
  optional int32 failed_connections = 1;
  // number of bytes used to send metrics in the last upload.
  optional int64 bytes_sent_in_last_upload = 2;
  // number of times the clearcut server failed with an http error since
  //  the last successful upload.
  optional int32 failed_server_replies = 3;
}

// Describes a set of tests run.
message TestRun {
  // Describes how tests where invoked.
  enum TestInvocationType {
    UNKNOWN_TEST_INVOCATION_TYPE = 0;
    // Tests were run from the command-line.
    GRADLE_TEST = 1;
    // Tests were run by Android Studio run configurations logic.
    ANDROID_STUDIO_TEST = 2;
    // Tests were run by Gradle, but invoked through AS UI.
    ANDROID_STUDIO_THROUGH_GRADLE_TEST = 3;
  }
  // What kind of test is run.
  enum TestKind {
    UNKNOWN_TEST_KIND = 0;
    UNIT_TEST = 1;
    INSTRUMENTATION_TEST = 2;
  }
  // Describes how tests where invoked.
  optional .android_studio.TestRun.TestInvocationType test_invocation_type = 1;
  // Total number of tests that ran.
  optional int32 number_of_tests_executed = 2;
  // What kind of test is run.
  optional .android_studio.TestRun.TestKind test_kind = 3;
  // Whether the test run finished successfully (regardless of results) or
  //  tooling error happened.
  optional bool crashed = 4;
  // Set when test_invocation_type = GRADLE or ANDROID_STUDIO_THROUGH_GRADLE
  optional string gradle_version = 5;
  // e.g. '2.10'
  // Did the user/project enable code coverage on this test run?
  optional bool code_coverage_enabled = 6;
  // Provides details on commonly used test libraries.
  optional .android_studio.TestLibraries test_libraries = 7;
}

// Provides details on commonly used test libraries.
message TestLibraries {
  // The exact version of the given library that this project uses.
  //  Not present if project doesn't use a given library.
  optional string test_support_library_version = 1;
  // e.g. '0.5'
  optional string espresso_version = 2;
  // e.g. '2.2.2'
  optional string robolectric_version = 3;
  // e.g. '3.0'
  optional string mockito_version = 4;
  // e.g. '1.10.19'
}

// Describes the status of various Hypervisors
message Hypervisor {
  // Status of the Hyper-V hypervisor.
  enum HyperVState {
    UNKNOWN_HYPERV_STATE = 0;
    // Have no idea
    HYPERV_ABSENT = 1;
    // No hyper-V found
    HYPERV_INSTALLED = 2;
    // Hyper-V is installed but not running
    HYPERV_RUNNING = 3;
    // Hyper-V is up and running
    HYPERV_CHECK_ERROR = 4;
    // Failed to detect status (emulator-check error)
  }
  optional .android_studio.Hypervisor.HyperVState hyper_v_state = 1;
}

// Describes the status of the machine running the emulator.
message EmulatorHost {
  // CPU manufacturer of the host, used as certain hypervisors are limited
  //  to a certain manufacturer.
  optional string cpu_manufacturer = 1;
  // AMD, INTEL, ...
  // Does the host support virtualization technology
  optional bool virt_support = 2;
  // Is the host itself running inside a virtual machine.
  optional bool running_in_vm = 3;
  // May differ from os_architecture field as it is calculated differently,
  //  trying to compensate the JVM bittness.
  optional int64 os_bit_count = 4;
}

// Detailed profiling information for the gradle build.
message GradleBuildProfile {
  // Version of the open source Gradle application used.
  //  e.g. "2.14" or "3.0-20160617000025+0000"
  optional string gradle_version = 2;
  // The value of the "os.name" system property.
  //  e.g. "Linux"
  optional string os_name = 6;
  // The value of the "os.version" system property.
  //  e.g. "3.13.0-86-generic"
  optional string os_version = 7;
  // The value of the "java.version" system property.
  //  e.g. "1.8.0_40-ea"
  optional string java_version = 8;
  // The value of the "java.vm.version" system property.
  //  e.g. "25.40-b25"
  optional string java_vm_version = 9;
  // The value of Runtime.getRuntime().maxMemory()
  optional int64 max_memory = 10;
  // The total time taken for this build.
  //  This does not include Gradle's startup (before plugin apply) or shutdown
  //  (after BuildListener#buildFinished(BuildResult) called.
  optional int64 build_time = 11;
  // The number of garbage collections during this build
  optional int64 gc_count = 12;
  // The time spent garbage collecting during this build.
  optional int64 gc_time = 13;
  // The projects that make up this multi-project build.
  repeated .android_studio.GradleBuildProject project = 14;
  // Samples of the memory state of the daemon during the build.
  repeated .android_studio.GradleBuildMemorySample memory_sample = 15;
  // The fine-grained execution spans which record granular timings.
  repeated .android_studio.GradleBuildProfileSpan span = 16;
  // For instant run builds: the resulting instant run build info.
  optional .android_studio.InstantRunStatus instant_run_status = 17;
  // Client-side salted, sha256 of the root project path.
  //  This exists to allow multiple instant run builds in one project by one
  //  user to be correlated.
  // 
  //  The salt is rotated every 28 days, so it is not a permenant pseudonymous
  //  identifier. It is anonymized and is unique per user, but has a 1-N
  //  relation.
  optional string project_id = 18;
}

message GradleBuildProject {
  enum PluginType {
    UNKNOWN_PLUGIN_TYPE = 0;
    // The 'com.android.application' or 'com.android.model.application' plugins.
    APPLICATION = 1;
    // The 'com.android.library' or 'com.android.model.library' plugins.
    LIBRARY = 2;
    // The 'com.android.test' plugin.
    TEST = 3;
  }
  enum PluginGeneration {
    UNKNOWN_PLUGIN_GENERATION = 0;
    // The 'com.android.[application,library,test] plugins.
    FIRST = 1;
    // The 'com.android.model.[application,library]' plugins
    COMPONENT_MODEL = 2;
  }
  // Identifier, local to the containing AndroidStudioEvent, for the project.
  //  Can be used to correlate spans (GradleBuildProfileSpan) with this
  //  project for this build only. Is created by sequentially
  //  numbering projects as they are encountered.
  //  Is not stable across build invocations.
  optional int64 id = 1;
  // Version of our Android Gradle plugin supporting android builds.
  //  e.g. '2.0-beta1'
  //  For the experimental plugin this is the gradle-core version.
  optional string android_plugin_version = 2;
  // Which Android Gradle plugin is used.
  optional .android_studio.GradleBuildProject.PluginType android_plugin = 3;
  // Which plugin generation is used.
  optional .android_studio.GradleBuildProject.PluginGeneration plugin_generation = 4;
  // The build tools version used, e.g. '24.0.0 rc2'
  optional string build_tools_version = 5;
  // Statistics about the project build.
  //  Will be used to characterize and bucket projects for subgroup analysis.
  optional .android_studio.GradleBuildProjectMetrics metrics = 6;
  // The variants in this project
  repeated .android_studio.GradleBuildVariant variant = 7;
}

message GradleBuildProjectMetrics {
  // The time taken to collect these metrics
  optional int64 metrics_time_ns = 1;
  // The size of the APK built, if relevant.
  optional int64 apk_size = 2;
  // The size of the resources_ap included in that apk.
  optional int64 resources_ap_size = 3;
}

message GradleBuildVariant {
  // The nature of this variant.
  //  The test variants have an associated tested variant.
  //  See com.android.builder.core.VariantType
  enum VariantType {
    // For building an APK.
    APPLICATION = 0;
    // For building an AAR.
    LIBRARY = 1;
    // For building a test APK.
    ANDROID_TEST = 2;
    // For building unit tests to run locally.
    UNIT_TEST = 3;
  }
  // Identifier, local to this AndroidStudioEvent, for the variant.
  //  Can be used to correlate spans (GradleBuildProfileSpan) with this
  //  project for this build only. Is created by sequentially
  //  numbering variants as they are created.
  //  Is not stable across build invocations.
  optional int64 id = 1;
  // Whether the variant is debuggable.
  optional bool is_debug = 2;
  // Whether the variant is compiled using jack
  optional bool use_jack = 3;
  // Whether the variant is minified
  optional bool minify_enabled = 4;
  // Is multidex enabled for the variant
  optional bool use_multidex = 5;
  // Is legacy (pre-api 19) multidex enabled for the variant.
  //  Only can true if use_multidex is also true.
  optional bool use_legacy_multidex = 6;
  // The type of variant.
  optional .android_studio.GradleBuildVariant.VariantType variant_type = 7;
  // For test variants, the tested variant id. (See GradleBuildVariant.id)
  optional int64 tested_id = 8;
}

message GradleBuildMemorySample {
  // Garbage collection time since the current daemon started.
  optional int64 gc_time_ms = 1;
  // Garbage collection count since the current daemon started.
  optional int64 gc_count = 2;
  // Time that the memory stats were collected.
  optional int64 timestamp = 3;
}

// A single execution span from a build.
//  For example, a task execution or creation of some tasks for a variant.
message GradleBuildProfileSpan {
  // The type of execution.
  //  This was originally com.android.builder.profile.ExecutionType.
  enum ExecutionType {
    SOME_RANDOM_PROCESSING = 1;
    BASE_PLUGIN_PROJECT_CONFIGURE = 2;
    BASE_PLUGIN_PROJECT_BASE_EXTENSION_CREATION = 3;
    BASE_PLUGIN_PROJECT_TASKS_CREATION = 4;
    BASE_PLUGIN_BUILD_FINISHED = 5;
    TASK_MANAGER_CREATE_TASKS = 6;
    BASE_PLUGIN_CREATE_ANDROID_TASKS = 7;
    VARIANT_MANAGER_CREATE_ANDROID_TASKS = 8;
    VARIANT_MANAGER_CREATE_TASKS_FOR_VARIANT = 9;
    VARIANT_MANAGER_CREATE_LINT_TASKS = 10;
    VARIANT_MANAGER_CREATE_TESTS_TASKS = 11;
    VARIANT_MANAGER_CREATE_VARIANTS = 12;
    RESOLVE_DEPENDENCIES = 13;
    TASK_EXECUTION = 14;
    INITIAL_METADATA = 100;
    FINAL_METADATA = 101;
    GENERAL_CONFIG = 102;
    VARIANT_CONFIG = 103;
    VARIANT_MANAGER_EXTERNAL_NATIVE_CONFIG_VALUES = 104;
    APK_METRICS = 105;
    // ApplicationTaskManager per variant tasks.
    APP_TASK_MANAGER_CREATE_MERGE_MANIFEST_TASK = 1000;
    APP_TASK_MANAGER_CREATE_GENERATE_RES_VALUES_TASK = 1001;
    APP_TASK_MANAGER_CREATE_CREATE_RENDERSCRIPT_TASK = 1002;
    APP_TASK_MANAGER_CREATE_MERGE_RESOURCES_TASK = 1003;
    APP_TASK_MANAGER_CREATE_MERGE_ASSETS_TASK = 1004;
    APP_TASK_MANAGER_CREATE_BUILD_CONFIG_TASK = 1005;
    APP_TASK_MANAGER_CREATE_PROCESS_RES_TASK = 1006;
    APP_TASK_MANAGER_CREATE_AIDL_TASK = 1007;
    APP_TASK_MANAGER_CREATE_COMPILE_TASK = 1008;
    APP_TASK_MANAGER_CREATE_NDK_TASK = 1009;
    APP_TASK_MANAGER_CREATE_SPLIT_TASK = 1010;
    APP_TASK_MANAGER_CREATE_PACKAGING_TASK = 1011;
    APP_TASK_MANAGER_CREATE_PREPROCESS_RESOURCES_TASK = 1012;
    APP_TASK_MANAGER_CREATE_BACKPORT_RESOURCES_TASK = 1013;
    APP_TASK_MANAGER_CREATE_LINT_TASK = 1014;
    APP_TASK_MANAGER_CREATE_MERGE_JNILIBS_FOLDERS_TASK = 1015;
    APP_TASK_MANAGER_CREATE_SHADER_TASK = 1016;
    APP_TASK_MANAGER_CREATE_EXTERNAL_NATIVE_BUILD_TASK = 1017;
    APP_TASK_MANAGER_CREATE_STRIP_NATIVE_LIBRARY_TASK = 1018;
    // LibraryTaskManager per variant tasks.
    LIB_TASK_MANAGER_CREATE_MERGE_MANIFEST_TASK = 2000;
    LIB_TASK_MANAGER_CREATE_GENERATE_RES_VALUES_TASK = 2001;
    LIB_TASK_MANAGER_CREATE_CREATE_RENDERSCRIPT_TASK = 2002;
    LIB_TASK_MANAGER_CREATE_MERGE_RESOURCES_TASK = 2003;
    LIB_TASK_MANAGER_CREATE_MERGE_ASSETS_TASK = 2004;
    LIB_TASK_MANAGER_CREATE_BUILD_CONFIG_TASK = 2005;
    LIB_TASK_MANAGER_CREATE_PROCESS_RES_TASK = 2006;
    LIB_TASK_MANAGER_CREATE_AIDL_TASK = 2007;
    LIB_TASK_MANAGER_CREATE_COMPILE_TASK = 2008;
    LIB_TASK_MANAGER_CREATE_NDK_TASK = 2009;
    LIB_TASK_MANAGER_CREATE_SPLIT_TASK = 2010;
    LIB_TASK_MANAGER_CREATE_PACKAGING_TASK = 2011;
    LIB_TASK_MANAGER_CREATE_MERGE_PROGUARD_FILE_TASK = 2012;
    LIB_TASK_MANAGER_CREATE_POST_COMPILATION_TASK = 2013;
    LIB_TASK_MANAGER_CREATE_PROGUARD_TASK = 2014;
    LIB_TASK_MANAGER_CREATE_PACKAGE_LOCAL_JAR = 2015;
    LIB_TASK_MANAGER_CREATE_BACKPORT_RESOURCES_TASK = 2016;
    LIB_TASK_MANAGER_CREATE_LINT_TASK = 2017;
    LIB_TASK_MANAGER_CREATE_SHADER_TASK = 2018;
    LIB_TASK_MANAGER_CREATE_EXTERNAL_NATIVE_BUILD_TASK = 2019;
    // Task execution: Deprecated, use TASK_EXECUTION and
    //  GradleTaskExecution#Type instead.
    //  Deprecated July 2016.
    GENERIC_TASK_EXECUTION = 3000;
    TASK_AIDL_COMPILE = 3001;
    TASK_DELETE = 3002;
    TASK_CHECK_MANIFEST = 3003;
    TASK_PREPARE_DEPENDENCIES_TASK = 3004;
    TASK_RENDERSCRIPT_COMPILE = 3005;
    TASK_GENERATE_BUILD_CONFIG = 3006;
    TASK_MERGE_ASSETS = 3007;
    TASK_GENERATE_RES_VALUES = 3008;
    TASK_MERGE_RESOURCES = 3009;
    TASK_MERGE_MANIFESTS = 3010;
    TASK_PROCESS_ANDROID_RESOURCES = 3011;
    TASK_JAVA_COMPILE = 3012;
    TASK_NDK_COMPILE = 3013;
    TASK_PRE_DEX = 3014;
    TASK_DEX = 3015;
    TASK_PACKAGE_SPLIT_RES = 3016;
    TASK_PROCESS_RESOURCES = 3017;
    TASK_VALIDATE_SIGNING_TASK = 3018;
    TASK_PACKAGE_APPLICATION = 3019;
    TASK_SPLIT_ZIP_ALIGN = 3020;
    TASK_ZIP_ALIGN = 3021;
    TASK_COPY = 3022;
    TASK_LINT = 3023;
    TASK_FILE_VERIFICATION = 3026;
    TASK_EXTERNAL_NATIVE_BUILD_GENERATE_JSON_PROCESS_PER_ABI = 3027;
    TASK_EXTERNAL_NATIVE_BUILD_GENERATE_JSON_PROCESS = 3028;
    // Transform execution
    TASK_TRANSFORM_PREPARATION = 3024;
    TASK_TRANSFORM = 3025;
  }
  // Identifier for this span, created by sequentially allocating IDs to spans
  //  as they start. Used only for the parent-child relationship of spans, to
  //  show execution that is part of another span.
  //  Not stable or meaningful across builds.
  optional int64 id = 1;
  // For nested spans: the id for containing span.
  //  See GradleBuildProfileSpan.id.
  optional int64 parent_id = 2;
  // The start time of this event
  optional int64 start_time_in_ms = 3;
  // The duration of this event. May be zero.
  optional int64 duration_in_ms = 4;
  // The type of event recorded
  optional .android_studio.GradleBuildProfileSpan.ExecutionType type = 5;
  // More informations about the execution of TransformTasks.
  //  Only used when executionType is TASK_TRANSFORM_PREPARATION or
  //  TASK_TRANSFORM.
  optional .android_studio.GradleTransformExecution transform = 6;
  // More informations about the execution of Tasks.
  //  Only used when executionType is TASK_EXECUTION
  optional .android_studio.GradleTaskExecution task = 9;
  // Session id of the GradleBuildProject that this span is part of.
  //  The ID is not stable nor meaningful over multiple GradleBuildProfile.
  //  See GradleBuildProfile.id
  optional int64 project = 7;
  // Session id of the GradleBuildVariant that this span is part of.
  //  The ID is not stable nor meaningful over multiple GradleBuildProfile.
  //  See GradleBuildVariant.id
  optional int64 variant = 8;
}

message GradleTaskExecution {
  enum Type {
    UNKNOWN_TASK_TYPE = 0;
    AIDL_COMPILE = 1;
    ANDROID_JAR = 2;
    ANDROID_JAVA_COMPILE = 3;
    ANDROID_REPORT = 4;
    ANDROID_UNIT_TEST = 5;
    BUILD_EMULATOR = 6;
    BUILD_INFO_LOADER = 7;
    CHECK_MANIFEST = 8;
    COMPATIBLE_SCREENS_MANIFEST = 9;
    CREATE_MANIFEST_KEEP_LIST = 10;
    DATA_BINDING_EXPORT_BUILD_INFO = 11;
    DATA_BINDING_PROCESS_LAYOUTS = 12;
    DEPENDENCY_REPORT = 13;
    DEVICE_PROVIDER_INSTRUMENT_TEST = 14;
    EXTERNAL_BUILD_ANCHOR = 15;
    EXTERNAL_NATIVE_BUILD_JSON = 16;
    EXTERNAL_NATIVE_BUILD = 17;
    EXTRACT_ANNOTATIONS = 18;
    EXTRACT_JAVA_RESOURCES = 19;
    EXTRACT_PROGUARD_FILES = 20;
    FAST_DEPLOY_RUNTIME_EXTRACTOR = 21;
    FILTERED_JAR_COPY = 22;
    GENERATE_APK_DATA = 23;
    GENERATE_BUILD_CONFIG = 24;
    GENERATE_INSTANT_RUN_APP_INFO = 25;
    GENERATE_RES_VALUES = 26;
    GENERATE_SPLIT_ABI_RES = 27;
    GOOGLE_SERVICES = 28;
    INCREMENTAL_SAFEGUARD = 29;
    INSTALL_VARIANT = 30;
    INSTANT_RUN_SPLIT_APK_BUILDER = 31;
    INSTANT_RUN_WRAPPER = 32;
    INVOKE_MANIFEST_MERGER = 33;
    JACK_JACOCO_REPORT = 34;
    JACOCO_REPORT = 35;
    LINT = 36;
    LINT_COMPILE = 37;
    MERGE_FILE = 38;
    MERGE_MANIFESTS = 39;
    MERGE_RESOURCES = 40;
    MERGE_SOURCE_SET_FOLDERS = 41;
    MOCKABLE_ANDROID_JAR = 42;
    NDK_COMPILE = 43;
    NDK = 44;
    PACKAGE_APPLICATION = 45;
    PACKAGE_SPLIT_ABI = 46;
    PACKAGE_SPLIT_RES = 47;
    PRE_COLD_SWAP = 48;
    PREPARE_DEPENDENCIES = 49;
    PREPARE_LIBRARY = 50;
    PROCESS_ANDROID_RESOURCES = 51;
    PROCESS_MANIFEST = 52;
    PROCESS_TEST_MANIFEST = 53;
    RENDERSCRIPT_COMPILE = 54;
    SHADER_COMPILE = 55;
    SIGNING_REPORT = 56;
    SINGLE_FILE_COPY = 57;
    SOURCE_SETS = 58;
    SPLIT_ZIP_ALIGN = 59;
    STREAM_BASED = 60;
    STRIP_DEBUG_SYMBOL = 61;
    STRIP_DEPENDENCIES = 62;
    TEST_MODULE_PRO_GUARD = 63;
    TEST_SERVER = 64;
    TRANSFORM = 65;
    UNINSTALL = 66;
    VALIDATE_SIGNING = 67;
    ZIP_ALIGN = 68;
    JAVA_COMPILE = 69;
  }
  // The task implementing class.
  //  Custom tasks are recorded as UNKNOWN_TASK_TYPE.
  optional .android_studio.GradleTaskExecution.Type type = 1;
  // Whether the task did work (TaskState#getDidWork())
  //  This is not necessarily the inverse of up_to_date: see
  //  https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/TaskState.html#getDidWork()
  optional bool did_work = 2;
  // Whether the task was skipped (TaskState#getSkipped())
  optional bool skipped = 3;
  // Whether the task was up to date (TaskState#getUpToDate())
  optional bool up_to_date = 4;
  // Whether the task failed
  optional bool failed = 5;
}

message GradleTransformExecution {
  // The transform class.
  enum Type {
    UNKNOWN_TRANSFORM_TYPE = 0;
    DEX = 1;
    EXTRACT_JARS = 2;
    INSTANT_RUN_DEX = 3;
    INSTANT_RUN_SLICER = 4;
    INSTANT_RUN = 5;
    INSTANT_RUN_VERIFER = 6;
    JACK_PRE_DEX = 7;
    JACK = 8;
    JACOCO = 9;
    JAR_MERGING = 10;
    LIBRARY_JAR = 11;
    LIBRARY_JNI_LIBS = 12;
    MERGE_JAVA_RESOURCES = 13;
    MULTI_DEX = 14;
    NEW_SHRINKER = 15;
    NO_CHANGES_VERIFIER = 16;
    PRO_GUARD = 17;
    SHRINK_RESOURCES = 18;
  }
  // The transform implementing class.
  //  Custom transforms are recorded as UNKNOWN_TRANSFORM_TYPE.
  optional .android_studio.GradleTransformExecution.Type type = 1;
  // Whether the transform could be (in the case of TASK_TRANSFORM_PREPARATION)
  //  or was (in the case of TASK_TRANSFORM) incremental.
  optional bool is_incremental = 2;
}

message InstantRunStatus {
  enum BuildMode {
    UNKNOWN_BUILD_MODE = 0;
    HOT_WARM = 1;
    COLD = 2;
    FULL = 3;
  }
  enum PatchingPolicy {
    UNKNOWN_PATCHING_POLICY = 0;
    // No Cold swap is possible
    PRE_LOLLIPOP = 1;
    // Cold swap done by shipping dex classes to the Instant Run runtime
    MULTI_DEX = 2;
    // Cold swap done by reinstalling APK splits.
    MULTI_APK = 3;
  }
  enum VerifierStatus {
    UNKNOWN_VERIFIER_STATUS = 0;
    COMPATIBLE = 1;
    // the verifier did not run successfully.
    NOT_RUN = 2;
    // InstantRun disabled on element like a method, class or package.
    INSTANT_RUN_DISABLED = 3;
    // Any inability to run the verifier on a file will be tagged as such
    INSTANT_RUN_FAILURE = 4;
    // A new class was added.
    CLASS_ADDED = 5;
    // changes in the hierarchy
    PARENT_CLASS_CHANGED = 6;
    IMPLEMENTED_INTERFACES_CHANGE = 7;
    // class related changes.
    CLASS_ANNOTATION_CHANGE = 8;
    STATIC_INITIALIZER_CHANGE = 9;
    // changes in constructors,
    CONSTRUCTOR_SIGNATURE_CHANGE = 10;
    // changes in method
    METHOD_SIGNATURE_CHANGE = 11;
    METHOD_ANNOTATION_CHANGE = 12;
    METHOD_DELETED = 13;
    METHOD_ADDED = 14;
    // changes in fields.
    FIELD_ADDED = 15;
    FIELD_REMOVED = 16;
    // change of field type or kind (static | instance)
    FIELD_TYPE_CHANGE = 17;
    R_CLASS_CHANGE = 18;
    // reflection use
    REFLECTION_USED = 19;
    JAVA_RESOURCES_CHANGED = 20;
    DEPENDENCY_CHANGED = 21;
    MANIFEST_FILE_CHANGE = 22;
    // the binary manifest file changed, probably due to references to resources which ID changed
    //  since last build.
    BINARY_MANIFEST_FILE_CHANGE = 23;
    COLD_SWAP_REQUESTED = 24;
    FULL_BUILD_REQUESTED = 25;
    INITIAL_BUILD = 26;
    NO_CHANGES = 27;
    CHANGE_IN_SERIALIZABLE_CLASS_WITHOUT_VERSION_UID = 28;
  }
  // The type of artifacts built in this invocation.
  //  e.g. COLD for when the changes cannot be hot-swapped, either due to the
  //  app not running on the users device or the changes cannot be hot swapped.
  optional .android_studio.InstantRunStatus.BuildMode build_mode = 1;
  // The type of deploy that the build can generate artifacts for.
  optional .android_studio.InstantRunStatus.PatchingPolicy patching_policy = 2;
  // The result of the verifier run, whether the users change can be hot-swapped
  //  or requires a cold swap or full build is determined by the verifier.
  optional .android_studio.InstantRunStatus.VerifierStatus verifier_status = 3;
  // The built artifacts stored in the build info.
  //  Artifacts that were built, but superseeded (e.g. a main APK contains
  //  resources, so the resources do not need to be reported separately) are
  //  not included.
  repeated .android_studio.InstantRunArtifact artifact = 4;
}

message InstantRunArtifact {
  enum Type {
    // Main APK file for 19, and 21 platforms when using
    //  PatchingPolicy.MULTI_DEX.
    MAIN = 1;
    // Main APK file when application is using PatchingPolicy.MULTI_DEX.
    SPLIT_MAIN = 2;
    // Reload dex file that can be used to patch application live.
    RELOAD_DEX = 3;
    // Restart.dex file that can be used for Dalvik to restart applications
    //  with minimum set of changes delivered.
    RESTART_DEX = 4;
    // Shard dex file that can be used to replace originally installed
    //  multi-dex shard.
    DEX = 5;
    // Pure split (code only) that can be installed individually on M+ devices.
    SPLIT = 6;
    // Resources: res.ap_ file
    RESOURCES = 7;
  }
  optional .android_studio.InstantRunArtifact.Type type = 1;
}

// Details about the LLDB Frontend process
message LLDBFrontendDetails {
  // the value returned when the LLDB Frontend process exited.
  optional int32 exit_code = 1;
}

// Error details from the Firebase Assistant.
message FirebaseErrorDetails {
  // The error message presented to the user upon Firebase errors.
  optional string error_message = 1;
}

// Details on the GPU Debugger tracing run
message GfxTracingDetails {
  // total time the trace took
  optional int64 total_time = 1;
  // class name of the UI command selected to affect the tracing.
  optional string command = 2;
  // Error message when tracing fails.
  optional string error_message = 3;
  // A path describing the kind of details from the trace. This is a mix
  //  of class names (of our code) and random ids generated for the trace.
  //  e.g. 'Capture(7c6e72eebe2e6d76751b0328971e7fb29ceed82b).Atoms[6307].' +
  //       'Resource<e1b2a028ce62a97b235172963ddee35f386c6940>.' +
  //       'Thumbnail<RGBA,100x100>.As<RGBA>'
  optional string trace_path = 4;
  // the image format of the gpu image being traced. e.g. 'image/png'
  optional string image_format = 5;
  // the width of the image being traced.
  optional int64 image_width = 6;
  // the height of the image being traced.
  optional int64 image_height = 7;
}

// Details of an invocation of the TestRecorder to generate tests.
message TestRecorderDetails {
  // The number of events in the test generated by the test recorder.
  optional int64 event_count = 1;
  // The number of assertions in the test generated by the test recorder.
  optional int64 assertion_count = 2;
}


