A133安卓10 蓝牙SIGABRT SIGSEGV bad_function_call tombstone等奔溃问题解决

发布时间:2026/6/28 4:30:18

A133安卓10 蓝牙SIGABRT SIGSEGV bad_function_call tombstone等奔溃问题解决 蓝牙SIGABRT SIGSEGV bad_function_call tombstone等奔溃问题解决diff --git a/android/hardware/interfaces/bluetooth/1.0/default/bluetooth_hci.cc b/android/hardware/interfaces/bluetooth/1.0/default/bluetooth_hci.ccindex e14e3d7..94bfda0 100644--- a/android/hardware/interfaces/bluetooth/1.0/default/bluetooth_hci.cc+++ b/android/hardware/interfaces/bluetooth/1.0/default/bluetooth_hci.cc@@ -1,145 +1,154 @@-//-// Copyright 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.-//--#define LOG_TAG "android.hardware.bluetooth@1.0-impl"-#include "bluetooth_hci.h"--#include log/log.h--#include "vendor_interface.h"--namespace android {-namespace hardware {-namespace bluetooth {-namespace V1_0 {-namespace implementation {--static const uint8_t HCI_DATA_TYPE_COMMAND = 1;-static const uint8_t HCI_DATA_TYPE_ACL = 2;-static const uint8_t HCI_DATA_TYPE_SCO = 3;--class BluetoothDeathRecipient : public hidl_death_recipient {- public:- BluetoothDeathRecipient(const spIBluetoothHci hci) : mHci(hci) {}-- virtual void serviceDied(- uint64_t /*cookie*/,- const wp::android::hidl::base::V1_0::IBase /*who*/) {- ALOGE("BluetoothDeathRecipient::serviceDied - Bluetooth service died");- has_died_ = true;- mHci-close();- }- spIBluetoothHci mHci;- bool getHasDied() const { return has_died_; }- void setHasDied(bool has_died) { has_died_ = has_died; }-- private:- bool has_died_;-};--BluetoothHci::BluetoothHci()- : death_recipient_(new BluetoothDeathRecipient(this)) {}--Returnvoid BluetoothHci::initialize(- const ::android::spIBluetoothHciCallbacks cb) {- ALOGI("BluetoothHci::initialize()");- if (cb == nullptr) {- ALOGE("cb == nullptr! - Unable to call initializationComplete(ERR)");- return Void();- }-- death_recipient_-setHasDied(false);- cb-linkToDeath(death_recipient_, 0);-- bool rc = VendorInterface::Initialize(- [cb](bool status) {- auto hidl_status = cb-initializationComplete(- status ? Status::SUCCESS : Status::INITIALIZATION_ERROR);- if (!hidl_status.isOk()) {- ALOGE("VendorInterface - Unable to call initializationComplete()");- }- },- [cb](const hidl_vecuint8_t packet) {- auto hidl_status = cb-hciEventReceived(packet);- if (!hidl_status.isOk()) {- ALOGE("VendorInterface - Unable to call hciEventReceived()");- }- },- [cb](const hidl_vecuint8_t packet) {- auto hidl_status = cb-aclDataReceived(packet);- if (!hidl_status.isOk()) {- ALOGE("VendorInterface - Unable to call aclDataReceived()");- }- },- [cb](const hidl_vecuint8_t packet) {- auto hidl_status = cb-scoDataReceived(packet);- if (!hidl_status.isOk()) {- ALOGE("VendorInterface - Unable to call scoDataReceived()");- }- });- if (!rc) {- auto hidl_status = cb-initializationComplete(Status::INITIALIZATION_ERROR);- if (!hidl_status.isOk()) {- ALOGE("VendorInterface - Unable to call initializationComplete(ERR)");- }- }-- unlink_cb_ = [cb](spBluetoothDeathRecipient death_recipient) {- if (death_recipient-getHasDied())- ALOGI("Skipping unlink call, service died.");- else- cb-unlinkToDeath(death_recipient);- };-- return Void();-}--Returnvoid BluetoothHci::close() {- ALOGI("BluetoothHci::close()");- unlink_cb_(death_recipient_);- VendorInterface::Shutdown();- return Void();-}--Returnvoid BluetoothHci::sendHciCommand(const hidl_vecuint8_t command) {- sendDataToController(HCI_DATA_TYPE_COMMAND, command);- return Void();-}--Returnvoid BluetoothHci::sendAclData(const hidl_vecuint8_t data) {- sendDataToController(HCI_DATA_TYPE_ACL, data);- return Void();-}--Returnvoid BluetoothHci::sendScoData(const hidl_vecuint8_t data) {- sendDataToController(HCI_DATA_TYPE_SCO, data);- return Void();-}--void BluetoothHci::sendDataToController(const uint8_t type,- const hidl_vecuint8_t data) {- VendorInterface::get()-Send(type, data.data(), data.size());-}--IBluetoothHci* HIDL_FETCH_IBluetoothHci(const char* /* name */) {- return new BluetoothHci();-}--} // namespace implementation-} // namespace V1_0-} // namespace bluetooth-} // namespace hardware-} // namespace android+//+// Copyright 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.+//++#define LOG_TAG "android.hardware.bluetooth@1.0-impl"+#include "bluetooth_hci.h"++#include log/log.h+#include unistd.h++#include "vendor_interface.h"++namespace android {+namespace hardware {+namespace bluetooth {+namespace V1_0 {+namespace implementation {++static const uint8_t HCI_DATA_TYPE_COMMAND = 1;+static const uint8_t HCI_DATA_TYPE_ACL = 2;+static const uint8_t HCI_DATA_TYPE_SCO = 3;++class BluetoothDeathRecipient : public hidl_death_recipient {+ public:+ BluetoothDeathRecipient(const spIBluetoothHci hci) : mHci(hci) {}++ virtual void serviceDied(+ uint64_t /*cookie*/,+ const wp::android::hidl::base::V1_0::IBase /*who*/) {+ ALOGE("BluetoothDeathRecipient::serviceDied - Bluetooth service died");+ has_died_ = true;+ mHci-close();+ // Keep HAL process alive - new com.android.bluetooth will call+ // initialize() which is protected by g_vendor_mutex.+ // This avoids SIGSEGV race during HAL process restart window.+ ALOGI("serviceDied: cleanup done, HAL process staying alive for re-init");+ }+ spIBluetoothHci mHci;+ bool getHasDied() const { return has_died_; }+ void setHasDied(bool has_died) { has_died_ = has_died; }++ private:+ bool has_died_;+};++BluetoothHci::BluetoothHci()+ : death_recipient_(new BluetoothDeathRecipient(this)) {}++Returnvoid BluetoothHci::initialize(+ const ::android::spIBluetoothHciCallbacks cb) {+ ALOGI("BluetoothHci::initialize()");+ if (cb == nullptr) {+ ALOGE("cb == nullptr! - Unable to call initializationComplete(ERR)");+ return Void();+ }++ death_recipient_-setHasDied(false);+ cb-linkToDeath(death_recipient_, 0);++ bool rc = VendorInterface::Initialize(+ [cb](bool status) {+ auto hidl_status = cb-initializationComplete(+ status ? Status::SUCCESS : Status::INITIALIZATION_ERROR);+ if (!hidl_status.isOk()) {+ ALOGE("VendorInterface - Unable to call initializationComplete()");+ }+ },+ [cb](const hidl_vecuint8_t packet) {+ auto hidl_status = cb-hciEventReceived(packet);+ if (!hidl_status.isOk()) {+ ALOGE("VendorInterface - Unable to call hciEventReceived()");+ }+ },+ [cb](const hidl_vecuint8_t packet) {+ auto hidl_status = cb-aclDataReceived(packet);+ if (!hidl_status.isOk()) {+ ALOGE("VendorInterface - Unable to call aclDataReceived()");+ }+ },+ [cb](const hidl_vecuint8_t packet) {+ auto hidl_status = cb-scoDataReceived(packet);+ if (!hidl_status.isOk()) {+ ALOGE("VendorInterface - Unable to call scoDataReceived()");+ }+ });+ if (!rc) {+ auto hidl_status = cb-initializationComplete(Status::INITIALIZATION_ERROR);+ if (!hidl_status.isOk()) {+ ALOGE("VendorInterface - Unable to call initializationComplete(ERR)");+ }+ }++ unlink_cb_ = [cb](spBluetoothDeathRecipient death_recipient) {+ if (death_recipient-getHasDied())+ ALOGI("Skipping unlink call, service died.");+ else+ cb-unlinkToDeath(death_recipient);+ };++ return Void();+}++Returnvoid BluetoothHci::close() {+ ALOGI("BluetoothHci::close()");+ if (unlink_cb_) {+ unlink_cb_(death_recipient_);+ } else {+ ALOGW("unlink_cb_ is null, initialize() may not have completed");+ }+ VendorInterface::Shutdown();+ return Void();+}++Returnvoid BluetoothHci::sendHciCommand(const hidl_vecuint8_t command) {+ sendDataToController(HCI_DATA_TYPE_COMMAND, command);+ return Void();+}++Returnvoid BluetoothHci::sendAclData(const hidl_vecuint8_t data) {+ sendDataToController(HCI_DATA_TYPE_ACL, data);+ return Void();+}++Returnvoid BluetoothHci::sendScoData(const hidl_vecuint8_t data) {+ sendDataToController(HCI_DATA_TYPE_SCO, data);+ return Void();+}++void BluetoothHci::sendDataToController(const uint8_t type,+ const hidl_vecuint8_t data) {+ VendorInterface::get()-Send(type, data.data(), data.size());+}++IBluetoothHci* HIDL_FETCH_IBluetoothHci(const char* /* name */) {+ return new BluetoothHci();+}++} // namespace implementation+} // namespace V1_0+} // namespace bluetooth+} // namespace hardware+} // namespace androiddiff --git a/android/hardware/interfaces/bluetooth/1.0/default/vendor_interface.cc b/android/hardware/interfaces/bluetooth/1.0/default/vendor_interface.ccindex 97bc286..cc48001 100644--- a/android/hardware/interfaces/bluetooth/1.0/default/vendor_interface.cc+++ b/android/hardware/interfaces/bluetooth/1.0/default/vendor_interface.cc@@ -1,397 +1,400 @@-//-// Copyright 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.-//--#include "vendor_interface.h"--#define LOG_TAG "android.hardware.bluetooth@1.0-impl"-#include cutils/properties.h-#include utils/Log.h--#include dlfcn.h-#include fcntl.h--#include "bluetooth_address.h"-#include "h4_protocol.h"-#include "mct_protocol.h"--static const char* VENDOR_LIBRARY_NAME = "libbt-vendor.so";-static const char* VENDOR_LIBRARY_SYMBOL_NAME =- "BLUETOOTH_VENDOR_LIB_INTERFACE";--static const int INVALID_FD = -1;--namespace {--using android::hardware::hidl_vec;-using android::hardware::bluetooth::V1_0::implementation::VendorInterface;--struct {- tINT_CMD_CBACK cb;- uint16_t opcode;-} internal_command;--// True when LPM is not enabled yet or wake is not asserted.-bool lpm_wake_deasserted;-uint32_t lpm_timeout_ms;-bool recent_activity_flag;--VendorInterface* g_vendor_interface = nullptr;-std::mutex wakeup_mutex_;--HC_BT_HDR* WrapPacketAndCopy(uint16_t event, const hidl_vecuint8_t data) {- size_t packet_size = data.size() + sizeof(HC_BT_HDR);- HC_BT_HDR* packet = reinterpret_castHC_BT_HDR*(new uint8_t[packet_size]);- packet-offset = 0;- packet-len = data.size();- packet-layer_specific = 0;- packet-event = event;- // TODO(eisenbach): Avoid copy here; if BT_HDR-data can be ensured to- // be the only way the data is accessed, a pointer could be passed here...- memcpy(packet-data, data.data(), data.size());- return packet;-}--bool internal_command_event_match(const hidl_vecuint8_t packet) {- uint8_t event_code = packet[0];- if (event_code != HCI_COMMAND_COMPLETE_EVENT) {- ALOGE("%s: Unhandled event type %02X", __func__, event_code);- return false;- }-- size_t opcode_offset = HCI_EVENT_PREAMBLE_SIZE + 1; // Skip num packets.-- uint16_t opcode = packet[opcode_offset] | (packet[opcode_offset + 1] 8);-- ALOGV("%s internal_command.opcode = %04X opcode = %04x", __func__,- internal_command.opcode, opcode);- return opcode == internal_command.opcode;-}--uint8_t transmit_cb(uint16_t opcode, void* buffer, tINT_CMD_CBACK callback) {- ALOGV("%s opcode: 0x%04x, ptr: %p, cb: %p", __func__, opcode, buffer,- callback);- internal_command.cb = callback;- internal_command.opcode = opcode;- uint8_t type = HCI_PACKET_TYPE_COMMAND;- HC_BT_HDR* bt_hdr = reinterpret_castHC_BT_HDR*(buffer);- VendorInterface::get()-Send(type, bt_hdr-data, bt_hdr-len);- delete[] reinterpret_castuint8_t*(buffer);- return true;-}--void firmware_config_cb(bt_vendor_op_result_t result) {- ALOGV("%s result: %d", __func__, result);- VendorInterface::get()-OnFirmwareConfigured(result);-}--void sco_config_cb(bt_vendor_op_result_t result) {- ALOGD("%s result: %d", __func__, result);-}--void low_power_mode_cb(bt_vendor_op_result_t result) {- ALOGD("%s result: %d", __func__, result);-}--void sco_audiostate_cb(bt_vendor_op_result_t result) {- ALOGD("%s result: %d", __func__, result);-}--void* buffer_alloc_cb(int size) {- void* p = new uint8_t[size];- ALOGV("%s pts: %p, size: %d", __func__, p, size);- return p;-}--void buffer_free_cb(void* buffer) {- ALOGV("%s ptr: %p", __func__, buffer);- delete[] reinterpret_castuint8_t*(buffer);-}--void epilog_cb(bt_vendor_op_result_t result) {- ALOGD("%s result: %d", __func__, result);-}--void a2dp_offload_cb(bt_vendor_op_result_t result, bt_vendor_opcode_t op,- uint8_t av_handle) {- ALOGD("%s result: %d, op: %d, handle: %d", __func__, result, op, av_handle);-}--const bt_vendor_callbacks_t lib_callbacks = {- sizeof(lib_callbacks), firmware_config_cb, sco_config_cb,- low_power_mode_cb, sco_audiostate_cb, buffer_alloc_cb,- buffer_free_cb, transmit_cb, epilog_cb,- a2dp_offload_cb};--} // namespace--namespace android {-namespace hardware {-namespace bluetooth {-namespace V1_0 {-namespace implementation {--class FirmwareStartupTimer {- public:- FirmwareStartupTimer() : start_time_(std::chrono::steady_clock::now()) {}-- ~FirmwareStartupTimer() {- std::chrono::durationdouble duration =- std::chrono::steady_clock::now() - start_time_;- double s = duration.count();- if (s == 0) return;- ALOGI("Firmware configured in %.3fs", s);- }-- private:- std::chrono::steady_clock::time_point start_time_;-};--bool VendorInterface::Initialize(- InitializeCompleteCallback initialize_complete_cb,- PacketReadCallback event_cb, PacketReadCallback acl_cb,- PacketReadCallback sco_cb) {- if (g_vendor_interface) {- ALOGE("%s: No previous Shutdown()? Force cleanup and re-initialize.", __func__);- // 强制清理上一次残留的 VendorInterface- g_vendor_interface-Close();- delete g_vendor_interface;- g_vendor_interface = nullptr;-- }- g_vendor_interface = new VendorInterface();- return g_vendor_interface-Open(initialize_complete_cb, event_cb, acl_cb,- sco_cb);-}--void VendorInterface::Shutdown() {- if (!g_vendor_interface) {- ALOGW("%s: No Vendor interface, skip shutdown", __func__);- return;- }- g_vendor_interface-Close();- delete g_vendor_interface;- g_vendor_interface = nullptr;-}--VendorInterface* VendorInterface::get() { return g_vendor_interface; }--bool VendorInterface::Open(InitializeCompleteCallback initialize_complete_cb,- PacketReadCallback event_cb,- PacketReadCallback acl_cb,- PacketReadCallback sco_cb) {- initialize_complete_cb_ = initialize_complete_cb;-- // Initialize vendor interface-- lib_handle_ = dlopen(VENDOR_LIBRARY_NAME, RTLD_NOW);- if (!lib_handle_) {- ALOGE("%s unable to open %s (%s)", __func__, VENDOR_LIBRARY_NAME,- dlerror());- return false;- }-- lib_interface_ = reinterpret_castbt_vendor_interface_t*(- dlsym(lib_handle_, VENDOR_LIBRARY_SYMBOL_NAME));- if (!lib_interface_) {- ALOGE("%s unable to find symbol %s in %s (%s)", __func__,- VENDOR_LIBRARY_SYMBOL_NAME, VENDOR_LIBRARY_NAME, dlerror());- return false;- }-- // Get the local BD address-- uint8_t local_bda[BluetoothAddress::kBytes];- if (!BluetoothAddress::get_local_address(local_bda)) {- LOG_ALWAYS_FATAL("%s: No Bluetooth Address!", __func__);- }- int status = lib_interface_-init(lib_callbacks, (unsigned char*)local_bda);- if (status) {- ALOGE("%s unable to initialize vendor library: %d", __func__, status);- return false;- }-- ALOGD("%s vendor library loaded", __func__);-- // Power on the controller-- int power_state = BT_VND_PWR_ON;- lib_interface_-op(BT_VND_OP_POWER_CTRL, power_state);-- // Get the UART socket(s)-- int fd_list[CH_MAX] = {0};- int fd_count = lib_interface_-op(BT_VND_OP_USERIAL_OPEN, fd_list);-- if (fd_count 1 || fd_count CH_MAX - 1) {- ALOGE("%s: fd_count %d is invalid!", __func__, fd_count);- return false;- }-- for (int i = 0; i fd_count; i++) {- if (fd_list[i] == INVALID_FD) {- ALOGE("%s: fd %d is invalid!", __func__, fd_list[i]);- return false;- }- }-- event_cb_ = event_cb;- PacketReadCallback intercept_events = [this](const hidl_vecuint8_t event) {- HandleIncomingEvent(event);- };-- if (fd_count == 1) {- hci::H4Protocol* h4_hci =- new hci::

相关新闻