一、问题背景:
sip对讲时,希望通过蓝牙耳机进行接听、挂断操作。部分型号耳机在多次点击挂断按键时,经常出现anr异常
1 对比微信,微信语音过程中,点击蓝牙耳机,手机音频通道会切换到扬声器,并未走挂断流程;
2 部分耳机连接蓝牙进行微信语音中,点击耳机后自动切换手机音频通道至扬声器后,再次呼入,无法正常切换到SCO。
二、抓取日志,分析原因
2.1 philips耳机,挂断不会出现anr,抓取日志分析
接听
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 12 connected...............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 2 Bluetooth SCO device connecting...............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 1 Bluetooth SCO device connected ...............
单次挂断
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10 Bluetooth audio device disconnected...............
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 12 connected...............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0 Bluetooth SCO device disconnected..........................
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 2 Bluetooth SCO device connecting.........................
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 1 Bluetooth SCO device connected.............
停留1-2秒
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10 Bluetooth audio device disconnected .............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0 Bluetooth SCO device disconnected
多次点击挂断测试1
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10 Bluetooth audio device disconnected...............
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 12 connected...............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0 Bluetooth SCO device disconnected..........................
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 2 Bluetooth SCO device connecting.........................
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10 Bluetooth audio device disconnected .............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 1 Bluetooth SCO device connected.............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0 Bluetooth SCO device disconnected
多次点击挂断测试2(与单次挂断表现一致)
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10 Bluetooth audio device disconnected...............
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 12 connected...............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0 Bluetooth SCO device disconnected..........................
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 2 Bluetooth SCO device connecting.........................
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 1 Bluetooth SCO device connected.............
停留1-2秒
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10 Bluetooth audio device disconnected .............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0 Bluetooth SCO device disconnected
2021-06-10 09:31:56.510 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10
停留2秒
2021-06-10 09:32:07.678 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 12
2021-06-10 09:32:07.679 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0
2021-06-10 09:32:07.679 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 2
停留0.5秒
2021-06-10 09:32:07.679 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10
2021-06-10 09:32:07.688 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 1
2021-06-10 09:32:08.374 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0
2.2 Avantree耳机多次按键不正常
2021-06-10 09:36:30.317 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10
停17秒导致未响应
2021-06-10 09:36:47.871 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 12
2021-06-10 09:36:47.877 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10
2021-06-10 09:36:47.882 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0
2021-06-10 09:36:47.968 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 2
2021-06-10 09:36:50.024 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 1
2021-06-10 09:36:50.071 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0
2.3通过抓取日志分析,原因应该出现在Bluetooth这个apk里,挂断操作后,它会再次监听蓝牙状态,直至再次连接或者超时。
三、解决方法:
主要修改以下文件(由于裁减了电话应用,需要屏蔽processDialCall的处理)
package\apps\Bluetooth\src\com\android\bluetooth\hfp\HeadsetStateMachine.java
---
.../bluetooth/hfp/HeadsetStateMachine.java | 37 +++++++++++++++----
1 file changed, 30 insertions(+), 7 deletions(-)
diff --git a/RK3399-JD4-Android7.1/packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetStateMachine.java b/RK3399-JD4-Android7.1/packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
index 7517bea4d1..5dc4df2f6c 100755
--- a/RK3399-JD4-Android7.1/packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
+++ b/RK3399-JD4-Android7.1/packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
@@ -361,7 +361,9 @@ final class HeadsetStateMachine extends StateMachine {
// sends back events consistently
Message m = obtainMessage(CONNECT_TIMEOUT);
m.obj = device;
- sendMessageDelayed(m, 30000);
+ //sendMessageDelayed(m, 30000);
+ sendMessageDelayed(m, 6000);
+ log("Howard sendMessageDelayed11 set 6000, old be: " + 30000);
break;
case DISCONNECT:
// ignore
@@ -766,7 +768,11 @@ final class HeadsetStateMachine extends StateMachine {
// responded to, correctly.
// we may enter Connected from Disconnected/Pending/AudioOn. listenForPhoneState
// internally handles multiple calls to start listen
- mPhoneState.listenForPhoneState(true);
+
+ log("Howard ,set false listen ,Enter Connected: " + getCurrentMessage().what +
+ ", size: " + mConnectedDevicesList.size());
+ //mPhoneState.listenForPhoneState(true);//old be this
+ mPhoneState.listenForPhoneState(false);//howard test
}
@Override
@@ -841,6 +847,7 @@ final class HeadsetStateMachine extends StateMachine {
Message m = obtainMessage(CONNECT_TIMEOUT);
m.obj = device;
sendMessageDelayed(m, 30000);
+ log("Howard sendMessageDelayed22: " + 30000);
}
break;
case DISCONNECT:
@@ -1277,6 +1289,7 @@ final class HeadsetStateMachine extends StateMachine {
Message m = obtainMessage(CONNECT_TIMEOUT);
m.obj = device;
sendMessageDelayed(m, 30000);
+ log("Howard sendMessageDelayed33: " + 30000);
}
break;
case CONNECT_TIMEOUT:
@@ -2626,16 +2639,20 @@ final class HeadsetStateMachine extends StateMachine {
}
private void processHangupCall(BluetoothDevice device) {
if(device == null) {
Log.w(TAG, "processHangupCall device is null");
return;
}
- Log.w(TAG, "===============》processHangupCall");
+ Log.w(TAG, "===============銆媝rocessHangupCall");
// Close the virtual call if active. Virtual call should be
// terminated for CHUP callback event
if (isVirtualCallInProgress()) {
terminateScoUsingVirtualVoiceCall();
- Log.w(TAG, "===============》processHangupCall,isVirtualCallInProgress");
+ Log.w(TAG, "===============銆媝rocessHangupCall,isVirtualCallInProgress");
} else {
if (mPhoneProxy != null) {
try {
@@ -2650,6 +2667,9 @@ final class HeadsetStateMachine extends StateMachine {
}
private void processDialCall(String number, BluetoothDevice device) {
+ //howard disable it for exception
+ if(true)
+ return;
if(device == null) {
Log.w(TAG, "processDialCall device is null");
return;
@@ -2973,8 +2993,8 @@ final class HeadsetStateMachine extends StateMachine {
"using IBluetoothHeadsetPhone proxy");
phoneNumber = "";
}
- clccResponseNative(1, 0, 0, 0, false, phoneNumber, type,
- getByteAddress(device));
+ clccResponseNative(1, 0, 0, 0, false, phoneNumber, type, getByteAddress(device));
+ Log.d(TAG, "Howard# CLCC CLCC 00");
clccResponseNative(0, 0, 0, 0, false, "", 0, getByteAddress(device));
}
else if (!mPhoneProxy.listCurrentCalls()) {
@@ -2987,7 +3007,10 @@ final class HeadsetStateMachine extends StateMachine {
+ device);
Message m = obtainMessage(CLCC_RSP_TIMEOUT);
m.obj = getMatchingDevice(device);
- sendMessageDelayed(m, CLCC_RSP_TIMEOUT_VALUE);
+ //howard disable
+ //sendMessageDelayed(m, CLCC_RSP_TIMEOUT_VALUE);
+ //howard added
+ clccResponseNative(0, 0, 0, 0, false, "", 0, getByteAddress(device));
}
} catch (RemoteException e) {
Log.e(TAG, Log.getStackTraceString(new Throwable()));
四、针对多次点击,会动切换手机音频通道至扬声器或后台播放音乐的问题, 需要屏蔽掉Music应用
diff --git a/RK3399-JD4-Android7.1/build/core/main.mk b/RK3399-JD4-Android7.1/build/core/main.mk
index b0207beec7..998d458776 100644
--- a/RK3399-JD4-Android7.1/build/core/main.mk
+++ b/RK3399-JD4-Android7.1/build/core/main.mk
@@ -760,6 +760,10 @@ ifdef FULL_BUILD
# For the rest we add both
product_MODULES += $(call get-32-bit-modules, $(modules_rest))
product_MODULES += $(modules_rest)
+#added by howard to del apk
+product_sub_MODULES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEL_PACKAGES)
+product_MODULES := $(filter-out $(product_sub_MODULES), $(product_MODULES))
+
$(call expand-required-modules,product_MODULES,$(product_MODULES))
diff --git a/RK3399-JD4-Android7.1/build/core/product.mk b/RK3399-JD4-Android7.1/build/core/product.mk
index 332b015fd8..e0661c6f45 100644
--- a/RK3399-JD4-Android7.1/build/core/product.mk
+++ b/RK3399-JD4-Android7.1/build/core/product.mk
@@ -124,6 +124,7 @@ _product_var_list := \
PRODUCT_SYSTEM_BASE_FS_PATH \
PRODUCT_VENDOR_BASE_FS_PATH \
PRODUCT_SHIPPING_API_LEVEL \
+ PRODUCT_DEL_PACKAGES \ #add by howard for del apk
diff --git a/RK3399-JD4-Android7.1/device/rockchip/rk3399/rk3399.mk b/RK3399-JD4-Android7.1/device/rockchip/rk3399/rk3399.mk
index d834ead870..eed66f8646 100755
--- a/RK3399-JD4-Android7.1/device/rockchip/rk3399/rk3399.mk
+++ b/RK3399-JD4-Android7.1/device/rockchip/rk3399/rk3399.mk
@@ -52,3 +52,7 @@ PRODUCT_PACKAGES += \
TelephonyProvider \
MmsService
+#howard added
+PRODUCT_DEL_PACKAGES += \
+ Music \
+