1. acl_interface_t 介绍
acl_interface_t
结构体及其子结构体,目的是封装处理 Classic、LE、SCO 连接及链路事件的回调函数,用于 HCI 事件与上层蓝牙协议栈的解耦分发。
- system/main/shim/acl_legacy_interface.h
typedef struct {void (*on_connected)(const RawAddress& bda, uint16_t handle,uint8_t enc_mode);void (*on_failed)(const RawAddress& bda, tHCI_STATUS status);void (*on_disconnected)(tHCI_STATUS status, uint16_t handle,tHCI_STATUS reason);
} acl_classic_connection_interface_t;typedef struct {void (*on_connected)(const tBLE_BD_ADDR& address_with_type, uint16_t handle,tHCI_ROLE role, uint16_t conn_interval,uint16_t conn_latency, uint16_t conn_timeout,const RawAddress& local_rpa, const RawAddress& peer_rpa,tBLE_ADDR_TYPE peer_addr_type);void (*on_failed)(const tBLE_BD_ADDR& address_with_type, uint16_t handle,bool enhanced, tHCI_STATUS status);void (*on_disconnected)(tHCI_STATUS status, uint16_t handle,tHCI_STATUS reason);void (*on_iso_disconnected)(uint16_t handle, tHCI_STATUS reason);
} acl_le_connection_interface_t;typedef struct {void (*on_esco_connect_request)(const RawAddress&,const types::ClassOfDevice&);void (*on_sco_connect_request)(const RawAddress&,const types::ClassOfDevice&);void (*on_disconnected)(uint16_t handle, tHCI_REASON reason);
} acl_sco_connection_interface_t;typedef struct {void (*on_authentication_complete)(uint16_t handle, tHCI_STATUS status);void (*on_change_connection_link_key_complete)();void (*on_encryption_change)(bool enabled);void (*on_flow_specification_complete)(uint16_t flow_direction,uint16_t service_type,uint32_t token_rate,uint32_t token_bucket_size,uint32_t peak_bandwidth,uint32_t access_latency);void (*on_flush_occurred)();void (*on_central_link_key_complete)(uint8_t key_flag);void (*on_mode_change)(tHCI_STATUS status, uint16_t handle,tHCI_MODE current_mode, uint16_t interval);void (*on_sniff_subrating)(tHCI_STATUS status, uint16_t handle,uint16_t maximum_transmit_latency,uint16_t maximum_receive_latency,uint16_t minimum_remote_timeout,uint16_t minimum_local_timeout);void (*on_packet_type_changed)(uint16_t packet_type);void (*on_qos_setup_complete)(uint16_t service_type, uint32_t token_rate,uint32_t peak_bandwidth, uint32_t latency,uint32_t delay_variation);void (*on_read_afh_channel_map_complete)(uint8_t afh_mode,uint8_t afh_channel_map[]);void (*on_read_automatic_flush_timeout_complete)(uint16_t flush_timeout);void (*on_read_clock_complete)(uint32_t clock, uint16_t accuracy);void (*on_read_clock_offset_complete)(uint16_t clock_offset);void (*on_read_failed_contact_counter_complete)(uint16_t failed_contact_counter);void (*on_read_link_policy_settings_complete)(uint16_t link_policy_settings);void (*on_read_link_quality_complete)(uint8_t link_quality);void (*on_read_link_supervision_timeout_complete)(uint16_t link_supervision_timeout);void (*on_read_remote_supported_features_complete)(uint16_t handle,uint64_t features);void (*on_read_remote_extended_features_complete)(uint16_t handle,uint8_t current_page_number,uint8_t max_page_number,uint64_t features);void (*on_read_remote_version_information_complete)(tHCI_STATUS status, uint16_t handle, uint8_t lmp_version,uint16_t manufacturer_name, uint16_t sub_version);void (*on_read_rssi_complete)(uint8_t rssi);void (*on_read_transmit_power_level_complete)(uint8_t transmit_power_level);void (*on_role_change)(tHCI_STATUS status, const RawAddress& bd_addr,tHCI_ROLE new_role);void (*on_role_discovery_complete)(tHCI_ROLE current_role);
} acl_classic_link_interface_t;typedef struct {void (*on_connection_update)(tHCI_STATUS status, uint16_t handle,uint16_t connection_interval,uint16_t connection_latency,uint16_t supervision_timeout);void (*on_data_length_change)(uint16_t handle, uint16_t max_tx_octets,uint16_t max_tx_time, uint16_t max_rx_octets,uint16_t max_rx_time);void (*on_read_remote_version_information_complete)(tHCI_STATUS status, uint16_t handle, uint8_t lmp_version,uint16_t manufacturer_name, uint16_t sub_version);void (*on_phy_update)(tGATT_STATUS status, uint16_t handle, uint8_t tx_phy,uint8_t rx_phy);
} acl_le_link_interface_t;typedef struct {acl_classic_connection_interface_t classic;acl_le_connection_interface_t le;acl_sco_connection_interface_t sco;
} acl_connection_interface_t;typedef struct {acl_classic_link_interface_t classic;acl_le_link_interface_t le;
} acl_link_interface_t;typedef struct {void (*on_send_data_upwards)(BT_HDR*);void (*on_packets_completed)(uint16_t handle, uint16_t num_packets);acl_connection_interface_t connection;acl_link_interface_t link;
} acl_interface_t;
2. 总体结构图
acl_interface_t
├── void (*on_send_data_upwards)(BT_HDR*)
├── void (*on_packets_completed)(uint16_t handle, uint16_t num_packets)
├── acl_connection_interface_t connection
│ ├── acl_classic_connection_interface_t classic
│ ├── acl_le_connection_interface_t le
│ └── acl_sco_connection_interface_t sco
└── acl_link_interface_t link├── acl_classic_link_interface_t classic└── acl_le_link_interface_t le
3. 每个结构体及函数指针用途说明
1. acl_interface_t
typedef struct {void (*on_send_data_upwards)(BT_HDR*);void (*on_packets_completed)(uint16_t handle, uint16_t num_packets);acl_connection_interface_t connection;acl_link_interface_t link;
} acl_interface_t;
顶层接口,作为 shim 层对上提供的主入口,包含连接建立和链路管理的分发处理。
-
on_send_data_upwards
: 当有 ACL 数据包(BT_HDR
)需要上传到上层时调用,例如传递 L2CAP 数据。 -
on_packets_completed
: 通知上层,控制器完成多少包的发送(ACL 信道流控机制)。
2. acl_connection_interface_t
处理连接建立/断开的事件(包括 Classic、LE、SCO 三种类型)。
typedef struct {acl_classic_connection_interface_t classic;acl_le_connection_interface_t le;acl_sco_connection_interface_t sco;
} acl_connection_interface_t;
1.acl_classic_connection_interface_t
用于处理 Classic ACL 连接建立/失败/断开等事件。
typedef struct {void (*on_connected)(const RawAddress& bda, uint16_t handle,uint8_t enc_mode);void (*on_failed)(const RawAddress& bda, tHCI_STATUS status);void (*on_disconnected)(tHCI_STATUS status, uint16_t handle,tHCI_STATUS reason);
} acl_classic_connection_interface_t;
函数名 | 使用场景 |
---|---|
on_connected | 控制器报告 BR/EDR(Classic)连接成功时调用。 |
on_failed | Classic 连接失败(如超时、被拒)时调用。 |
on_disconnected | Classic ACL 断开时调用,带有断开原因。 |
2.acl_le_connection_interface_t
用于处理 BLE 连接建立/断开等事件。
typedef struct {void (*on_connected)(const tBLE_BD_ADDR& address_with_type, uint16_t handle,tHCI_ROLE role, uint16_t conn_interval,uint16_t conn_latency, uint16_t conn_timeout,const RawAddress& local_rpa, const RawAddress& peer_rpa,tBLE_ADDR_TYPE peer_addr_type);void (*on_failed)(const tBLE_BD_ADDR& address_with_type, uint16_t handle,bool enhanced, tHCI_STATUS status);void (*on_disconnected)(tHCI_STATUS status, uint16_t handle,tHCI_STATUS reason);void (*on_iso_disconnected)(uint16_t handle, tHCI_STATUS reason);
} acl_le_connection_interface_t;
函数名 | 使用场景 |
---|---|
on_connected | BLE 连接成功,包括 handle、间隔、latency 等参数。 |
on_failed | BLE 连接失败,包括是否 enhanced 和失败状态。 |
on_disconnected | BLE ACL 断开时调用。 |
on_iso_disconnected | LE-ISO(如 CIS/BIS)断开事件。 |
3.acl_sco_connection_interface_t
用于 SCO/eSCO 音频连接的请求和断开事件处理。
typedef struct {void (*on_esco_connect_request)(const RawAddress&,const types::ClassOfDevice&);void (*on_sco_connect_request)(const RawAddress&,const types::ClassOfDevice&);void (*on_disconnected)(uint16_t handle, tHCI_REASON reason);
} acl_sco_connection_interface_t;
函数名 | 使用场景 |
---|---|
on_sco_connect_request | 对方发起 SCO 音频连接请求。 |
on_esco_connect_request | 对方发起 eSCO 音频连接请求。 |
on_disconnected | SCO 音频通道断开时。 |
3. acl_link_interface_t
处理已经建立连接后的 链路状态管理与信息读取。
typedef struct {acl_classic_link_interface_t classic;acl_le_link_interface_t le;
} acl_link_interface_t;
1.acl_classic_link_interface_t
Classic BR/EDR 的链路层事件处理。
typedef struct {void (*on_authentication_complete)(uint16_t handle, tHCI_STATUS status);void (*on_change_connection_link_key_complete)();void (*on_encryption_change)(bool enabled);void (*on_flow_specification_complete)(uint16_t flow_direction,uint16_t service_type,uint32_t token_rate,uint32_t token_bucket_size,uint32_t peak_bandwidth,uint32_t access_latency);void (*on_flush_occurred)();void (*on_central_link_key_complete)(uint8_t key_flag);void (*on_mode_change)(tHCI_STATUS status, uint16_t handle,tHCI_MODE current_mode, uint16_t interval);void (*on_sniff_subrating)(tHCI_STATUS status, uint16_t handle,uint16_t maximum_transmit_latency,uint16_t maximum_receive_latency,uint16_t minimum_remote_timeout,uint16_t minimum_local_timeout);void (*on_packet_type_changed)(uint16_t packet_type);void (*on_qos_setup_complete)(uint16_t service_type, uint32_t token_rate,uint32_t peak_bandwidth, uint32_t latency,uint32_t delay_variation);void (*on_read_afh_channel_map_complete)(uint8_t afh_mode,uint8_t afh_channel_map[]);void (*on_read_automatic_flush_timeout_complete)(uint16_t flush_timeout);void (*on_read_clock_complete)(uint32_t clock, uint16_t accuracy);void (*on_read_clock_offset_complete)(uint16_t clock_offset);void (*on_read_failed_contact_counter_complete)(uint16_t failed_contact_counter);void (*on_read_link_policy_settings_complete)(uint16_t link_policy_settings);void (*on_read_link_quality_complete)(uint8_t link_quality);void (*on_read_link_supervision_timeout_complete)(uint16_t link_supervision_timeout);void (*on_read_remote_supported_features_complete)(uint16_t handle,uint64_t features);void (*on_read_remote_extended_features_complete)(uint16_t handle,uint8_t current_page_number,uint8_t max_page_number,uint64_t features);void (*on_read_remote_version_information_complete)(tHCI_STATUS status, uint16_t handle, uint8_t lmp_version,uint16_t manufacturer_name, uint16_t sub_version);void (*on_read_rssi_complete)(uint8_t rssi);void (*on_read_transmit_power_level_complete)(uint8_t transmit_power_level);void (*on_role_change)(tHCI_STATUS status, const RawAddress& bd_addr,tHCI_ROLE new_role);void (*on_role_discovery_complete)(tHCI_ROLE current_role);
} acl_classic_link_interface_t;
函数名 | 使用场景 |
---|---|
on_authentication_complete | 认证过程完成时。 |
on_change_connection_link_key_complete | 改变连接密钥完成时。 |
on_encryption_change | 加密状态改变。 |
on_flow_specification_complete | QoS flow 配置结果。 |
on_flush_occurred | 数据 flush 完成通知。 |
on_mode_change | sniff/hold 等模式变更。 |
on_sniff_subrating | Sniff 子速率设置结果。 |
on_read_rssi_complete | RSSI 读取完成。 |
on_read_link_quality_complete | Link quality 查询结果。 |
on_role_change | 主从角色切换事件。 |
注:许多函数与 HCI command complete 或 HCI event 对应,例如
HCI_READ_REMOTE_VERSION_INFORMATION
,HCI_READ_LINK_QUALITY
。
2.acl_le_link_interface_t
BLE 链路状态的事件回调。
typedef struct {void (*on_connection_update)(tHCI_STATUS status, uint16_t handle,uint16_t connection_interval,uint16_t connection_latency,uint16_t supervision_timeout);void (*on_data_length_change)(uint16_t handle, uint16_t max_tx_octets,uint16_t max_tx_time, uint16_t max_rx_octets,uint16_t max_rx_time);void (*on_read_remote_version_information_complete)(tHCI_STATUS status, uint16_t handle, uint8_t lmp_version,uint16_t manufacturer_name, uint16_t sub_version);void (*on_phy_update)(tGATT_STATUS status, uint16_t handle, uint8_t tx_phy,uint8_t rx_phy);
} acl_le_link_interface_t;
函数名 | 使用场景 |
---|---|
on_connection_update | 连接参数更新完成。 |
on_data_length_change | 数据包最大长度变化(DLE)。 |
on_read_remote_version_information_complete | 查询 BLE peer 版本信息。 |
on_phy_update | PHY 层更新结果(1M/2M/Coded)。 |
4.小结
模块 | 结构体 | 用途 |
---|---|---|
连接管理 | acl_classic_connection_interface_t | 处理 Classic 连接建立/失败/断开 |
连接管理 | acl_le_connection_interface_t | 处理 BLE 连接建立/失败/断开(含 ISO) |
连接管理 | acl_sco_connection_interface_t | 处理 SCO/eSCO 连接请求及断开 |
链路管理 | acl_classic_link_interface_t | Classic 链路状态变更及查询(如 role、RSSI) |
链路管理 | acl_le_link_interface_t | LE 链路参数更新、PHY 变更等 |
数据与流控 | on_send_data_upwards , on_packets_completed | 数据上传 & 发送完成反馈 |
- controller 层收到对应 HCI Event 或 Command Complete 后,会查找并调用对应回调函数,从而解耦事件分发。
4. GetAclInterface
如下是我们 协议栈里面的 对于 acl_interface_t 结构变量的赋值。
- system/main/shim/acl_legacy_interface.cc
const acl_interface_t GetAclInterface() {acl_interface_t acl_interface{.on_send_data_upwards = acl_rcv_acl_data,.on_packets_completed = acl_packets_completed,.connection.classic.on_connected = on_acl_br_edr_connected,.connection.classic.on_failed = on_acl_br_edr_failed,.connection.classic.on_disconnected = btm_acl_disconnected,.connection.le.on_connected =acl_ble_enhanced_connection_complete_from_shim,.connection.le.on_failed = acl_ble_connection_fail,.connection.le.on_disconnected = btm_acl_disconnected,.connection.le.on_iso_disconnected = btm_acl_iso_disconnected,.connection.sco.on_esco_connect_request = btm_sco_on_esco_connect_request,.connection.sco.on_sco_connect_request = btm_sco_on_sco_connect_request,.connection.sco.on_disconnected = btm_sco_on_disconnected,.link.classic.on_authentication_complete = btm_sec_auth_complete,.link.classic.on_central_link_key_complete = nullptr,.link.classic.on_change_connection_link_key_complete = nullptr,.link.classic.on_encryption_change = nullptr,.link.classic.on_flow_specification_complete = nullptr,.link.classic.on_flush_occurred = nullptr,.link.classic.on_mode_change = btm_pm_on_mode_change,.link.classic.on_packet_type_changed = nullptr,.link.classic.on_qos_setup_complete = nullptr,.link.classic.on_read_afh_channel_map_complete = nullptr,.link.classic.on_read_automatic_flush_timeout_complete = nullptr,.link.classic.on_sniff_subrating = btm_pm_on_sniff_subrating,.link.classic.on_read_clock_complete = nullptr,.link.classic.on_read_clock_offset_complete = nullptr,.link.classic.on_read_failed_contact_counter_complete = nullptr,.link.classic.on_read_link_policy_settings_complete = nullptr,.link.classic.on_read_link_quality_complete = nullptr,.link.classic.on_read_link_supervision_timeout_complete = nullptr,.link.classic.on_read_remote_version_information_complete =btm_read_remote_version_complete,.link.classic.on_read_remote_supported_features_complete =acl_process_supported_features,.link.classic.on_read_remote_extended_features_complete =acl_process_extended_features,.link.classic.on_read_rssi_complete = nullptr,.link.classic.on_read_transmit_power_level_complete = nullptr,.link.classic.on_role_change = btm_acl_role_changed,.link.classic.on_role_discovery_complete = nullptr,.link.le.on_connection_update = acl_ble_update_event_received,.link.le.on_data_length_change = acl_ble_data_length_change_event,.link.le.on_read_remote_version_information_complete =btm_read_remote_version_complete,.link.le.on_phy_update = gatt_notify_phy_updated,};return acl_interface;
}
1. 顶层接口函数回调
功能场景 | 回调字段名 | 回调函数名 | 说明 |
---|---|---|---|
上行传输 ACL 数据 | on_send_data_upwards | acl_rcv_acl_data | 将接收到的 ACL 数据包上传到上层(如 L2CAP) |
完成数据包发送通知 | on_packets_completed | acl_packets_completed | 通知上层某个 handle 的 N 个数据包发送完成 |
2. ACL Classic 连接事件回调(BR/EDR)
功能场景 | 回调字段名 | 回调函数名 | 说明 |
---|---|---|---|
Classic 连接成功 | connection.classic.on_connected | on_acl_br_edr_connected | 连接建立成功,回调 handle 和地址 |
Classic 连接失败 | connection.classic.on_failed | on_acl_br_edr_failed | 连接建立失败,回调失败原因 |
Classic 断开连接 | connection.classic.on_disconnected | btm_acl_disconnected | ACL 通道断开回调 |
3. ACL LE(BLE)连接事件回调
功能场景 | 回调字段名 | 回调函数名 | 说明 |
---|---|---|---|
BLE 连接成功 | connection.le.on_connected | acl_ble_enhanced_connection_complete_from_shim | 支持 enhanced connection |
BLE 连接失败 | connection.le.on_failed | acl_ble_connection_fail | 建立失败,如超时/被拒 |
BLE ACL 断开 | connection.le.on_disconnected | btm_acl_disconnected | 同 classic 共用断链回调 |
BLE ISO 通道断开 | connection.le.on_iso_disconnected | btm_acl_iso_disconnected | CIS/BIS 信道断开时调用 |
4. SCO/eSCO 音频连接回调
功能场景 | 回调字段名 | 回调函数名 | 说明 |
---|---|---|---|
对端请求建立 eSCO 音频 | connection.sco.on_esco_connect_request | btm_sco_on_esco_connect_request | 提示是否接受连接 |
对端请求建立 SCO 音频 | connection.sco.on_sco_connect_request | btm_sco_on_sco_connect_request | |
SCO 音频通道断开 | connection.sco.on_disconnected | btm_sco_on_disconnected |
5. Classic 链路管理事件回调
功能场景 | 回调字段名 | 回调函数名 | 说明 |
---|---|---|---|
身份认证完成 | link.classic.on_authentication_complete | btm_sec_auth_complete | 配对阶段身份认证完成 |
sniff 子速率事件 | link.classic.on_sniff_subrating | btm_pm_on_sniff_subrating | Sniff 模式节能配置回调 |
低功耗模式变更(sniff/hold/park) | link.classic.on_mode_change | btm_pm_on_mode_change | 模式变更事件,如进入 sniff |
远端版本信息读取完成 | link.classic.on_read_remote_version_information_complete | btm_read_remote_version_complete | |
远端 supported features 读取完成 | link.classic.on_read_remote_supported_features_complete | acl_process_supported_features | |
远端 extended features 读取完成 | link.classic.on_read_remote_extended_features_complete | acl_process_extended_features | |
主从角色变更完成 | link.classic.on_role_change | btm_acl_role_changed | 主动 role switch 或对方触发的结果 |
注:其它字段如
on_encryption_change
、on_qos_setup_complete
、on_read_rssi_complete
等设置为nullptr
,表示当前 shim 或协议栈没有用到。
6. LE 链路管理事件回调
功能场景 | 回调字段名 | 回调函数名 | 说明 |
---|---|---|---|
BLE 连接参数更新完成 | link.le.on_connection_update | acl_ble_update_event_received | 参数如 interval、latency 更新 |
BLE 数据长度扩展更新(DLE) | link.le.on_data_length_change | acl_ble_data_length_change_event | 控制器支持 DLE 时更新 TX/RX octet |
BLE PHY 层更新完成(如 1M -> 2M) | link.le.on_phy_update | gatt_notify_phy_updated | |
BLE 远程版本读取完成 | link.le.on_read_remote_version_information_complete | btm_read_remote_version_complete | 与 Classic 共用版本读取回调 |
7.小结
类别 | 事件场景 | 回调函数 |
---|---|---|
Classic ACL | 连接成功 | on_acl_br_edr_connected |
连接失败 | on_acl_br_edr_failed | |
断开连接 | btm_acl_disconnected | |
BLE ACL | 连接成功(enhanced) | acl_ble_enhanced_connection_complete_from_shim |
连接失败 | acl_ble_connection_fail | |
ACL/ISO 断开 | btm_acl_disconnected / btm_acl_iso_disconnected | |
SCO/eSCO | 对方请求连接 | btm_sco_on_esco_connect_request / btm_sco_on_sco_connect_request |
通道断开 | btm_sco_on_disconnected | |
链路管理 | 配对认证完成 | btm_sec_auth_complete |
模式变更 / sniff | btm_pm_on_mode_change / btm_pm_on_sniff_subrating | |
远程版本 & 特性读取 | btm_read_remote_version_complete 等 | |
BLE 链路更新/PHY更新 | acl_ble_update_event_received , gatt_notify_phy_updated |
5. 用处
我之所以单独将 acl_interface_t 整理出来:
- 它在 AOSP 蓝牙协议栈中起到了事件中转中心的作用,深入理解它对快速排查问题和梳理控制流非常有帮助。
序号 | 价值 | 说明 |
---|---|---|
1 | 快速定位 HCI 事件与上层响应逻辑 | 每个 HCI 事件(如连接成功/断开/参数更新)都会最终回调到这个结构体中某个函数指针,可据此快速查找处理函数。 |
2 | 统一视角区分 BLE / Classic / SCO 逻辑 | Classic、LE、SCO 各自的连接/链路处理逻辑都被封装在不同子结构体,阅读时可以按模块区分,避免混淆。 |
3 | 方便调试断点与日志定位 | 在调试工具(如 GDB 或 logcat)中设置断点/观察变量时,可以只看 acl_interface_t 的调用路径,即可捕获事件走向。 |
4 | 反查控制器事件源头与分发路径 | 从 HCI 层(如 hci_layer.cc )或 legacy shim 层(如 acl.cc )中,控制器接收的事件如何一步步调用到这些回调函数,可以一条线串起来排查问题来源。 |
1. 使用场景:快速排查问题指南
场景 1:Classic 蓝牙连接失败
-
你看到: 日志中出现连接失败错误,比如
status=0x04
。 -
排查路径:
→ HCI Connection Complete Event
→ shim layer 中 acl.cc 处理该事件
→ 调用 acl_interface.connection.classic.on_failed
→ 实际函数是:on_acl_br_edr_failed()
→ 查看这个函数内部是否有日志/状态错误处理
场景 2:BLE 连接建立失败或异常断链
-
你看到:
acl_ble_connection_fail()
被调用。 -
排查路径:
→ HCI LE Connection Complete Fail
→ 查找调用了 GetAclInterface().connection.le.on_failed 的地方
→ 实际是 shim/acl.cc 或 legacy_event_handler.cc 中触发
→ 根据 handle/peer 地址继续反查 L2CAP/GATT 层异常处理
场景 3:ACL 通道断开,无法上层感知
-
你看到:
btm_acl_disconnected()
被调用但应用未感知断开。 -
排查路径:
→ acl_interface.connection.classic/le.on_disconnected
→ btm_acl_disconnected
→ 通常继续调用 BTM 层状态管理
→ 最终触发 callbacks 到 framework 层(如 adapter 状态变化)
场景 4:LE 参数更新失败或没生效
-
你看到:
acl_ble_update_event_received()
日志异常。 -
排查路径:
→ HCI LE Connection Update Complete
→ 调用 acl_interface.link.le.on_connection_update
→ 函数内部检查 status / 更新 interval / latency 等
→ 如果没触发 GATT 层响应,说明下游未联动,可回溯处理路径
2.阅读代码时的实用技巧
技巧 | 示例 |
---|---|
使用结构体名搜索函数使用 | grep -r on_acl_br_edr_failed external/ |
使用 GetAclInterface() 作为断点入口 | 可在调试工具里打断点: b GetAclInterface 或设置观察点 |
追踪调用链 | 从 shim 层的 acl.cc 开始,查找事件如何分发给 acl_interface |
加日志定位回调触发点 | 在比如 acl_ble_enhanced_connection_complete_from_shim() 中加 log 看是否被调到 |
3.总结
总结项 | 内容 |
---|---|
设计目的 | acl_interface_t 是 shim 层对上暴露的统一回调注册接口 |
涵盖内容 | 连接相关(classic, le, sco)+ 链路管理(role、版本、phy、dle)+ 数据流控 |
阅读价值 | 快速从 HCI 层回溯事件到处理函数 / 快速跳转到逻辑异常的根源 |
故障排查 | 尤其适合处理连接建立失败、BLE 参数异常、断链无感、SCO 音频断开等问题 |