Atom: Add A2DP playback related atoms to StatsLog

* BluetoothA2dpPlaybackStateChanged:
  - Logged when A2DP playback state changed for individual devices
* BluetoothA2dpCodecConfigChanged
  - Logged when A2DP codec configuration changed for individual devices
* BluetoothA2dpCodecCapabilityChanged
  - Logged when A2DP codec capability changed for individual devices
* BluetoothActiveDeviceChanged
  - Logged when A2DP/HFP/HEARNING_AID active device changed
* BluetoothA2dpAudioOverrunReported
  - Logs when A2DP failed send encoded data to the remote device fast
    enough such that the transmit buffer queue is full and we have to
    drop data
* BluetoothA2dpAudioUnderrunReported
  - Logs when A2DP failed to read from PCM source
* BluetoothDeviceRssiReported
  - Logged when remote device's RSSI level is reported by the controller
* BluetoothDeviceFailedContactCounterReported
  - Logged when ACL transmit queue was flushed by the controller
  - This is normally disabled unless we set automatic flush timeout was
    set to a non-zero value
  - However, when this event is reported, the connection quality must
    be very bad
* BluetoothDeviceTxPowerLevelReported
  - Logged when transmit power level is reported for a particular
    connection

Bug: 112969790
Test: make, testdrive with statsd
Change-Id: I7deb85567630fae75be733df21b45f9c6bcf9e17
Merged-In: I7deb85567630fae75be733df21b45f9c6bcf9e17
(cherry picked from commit c27040aea7)
This commit is contained in:
Jack He
2019-01-09 20:54:41 -08:00
parent 598719d2be
commit 924f346b45
3 changed files with 306 additions and 0 deletions

View File

@@ -23,6 +23,7 @@ option java_outer_classname = "AtomsProto";
import "frameworks/base/cmds/statsd/src/atom_field_options.proto";
import "frameworks/base/core/proto/android/app/enums.proto";
import "frameworks/base/core/proto/android/app/job/enums.proto";
import "frameworks/base/core/proto/android/bluetooth/a2dp/enums.proto";
import "frameworks/base/core/proto/android/bluetooth/enums.proto";
import "frameworks/base/core/proto/android/bluetooth/hci/enums.proto";
import "frameworks/base/core/proto/android/bluetooth/hfp/enums.proto";
@@ -142,6 +143,15 @@ message Atom {
NfcHceTransactionOccurred nfc_hce_transaction_occurred = 139;
SeStateChanged se_state_changed = 140;
SeOmapiReported se_omapi_reported = 141;
BluetoothActiveDeviceChanged bluetooth_active_device_changed = 151;
BluetoothA2dpPlaybackStateChanged bluetooth_a2dp_playback_state_changed = 152;
BluetoothA2dpCodecConfigChanged bluetooth_a2dp_codec_config_changed = 153;
BluetoothA2dpCodecCapabilityChanged bluetooth_a2dp_codec_capability_changed = 154;
BluetoothA2dpAudioUnderrunReported bluetooth_a2dp_audio_underrun_reported = 155;
BluetoothA2dpAudioOverrunReported bluetooth_a2dp_audio_overrun_reported = 156;
BluetoothDeviceRssiReported bluetooth_device_rssi_reported = 157;
BluetoothDeviceFailedContactCounterReported bluetooth_device_failed_contact_counter_reported = 158;
BluetoothDeviceTxPowerLevelReported bluetooth_device_tx_power_level_reported = 159;
}
// Pulled events will start at field 10000.
@@ -1084,6 +1094,27 @@ message BluetoothScoConnectionStateChanged {
optional android.bluetooth.hfp.ScoCodec codec = 3;
}
/**
* Logged when active device of a profile changes
*
* Logged from:
* packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java
* packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetService.java
* packages/apps/Bluetooth/src/com/android/bluetooth/hearingaid/HearingAidService.java
*/
message BluetoothActiveDeviceChanged {
// The profile whose active device has changed. Eg. A2DP, HEADSET, HEARING_AID
// From android.bluetooth.BluetoothProfile
optional int32 bt_profile = 1;
// An identifier that can be used to match events for this new active device.
// Currently, this is a salted hash of the MAC address of this Bluetooth device.
// Salt: Randomly generated 256 bit value
// Hash algorithm: HMAC-SHA256
// Size: 32 byte
// Default: null or empty if there is no active device for this profile
optional bytes obfuscated_id = 2 [(android.os.statsd.log_mode) = MODE_BYTES];
}
// Logs when there is an event affecting Bluetooth device's link layer connection.
// - This event is triggered when there is a related HCI command or event
// - Users of this metrics can deduce Bluetooth device's connection state from these events
@@ -1167,6 +1198,245 @@ message BluetoothLinkLayerConnectionEvent {
optional android.bluetooth.hci.StatusEnum reason_code = 9;
}
/**
* Logs when there is a change in Bluetooth A2DP playback state
*
* Logged from:
* packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java
*/
message BluetoothA2dpPlaybackStateChanged {
// An identifier that can be used to match events for this device.
// Currently, this is a salted hash of the MAC address of this Bluetooth device.
// Salt: Randomly generated 256 bit value
// Hash algorithm: HMAC-SHA256
// Size: 32 byte
// Default: null or empty if the device identifier is not known
optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
// Current playback state
// Default: PLAYBACK_STATE_UNKNOWN
optional android.bluetooth.a2dp.PlaybackStateEnum playback_state = 2;
// Current audio coding mode
// Default: AUDIO_CODING_MODE_UNKNOWN
optional android.bluetooth.a2dp.AudioCodingModeEnum audio_coding_mode = 3;
}
/**
* Logs when there is a change in A2DP codec config for a particular remote device
*
* Logged from:
* frameworks/base/core/java/android/bluetooth/BluetoothCodecConfig.java
* packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java
*/
message BluetoothA2dpCodecConfigChanged {
// An identifier that can be used to match events for this device.
// Currently, this is a salted hash of the MAC address of this Bluetooth device.
// Salt: Randomly generated 256 bit value
// Hash algorithm: HMAC-SHA256
// Size: 32 byte
// Default: null or empty if the device identifier is not known
optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
// Type of codec as defined by various SOURCE_CODEC_TYPE_* constants in BluetoothCodecConfig
// Default SOURCE_CODEC_TYPE_INVALID
optional int32 codec_type = 2;
// Codec priroity, the higher the more preferred, -1 for disabled
// Default: CODEC_PRIORITY_DEFAULT
optional int32 codec_priority = 3;
// Sample rate in Hz as defined by various SAMPLE_RATE_* constants in BluetoothCodecConfig
// Default: SAMPLE_RATE_NONE
optional int32 sample_rate = 4;
// Bits per sample as defined by various BITS_PER_SAMPLE_* constants in BluetoothCodecConfig
// Default: BITS_PER_SAMPLE_NONE
optional int32 bits_per_sample = 5;
// Channel mode as defined by various CHANNEL_MODE_* constants in BluetoothCodecConfig
// Default: CHANNEL_MODE_NONE
optional int32 channel_mode = 6;
// Codec specific values
// Default 0
optional int64 codec_specific_1 = 7;
optional int64 codec_specific_2 = 8;
optional int64 codec_specific_3 = 9;
optional int64 codec_specific_4 = 10;
}
/**
* Logs when there is a change in selectable A2DP codec capability for a paricular remote device
* Each codec's capability is logged separately due to statsd restriction
*
* Logged from:
* frameworks/base/core/java/android/bluetooth/BluetoothCodecConfig.java
* packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java
*/
message BluetoothA2dpCodecCapabilityChanged {
// An identifier that can be used to match events for this device.
// Currently, this is a salted hash of the MAC address of this Bluetooth device.
// Salt: Randomly generated 256 bit value
// Hash algorithm: HMAC-SHA256
// Size: 32 byte
// Default: null or empty if the device identifier is not known
optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
// Type of codec as defined by various SOURCE_CODEC_TYPE_* constants in BluetoothCodecConfig
// Default SOURCE_CODEC_TYPE_INVALID
optional int32 codec_type = 2;
// Codec priroity, the higher the more preferred, -1 for disabled
// Default: CODEC_PRIORITY_DEFAULT
optional int32 codec_priority = 3;
// A bit field of supported sample rates as defined by various SAMPLE_RATE_* constants
// in BluetoothCodecConfig
// Default: empty and SAMPLE_RATE_NONE for individual item
optional int32 sample_rate = 4;
// A bit field of supported bits per sample as defined by various BITS_PER_SAMPLE_* constants
// in BluetoothCodecConfig
// Default: empty and BITS_PER_SAMPLE_NONE for individual item
optional int32 bits_per_sample = 5;
// A bit field of supported channel mode as defined by various CHANNEL_MODE_* constants in
// BluetoothCodecConfig
// Default: empty and CHANNEL_MODE_NONE for individual item
optional int32 channel_mode = 6;
// Codec specific values
// Default 0
optional int64 codec_specific_1 = 7;
optional int64 codec_specific_2 = 8;
optional int64 codec_specific_3 = 9;
optional int64 codec_specific_4 = 10;
}
/**
* Logs when A2DP failed to read from PCM source.
* This typically happens when audio HAL cannot supply A2DP with data fast enough for encoding.
*
* Logged from:
* system/bt
*/
message BluetoothA2dpAudioUnderrunReported {
// An identifier that can be used to match events for this device.
// Currently, this is a salted hash of the MAC address of this Bluetooth device.
// Salt: Randomly generated 256 bit value
// Hash algorithm: HMAC-SHA256
// Size: 32 byte
// Default: null or empty if the device identifier is not known
optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
// Encoding interval in nanoseconds
// Default: 0
optional int64 encoding_interval_nanos = 2;
// Number of bytes of PCM data that could not be read from the source
// Default: 0
optional int32 num_missing_pcm_bytes = 3;
}
/**
* Logs when A2DP failed send encoded data to the remote device fast enough such that the transmit
* buffer queue is full and we have to drop data
*
* Logged from:
* system/bt
*/
message BluetoothA2dpAudioOverrunReported {
// An identifier that can be used to match events for this device.
// Currently, this is a salted hash of the MAC address of this Bluetooth device.
// Salt: Randomly generated 256 bit value
// Hash algorithm: HMAC-SHA256
// Size: 32 byte
// Default: null or empty if the device identifier is not known
optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
// Encoding interval in nanoseconds
// Default: 0
optional int64 encoding_interval_nanos = 2;
// Number of buffers dropped in this event
// Each buffer is encoded in one encoding interval and consists of multiple encoded frames
// Default: 0
optional int32 num_dropped_buffers = 3;
// Number of encoded buffers dropped in this event
// Default 0
optional int32 num_dropped_encoded_frames = 4;
// Number of encoded bytes dropped in this event
// Default: 0
optional int32 num_dropped_encoded_bytes = 5;
}
/**
* Logs when we receive reports regarding a device's RSSI value
*
* Logged from:
* system/bt
*/
message BluetoothDeviceRssiReported {
// An identifier that can be used to match events for this device.
// Currently, this is a salted hash of the MAC address of this Bluetooth device.
// Salt: Randomly generated 256 bit value
// Hash algorithm: HMAC-SHA256
// Size: 32 byte
// Default: null or empty if the device identifier is not known
optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
// Connection handle of this connection if available
// Range: 0x0000 - 0x0EFF (12 bits)
// Default: 0xFFFF if the handle is unknown
optional int32 connection_handle = 2;
// HCI command status code if this is triggerred by hci_cmd
// Default: STATUS_UNKNOWN
optional android.bluetooth.hci.StatusEnum hci_status = 3;
// BR/EDR
// Range: -128 ≤ N ≤ 127 (signed integer)
// Units: dB
// LE:
// Range: -127 to 20, 127 (signed integer)
// Units: dBm
// Invalid when an out of range value is reported
optional int32 rssi = 4;
}
/**
* Logs when we receive reports regarding how many consecutive failed contacts for a connection
*
* Logged from:
* system/bt
*/
message BluetoothDeviceFailedContactCounterReported {
// An identifier that can be used to match events for this device.
// Currently, this is a salted hash of the MAC address of this Bluetooth device.
// Salt: Randomly generated 256 bit value
// Hash algorithm: HMAC-SHA256
// Size: 32 byte
// Default: null or empty if the device identifier is not known
optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
// Connection handle of this connection if available
// Range: 0x0000 - 0x0EFF (12 bits)
// Default: 0xFFFF if the handle is unknown
optional int32 connection_handle = 2;
// HCI command status code if this is triggerred by hci_cmd
// Default: STATUS_UNKNOWN
optional android.bluetooth.hci.StatusEnum cmd_status = 3;
// Number of consecutive failed contacts for a connection corresponding to the Handle
// Range: uint16_t, 0-0xFFFF
// Default: 0xFFFFF
optional int32 failed_contact_counter = 4;
}
/**
* Logs when we receive reports regarding the tranmit power level used for a specific connection
*
* Logged from:
* system/bt
*/
message BluetoothDeviceTxPowerLevelReported {
// An identifier that can be used to match events for this device.
// Currently, this is a salted hash of the MAC address of this Bluetooth device.
// Salt: Randomly generated 256 bit value
// Hash algorithm: HMAC-SHA256
// Size: 32 byte
// Default: null or empty if the device identifier is not known
optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
// Connection handle of this connection if available
// Range: 0x0000 - 0x0EFF (12 bits)
// Default: 0xFFFF if the handle is unknown
optional int32 connection_handle = 2;
// HCI command status code if this is triggerred by hci_cmd
// Default: STATUS_UNKNOWN
optional android.bluetooth.hci.StatusEnum hci_status = 3;
// Range: -30 ≤ N ≤ 20
// Units: dBm
// Invalid when an out of range value is reported
optional int32 transmit_power_level = 4;
}
/**
* Logs when something is plugged into or removed from the USB-C connector.

View File

@@ -21,6 +21,7 @@ cc_library_static {
type: "lite",
},
srcs: [
"android/bluetooth/a2dp/enums.proto",
"android/bluetooth/enums.proto",
"android/bluetooth/hci/enums.proto",
],

View File

@@ -0,0 +1,35 @@
/*
* Copyright 2018 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";
package android.bluetooth.a2dp;
option java_outer_classname = "BluetoothA2dpProtoEnums";
option java_multiple_files = true;
// A2dp playback state enum, defined from:
// frameworks/base/core/java/android/bluetooth/BluetoothA2dp.java
enum PlaybackStateEnum {
PLAYBACK_STATE_UNKNOWN = 0;
PLAYBACK_STATE_PLAYING = 10;
PLAYBACK_STATE_NOT_PLAYING = 11;
}
enum AudioCodingModeEnum {
AUDIO_CODING_MODE_UNKNOWN = 0;
AUDIO_CODING_MODE_HARDWARE = 1;
AUDIO_CODING_MODE_SOFTWARE = 2;
}