2014-02-26 63 views
9

我有一堆各種運行4.3/4.4的Android手機,它們似乎都受到藍牙中的一些錯誤的困擾。我上運行的應用程序僅僅是用於掃描周圍的其他藍牙設備使用此回調:http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.LeScanCallback.html執行LeScan時「藍牙共享已停止工作」

只是LogCatting的數據,並仍然有問題...

有誰知道這個bug,並有判明?我真的需要得到藍牙掃描穩定的截止日期,我明天的演示我的應用程序...

謝謝。

編輯:據說在4.4.3(或4.4.4)這已解決。 (當然,我們爲項目進行演示的日子......我們沒有好處)。主要問題是XML文件跟蹤mac地址超過2000的大小,然後崩潰...系統重置將清除xml文件,從而暫時解決問題。

+1

是的,Android平臺代碼的內部邏輯中存在未處理的情況,它假定它始終能夠分配遠程設備記錄,並且如果無法完全崩潰。嘗試簡單地切換飛行模式,因爲這可能會清除設備記錄(儘管電源循環不會)。否則,工廠重置肯定會。 –

+0

無論如何,直接進入Qualcomm驅動程序並編寫我們自己的實現,因爲Android平臺代碼不好?有人可能已經做到了這一點? – MasterGberry

+0

不,除非您能夠在設備上安裝自己的基於AOSP的版本(儘管如果您有root用戶,您可能會粗略清除記錄)。飛機模式是否暫時爲您清除? –

回答

21

這是Android藍牙代碼中的一個錯誤,目前似乎沒有解決方案。由於其他人也一直在尋找這一點,所以我會發布通過藍牙堆棧追蹤問題時發現的內容,即使它不能用作解決方案,除非有人準備對基於AOSP的系統進行重大更改安裝。

基本上,問題是在聽到太多獨特的BTLE硬件地址後,alloc_node()失敗時,在find_add_node()的btif_config.c中出現SIGSEGV。

棧跟蹤

D/BtGatt.btif(22509): btif_gattc_upstreams_evt: Event 4096 
D/BtGatt.btif(22509): btif_gattc_add_remote_bdaddr device added idx=1 
D/BtGatt.btif(22509): btif_gattc_update_properties BLE device name=beacon len=6 dev_type=2 
F/libc (22509): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 22530 (BTIF) 
I/DEBUG ( 171): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
I/DEBUG ( 171): Build fingerprint: 'google/occam/mako:4.4.2/KOT49H/937116:user/release-keys' 
I/DEBUG ( 171): Revision: '11' 
I/DEBUG ( 171): pid: 22509, tid: 22530, name: BTIF >>> com.android.bluetooth <<< 
I/DEBUG ( 171): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000 
I/DEBUG ( 171):  r0 ffffffff r1 00007d00 r2 00007c60 r3 74c7cf00 
I/DEBUG ( 171):  r4 74c7cf10 r5 00000000 r6 756f95a8 r7 7503c671 

I/DEBUG ( 171): backtrace: 
I/DEBUG ( 171):  #00 pc 0004e68c /system/lib/hw/bluetooth.default.so 
I/DEBUG ( 171):  #01 pc 0004ea65 /system/lib/hw/bluetooth.default.so (btif_config_set+156) 

拆卸的信息性部分,所討論的代碼是這個相當明顯有問題的一系列結算R5和然後企圖去參考它作爲一個基指針的:

 4e68a: 2500  movs r5, #0 
     4e68c: 6829  ldr r1, [r5, #0] 
     4e68e: b919  cbnz r1, 4e698 <btif_gattc_test_command_impl+0x74c> 
     4e690: 4630  mov r0, r6 
     4e692: f7dd ef78 blx 2c584 <[email protected]> 

這對應於find_add_node()的末尾處的「if(!node-> name)」檢查()

static cfg_node* find_add_node(cfg_node* p, const char* name) 
{ 
    int i = -1; 
    cfg_node* node = NULL; 
    if((i = find_inode(p, name)) < 0) 
    { 
     if(!(node = find_free_node(p))) 
     { 
      int old_size = alloc_node(p, CFG_GROW_SIZE); 
      if(old_size >= 0) 
      { 
       i = GET_NODE_COUNT(old_size); 
       node = &p->child[i]; 
       ADD_CHILD_COUNT(p, 1); 
      } /* else clause to handle failure of alloc_node() is missing here */ 
     } else ADD_CHILD_COUNT(p, 1); 
    } 
    else node = &p->child[i]; 
    if(!node->name) /* this will SIGSEGV if node is still NULL */ 
     node->name = strdup(name); 
    return node; 
} 

具體來說,沒有else子句來處理alloc_node()的失敗,所以當發生這種情況(大概是由於在聽到太多的設備地址之後用完存儲器)代碼將通過並嘗試取消引用節點指針沒有被設置爲非空地址。

一個修復大概需要涉及:當一個新的記錄不能被分配

  • 過去,當聽到地址更積極丟棄這個錯誤情況

    1. 非碰撞處理新的不斷收聽,並且存儲的記錄數量變得不合理

  • +1

    是否有針對此問題的Android問題?如果有鏈接的話,會很好。 – Ifor

    +0

    真棒找到,克里斯。我一直在我的頭上貼着牆,一個星期以來,花了幾個小時與TI藍牙嗅探器試圖找到原因。 – davidgyoung

    +0

    由於我的應用程序目前正在進行建議的修復2.希望至少現在可以將我從這種情況中解救出來。 – bob

    0

    這可能是一種罕見的原因,但是當我試圖在我的Galaxy Nexus上使用L音時出現此問題。我嘗試了各種解決方案,但沒有任何工作,然後我記得我安裝了一個啓用了藍牙LE的應用程序(通常在Galaxy Nexus 4.3上無法訪問)。一旦我卸載應用程序安裝的文件,它似乎工作正常。

    所以,如果事情還沒有正常工作......問問自己,如果你在手機上做了任何可能有衝突的習慣。

    0

    修正了我的S4(i9500): 在爲Android 5.1.1安裝定製ROM之後,我開始面對這個「藍牙已停止」問題。由於我的手機已經紮根,我安裝了「Root Uninstaller」應用程序和FROZE藍牙服務。那之後我沒有任何問題。但我不知道我的藍牙是否正常工作。這只是我沒有得到那些惱人的彈出窗口了。 希望這可以幫助別人!