Android 蓝牙默认名称设置分析总结
Android 蓝牙默认名称设置分析总结
文章目录
- Android 蓝牙默认名称设置分析总结
- 一、前言
- 二、蓝牙默认名称设置实现分析和实现
- 1、查看蓝牙默认名称和什么属性相关
- 所以第一种修改蓝牙默认名称的方法诞生了:修改ro.product.model 属性值
- 2、Settings值中是否有蓝牙名称相关的属性呢?
- 3、应用层动态修改(需特定权限)
- 方法 1:使用Java代码设置
- 4、下面是AI智能搜到的一个开机设置蓝牙属性的demo代码
- 1. 创建广播接收器监听开机完成
- 2. 在 AndroidManifest.xml 中注册接收器
- 3. 添加必要权限
- 5、系统应用判断第一次打开蓝牙的时候设置默认名称
- 上面这个是第二种修改蓝牙默认名称的方法:打开蓝牙时后台设置一次蓝牙名称;
- 6、设置默认蓝牙prop属性值
- 第三种方法修改蓝牙默认属性的方法就是设置 bluetooth.device.default_name 属性值;
- 第四种修改蓝牙默认的让人就是修改底层的 btif_get_default_local_name()的返回值。
- 7、蓝牙上层服务代码中设置蓝牙默认名称
- 三、其他
- 1、修改蓝牙默认名称小结
- 2、蓝牙未开启的情况设置蓝牙一些配置为啥是无效分析
- 3、 Settings.secure.bluetooth_name 的设置代码位置
- 4、蓝牙保存在底层的配置数据文件bt_config.conf
- 5、Android14 蓝牙 BluetoothService 启动和相关代码介绍
- 6、Android 蓝牙相关广播介绍
- PS: 当你把目光聚焦山顶,山脚的琐碎便无法绊住你前行的脚步
一、前言
在 Android 系统中,蓝牙设备的默认名称通常与设备品牌、型号或用户设置的设备名称相关。
其实修改蓝牙默认名称并没有那么简单,好像没有见到明显的prop属性和setting属性。
如果修改源码里面的设备名称或者设备型号同步蓝牙名称是不理想的,最好是能单独修改蓝牙的名称;
网上查询到的错误示例:
1、修改默认res属性:
frameworks/base/packages/SettingsProvider/res/values/defaults.xml <!-- 添加自定义蓝牙默认名称 -->
<string name="def_bluetooth_name" translatable="false">MyCustomBTName</string>
整个源码找不到 def_bluetooth_name 关键字2、修改Settings属性:Settings.Global.DEVICE_NAME 、 Settings.Global.BLUETOOTH_NAME
修改这个也没用。3、修改prop属性:
ro.bluetooth.default_name=MyCustomBTName
整个源码找不到 ro.bluetooth.default_name 关键字
上面的三种方法,是AI智能搜索的答案,可能对于非常旧的版本会有用;
但是在Android13或者更新的版本系统源码中上面那样适配是完全没有用的。
通过一系列研究发现:系统的蓝牙名称不仅和prop属性有关,还和Settings属性有关;
本文介绍几种设置蓝牙默认名称的方法,涵盖属性修改、系统源码修改和应用层方案。
本文是基于Android13 的源码进行分析讲解的;
有兴趣都可以收藏看看,下面讲解的很多涉及到的知识是目前无法网上无法查询到的内容。
二、蓝牙默认名称设置实现分析和实现
1、查看蓝牙默认名称和什么属性相关
我这里的rk和aml系统都是和系统型号一样的,如下图所示:
打开设置的蓝牙后,查看蓝牙名称就是WA2B
运行环境中查看和型号属性相关:
console:/ #
console:/ # getprop | grep mode
[ro.product.model]: [WA2B] //通过验证测试发现是这个属性和默认蓝牙相关
[ro.product.odm.model]: [rk3588_t]
[ro.product.odm_dlkm.model]: [rk3588_t]
...
[ro.soc.model]: [RK3588]
console:/ #
实际项目你也可以尝试grep name 或者grep 蓝牙名称查看是否有相关属性。
所以第一种修改蓝牙默认名称的方法诞生了:修改ro.product.model 属性值
在 build.prop
或者XXX.mk或系统属性中修改蓝牙名称配置:
# 文件路径:build/make/core/sysprop.mkPRODUCT_PROPERTY_OVERRIDES += \ro.product.model=MyCustomBTName
不同方案的代码定义 定义 ro.product.XXX 可能不同。
需要注意的是ro.XXX属性只能设置一次,
如果某个.mk或者.prop文件如果已经声明过这个属性,另外在其他文件重复声明就会编译报错。
2、Settings值中是否有蓝牙名称相关的属性呢?
settings list global | grep bluetooth
settings list secure | grep bluetooth
settings list system | grep bluetooth
通过在运行环境中执行名称找到了一个:
console:/ # settings list secure | grep bluetooth
bluetooth_address=22:22:4E:7C:0E:00
bluetooth_name=TestBt_MODEL //这个就是蓝牙的名称
console:/ #
说明Settings.Secure.bluetooth_name 是和蓝牙名称相关的。
但是通过验证测试发现这个属性,是一个只能看的属性,重新设置了并不会修改蓝牙设备名称:
console:/ # settings get secure bluetooth_name //系统第一次开机,未打开蓝牙前蓝牙属性名称:null
null
console:/ # //打开蓝牙后蓝牙属性名称:
console:/ # settings get secure bluetooth_name
TestBt_MODEL
console:/ #
console:/ #settings put secure bluetooth_name TestBt
console:/ #
console:/ # settings get secure bluetooth_name //当场查询是保存成功的,但是搜索的蓝牙名称未修改
TestBt
console:/ #
console:/ # settings get secure bluetooth_name //关开蓝牙后,查询查询蓝牙名称还是之前的型号名称
TestBt_MODEL
console:/ #
Settings.Secure.bluetooth_name 属性的说明题:
(1)Settings.Secure.bluetooth_name 属性只是用来记录蓝牙名称的,并不是决定蓝牙名称的关键属性;
(2)应该是系统打开蓝牙的时候更新了 Settings.Secure.bluetooth_name 属性的值;
(3)通过蓝牙设置界面,修改蓝牙名称,这个属性值也是会改变的;
(4)所以这个settings值在蓝牙打开过的情况,用来查看蓝牙名称是OK的;
(5)如果想通过这个属性值控制蓝牙名称是不可行的。
3、应用层动态修改(需特定权限)
蓝牙名称可以通过 api:BluetoothAdapter.setName(“BtName”);
方法 1:使用Java代码设置
使用反射(需要 root 权限),在应用中通过反射调用隐藏 API 修改蓝牙名称:
public void setBluetoothName(String name) {try {BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();Method setNameMethod = BluetoothAdapter.class.getMethod("setName", String.class);setNameMethod.invoke(adapter, name);} catch (Exception e) {e.printStackTrace();}
}
系统签名应用:
public void setBluetoothName(String name) {BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();adapter.setName(name);
}
4、下面是AI智能搜到的一个开机设置蓝牙属性的demo代码
开发一个系统应用,在开机时设置蓝牙名称:
1. 创建广播接收器监听开机完成
public class BootCompletedReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {// 设置蓝牙名称BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();if (adapter != null) {adapter.setName("MyCustomBTName");}}}
}
2. 在 AndroidManifest.xml 中注册接收器
<receiverandroid:name=".BootCompletedReceiver"android:enabled="true"android:exported="false"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /></intent-filter>
</receiver>
3. 添加必要权限
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
上面代码看起来没啥问题,实际上不可行;
因为BluetoothAdapter.setName 方法在没有打开蓝牙的情况是无法设置蓝牙名称的;
具体原因可以看BluetoothAdapter.java 的代码实现。
那么如果开机广播不可行,还有什么办法吗?
其实是可以的,判断第一次打开蓝牙就行;
我之前没研究透系统蓝牙prop属性和系统蓝牙默认值的底层逻辑,也是通过Java代码实现过这个功能!
5、系统应用判断第一次打开蓝牙的时候设置默认名称
主要代码如下:
private final BroadcastReceiver mEthernetReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {final String action = intent.getAction();DebugLog.info("action = " + action);if (action == null) {DebugLog.error("action == null!");return;}case Intent.ACTION_BOOT_COMPLETED: //开机...break;case BluetoothAdapter.ACTION_STATE_CHANGED: //蓝牙开启、关闭状态监听int bleState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);//off->10,oning->11,on->12DebugLog.info("bleState = " + bleState);if (bleState == BluetoothAdapter.STATE_ON) {//蓝牙名称修改String bluetoothName = bluetoothAdapter.getName();DebugLog.info("bluetoothName = " + bluetoothName);boolean isFirstOpen = SystemProperties.getBoolean("persist.skg.is_first_open_bluetooth", true);if(bluetoothName != null && isFirstOpen) {bluetoothAdapter.setName("TestBt");SystemProperties.set("persist.skg.is_first_open_bluetooth", "false");}}break;}}};
上面的代码因为添加了prop属性标记只在开启蓝牙第一次修改一次,后续就不管了;
看起来没啥问题,但是后面测试发现了一个小问题:
Settings在重置选项中选中“重置蓝牙和WLAN”进行重置,蓝牙名称被重置成设备型号名称;
因为这个蓝牙重置后,蓝牙之前设置的名称就无效了;
那咋搞?
可以研究下“重置蓝牙和WLAN”进行重置 是否有相关广播或者特殊事件,
如果有的话,重新执行上面那个修改蓝牙名称的方法就行了。
上面这个是第二种修改蓝牙默认名称的方法:打开蓝牙时后台设置一次蓝牙名称;
那么还有其他方法设置蓝牙默认名称吗?
可以从最基本的api往下追系统代码实现!
bluetoothAdapter.getName() 只要打开蓝牙,就可以获取到蓝牙值;
那么未设置过蓝牙名称时,系统是如何确定蓝牙的默认值?
这里就详细介绍源码追溯过程了,直接公布答案:c文件中有定义蓝牙默认名称的逻辑。
6、设置默认蓝牙prop属性值
c代码中具体定义蓝牙prop属性的位置:
package/modules/Bluetooth/system/btif/src/btif_dm.cc
#define PROPERTY_CLASS_OF_DEVICE "bluetooth.device.class_of_device" //蓝牙class类型
#define PROPERTY_DEFAULT_DEVICE_NAME "bluetooth.device.default_name" //蓝牙默认名称
#define PROPERTY_PRODUCT_MODEL "ro.product.model" //产品型号,系统固定
可以看到 btif_dm.cc 文件有定义 产品型号的属性值和蓝牙默认名称的属性值;
具体逻辑稍后讲解,大致逻辑是:
(1)先判断 bluetooth.device.default_name 属性是是否存在;
(2)如果存在prop:bluetooth.device.default_name 蓝牙默认名称就是它了;
(3)如果不存在prop:bluetooth.device.default_name 蓝牙默认名称就是ro.product.model 的值。
第三种方法修改蓝牙默认属性的方法就是设置 bluetooth.device.default_name 属性值;
通过测试验证 bluetooth.device.default_name 属性确实可以决定蓝牙的默认名称。
测试过程:
(1)编译源码的情况,把 bluetooth.device.default_name 属性值加入某个mk定义;
运行环境中通过,getprop bluetooth.device.default_name 可以查询到属性值的情况,
打开蓝牙,查看蓝牙默认名称是一致的;(2)不编译源码的情况,第一次开机的时候,
先不开启蓝牙,先手动设置 bluetooth.device.default_name 属性
然后打开蓝牙,发现蓝牙的默认名称是设prop属性一致的;
值得注意的是 bluetooth.device.default_name 不是记忆的;
如果不是通过mk编译定义到系统,需要每次开机开启蓝牙前都要设置这个prop属性才行;
比如通过比较早启动的Java系统服务代码也是可以实现这个属性的设置。
这个 default_name 属性只有未修改过蓝牙名称会生效,修改过一次蓝牙名称就没啥影响作用了。
上面这个是设置蓝牙相关属性设置了蓝牙默认名称,并且是底层相关代码;
值得注意的是Android11或者更低版本的系统代码是没有这个属性定义的;
并且底层相关逻辑的文件也会有发声变化;
旧版本很多wifi、蓝牙在framework或者system的逻辑代码在Android13后都移植到了package/moudles/Wifi、Bluetooth下面;
这种情况只能查看默认蓝牙名称获取的实现代码进行适配修改了;
下面简单看看底层属性相关代码逻辑;
package/modules/Bluetooth/system/btif/src/btif_dm.cc
#define PROPERTY_CLASS_OF_DEVICE "bluetooth.device.class_of_device" //蓝牙class类型
#define PROPERTY_DEFAULT_DEVICE_NAME "bluetooth.device.default_name" //蓝牙默认名称
#define PROPERTY_PRODUCT_MODEL "ro.product.model" //产品型号,系统固定//底层获取并返回蓝牙默认名称的关键代码
static const char* btif_get_default_local_name() {if (btif_default_local_name[0] == '\0') {int max_len = sizeof(btif_default_local_name) - 1;char prop_name[PROPERTY_VALUE_MAX];osi_property_get(PROPERTY_DEFAULT_DEVICE_NAME, prop_name, "");//(1)获取default_name属性值strncpy(btif_default_local_name, prop_name, max_len);// If no value was placed in the btif_default_local_name then use model nameif (btif_default_local_name[0] == '\0') { //(2)如果没有default_name属性值char prop_model[PROPERTY_VALUE_MAX];osi_property_get(PROPERTY_PRODUCT_MODEL, prop_model, ""); //(3)获取model属性值strncpy(btif_default_local_name, prop_model, max_len); //(4)设置model属性值为蓝牙默认名称值}btif_default_local_name[max_len] = '\0';}return btif_default_local_name; //返回蓝牙默认名称
}
上面就是底层返回蓝牙默认名称的主要逻辑代码可以看到:
(1)底层先是获取了bluetooth.device.default_name 属性的值
(2)如果有这个值就返回这个属性的值作为蓝牙的默认名称
(3)如果没有这个值就判断当前设备的型号值作为蓝牙的默认名称
如果是低版本的系统代码,即使没有这个蓝牙属性的关联也可以参考上面的代码添加默认属性进行适配;
所以想要设置蓝牙默认名称也可以修改底层的 btif_get_default_local_name()的返回值。
第四种修改蓝牙默认的让人就是修改底层的 btif_get_default_local_name()的返回值。
修改返回默认字符串的参考代码:
package/modules/Bluetooth/system/btif/src/btif_dm.cc
static const char* btif_get_default_local_name() {
...strncpy(btif_default_local_name, "BtCTest", 10);// 不管前面任何逻辑,最后只返回想要的字符串return btif_default_local_name;
}
上面设置蓝牙默认prop属性是目前最好的设置蓝牙默认名称的方式;
其次就是修改 btif_get_default_local_name()返回的值。
还有其他方式修改蓝牙的默认名称吗?
有,但是不推荐啊,比如在上层蓝牙服务打开蓝牙过程设置一次蓝牙的默认名称;
7、蓝牙上层服务代码中设置蓝牙默认名称
这种也是要添加设置一次的prop属性,确保不会产生后续影响。
蓝牙开启流程小结
1、应用端 --> BluetoothAdapter.enable();
2、BluetoothAdapter.java --> mManagerService.enable(mAttributionSource);
3、BluetoothManagerService.java --> doBind AdapterService
4、AdapterService.java --> enableNative();
5、com_android_bluetooth_btservice_AdapterService.cpp 执行对应的native方法
在 BluetoothManagerService 或者 AdapterService 的时候时机设置一次蓝牙默认名称。
三、其他
1、修改蓝牙默认名称小结
修改蓝牙默认名称为TestBt的主要方式:
(1)在某个mk设置系统默认属性
ro.product.model = TestBt //不建议,因为系统设备型号一般和设备关联
或者
bluetooth.device.default_name = TestBt //首选(2)系统源码修改
底层c修改:
btif_dm.cc找到蓝牙默认名称字符串返回的方法:btif_get_default_local_name(),返回 "TestBt"
上层Java修改:
AdapterProperties.java onCreate调用一次setName
AdapterService.java 调用一次setName(3)系统应用修改:蓝牙未开启前调用一次 BluetoothAdapter.setName("TestBt");
综合分析,首先考虑设置 bluetooth.device.default_name 属性的值设置蓝牙默认名称。
Settings.Secure.bluetooth_name 是和蓝牙名称相关的,
但是只是用来记录设备蓝牙名称的,并不是决定蓝牙名称的关键属性。
2、蓝牙未开启的情况设置蓝牙一些配置为啥是无效分析
其实就是代码逻辑里面首先判断蓝牙未打开的情况直接返回了导致。
package/modules/Bluetooth/framework/java/android/bluetooth/BluetoothAdapter.java
public final class BluetoothAdapter {private static final String TAG = "BluetoothAdapter";private static final String DESCRIPTOR = "android.bluetooth.BluetoothAdapter";private static final boolean DBG = true;private static final boolean VDBG = false;//设置蓝牙名称@RequiresLegacyBluetoothAdminPermission@RequiresBluetoothConnectPermission@RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)public boolean setName(String name) {if (getState() != STATE_ON) {return false;}...try {if (mService != null) {mService.setName(name, mAttributionSource, recv);}}return false;} //获取本机蓝牙名称public String getName() {try {return mManagerService.getName(mAttributionSource);} catch (RemoteException e) {Log.e(TAG, "", e);}return null;}//设置可发现和连接模式public int setScanMode(@ScanMode int mode) {if (getState() != STATE_ON) {return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED;}...return BluetoothStatusCodes.ERROR_UNKNOWN;}//获取可发现和连接模式public int getScanMode() {if (getState() != STATE_ON) {return SCAN_MODE_NONE;}...return SCAN_MODE_NONE;}}
所以有些蓝牙设置无效,虽然没有啥报错,但是算是无效数据吧;
解决方法是可以在设置前判断一下蓝牙是否打开状态。
3、 Settings.secure.bluetooth_name 的设置代码位置
Settings.secure.bluetooth_name 属性是蓝牙开启;蓝牙名称设置等代码位置设置了该属性值。
下面是主要相关代码逻辑:
packages\modules\Bluetooth\service\src\com\android\server\bluetooth\BluetoothManagerService.java
public class BluetoothManagerService extends IBluetoothManager.Stub {private static final String TAG = "BluetoothManagerService";private static final boolean DBG = true;//蓝牙服务,判断之前正常初始化过后,就获取Settings保存的蓝牙名称和蓝牙地址/*** Retrieve the Bluetooth Adapter's name and address and save it in* in the local cache*/private void loadStoredNameAndAddress() {if (DBG) {Log.d(TAG, "Loading stored name and address");}if (BluetoothProperties.isAdapterAddressValidationEnabled().orElse(false)&& Settings.Secure.getInt(mContentResolver,Settings.Secure.BLUETOOTH_ADDR_VALID, 0) == 0) {// if the valid flag is not set, don't load the address and nameif (DBG) {Log.d(TAG, "invalid bluetooth name and address stored");}return;}mName = BluetoothServerProxy.getInstance().settingsSecureGetString(mContentResolver, Settings.Secure.BLUETOOTH_NAME);mAddress = BluetoothServerProxy.getInstance().settingsSecureGetString(mContentResolver, Settings.Secure.BLUETOOTH_ADDRESS);if (DBG) {Log.d(TAG, "Stored bluetooth Name=" + mName + ",Address=" + mAddress);}}//设置蓝牙名称和蓝牙地址,设置蓝牙是否合法/*** Save the Bluetooth name and address in the persistent store.* Only non-null values will be saved.* @param name* @param address*/private void storeNameAndAddress(String name, String address) {if (name != null) {Settings.Secure.putString(mContentResolver, Settings.Secure.BLUETOOTH_NAME, name);mName = name;if (DBG) {Log.d(TAG, "Stored Bluetooth name: " + Settings.Secure.getString(mContentResolver,Settings.Secure.BLUETOOTH_NAME));}}if (address != null) {Settings.Secure.putString(mContentResolver, Settings.Secure.BLUETOOTH_ADDRESS, address);mAddress = address;if (DBG) {Log.d(TAG, "Stored Bluetoothaddress: " + Settings.Secure.getString(mContentResolver,Settings.Secure.BLUETOOTH_ADDRESS));}}if ((name != null) && (address != null)) {Settings.Secure.putInt(mContentResolver, Settings.Secure.BLUETOOTH_ADDR_VALID, 1);}}//监听蓝牙名称和mac地址变化的广播,更新本地存储private final BroadcastReceiver mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED.equals(action)) {String newName = intent.getStringExtra(BluetoothAdapter.EXTRA_LOCAL_NAME);if (DBG) {Log.d(TAG, "Bluetooth Adapter name changed to " + newName + " by "+ mContext.getPackageName());}if (newName != null) {storeNameAndAddress(newName, null);}} else if (BluetoothAdapter.ACTION_BLUETOOTH_ADDRESS_CHANGED.equals(action)) {String newAddress = intent.getStringExtra(BluetoothAdapter.EXTRA_BLUETOOTH_ADDRESS);if (newAddress != null) {if (DBG) {Log.d(TAG, "Bluetooth Adapter address changed to " + newAddress);}storeNameAndAddress(null, newAddress);} else {if (DBG) {Log.e(TAG, "No Bluetooth Adapter address parameter found");}}} else if (Intent.ACTION_SETTING_RESTORED.equals(action)) {//蓝牙开关状态的记录if (DBG) {Log.d(TAG,"ACTION_SETTING_RESTORED with BLUETOOTH_ON, prevValue=" + prevValue+ ", newValue=" + newValue);}} else if (BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED.equals(action)} else if (action.equals(Intent.ACTION_SHUTDOWN)) {Log.i(TAG, "Device is shutting down."); //软关机广播打印。。。}class BluetoothHandler extends Handler {...if (mBluetooth != null) { //IBluetooth 正常关联底层的情况,获取当前系统蓝牙名称和mac地址try {//存储Settings 的蓝牙默认名称和mac地址storeNameAndAddress(synchronousGetName(mContext.getAttributionSource()),synchronousGetAddress(mContext.getAttributionSource()));} catch (RemoteException | TimeoutException e) {Log.e(TAG, "Unable to grab names", e);}}}//获取蓝牙名称public String getName(AttributionSource attributionSource) {...try {if (mBluetooth != null) { //正常情况从底层获取蓝牙名称return synchronousGetName(attributionSource);}} catch (RemoteException | TimeoutException e) {Log.e(TAG, "getName(): Unable to retrieve name remotely. Returning cached name", e);} finally {mBluetoothLock.readLock().unlock();}return mName; //Settings Secury bluetooth_name,最后才决定获取Settings的蓝牙名称}}
BluetoothManagerService 蓝牙服务并没有对应的 BluetoothManager 暴露类,
BluetoothManagerService 对应的是BluetoothAdapter;
4、蓝牙保存在底层的配置数据文件bt_config.conf
蓝牙配置信息底层保存的文件位置:
data/misc/bluedroid/bt_config.conf
console:/ # cat data/misc/bluedroid/bt_config.conf
[Info]
FileSource = Empty
TimeCreated = 2025-06-12 18:45:00[Adapter]
Address = 22:22:45:b4:08:00
LE_LOCAL_KEY_IRK = fb6e3d636c36537b17eecc0c306d463d
LE_LOCAL_KEY_IR = 7214ef7184158bd8190b0ce87f5dd662
LE_LOCAL_KEY_DHK = 2220b57c6177ca3450178fb6064dfec6
LE_LOCAL_KEY_ER = fdc624a250825d281c7559ad6d019d4a
ScanMode = 2 //可见状态:0、1、2;0 是关闭,1是是不被搜索到,2是可搜索和连接
DiscoveryTimeout = 30000 //可见时间(秒),超过某个值(1000左右)好像就一直可见
Name = TestBt2223 //如果没有修改过这个字符串就没有这行数据[Metrics]
Salt256Bit = 6d41034cf3ac7e156ef9d2c209500f650c997e8faededa922588b5e05afb8796console:/ #
上面主要可以看到的主要信息:
第一次修改蓝牙配置的时间,蓝牙mac大致,蓝牙可见状态,蓝牙可见时间,蓝牙名称等。
有尝试过设置应用手动修改蓝牙名称后,然后编辑修改 bt_config.conf 文件去除 Name = XX;
重启设备后,打开蓝牙,发现蓝牙名称是设备的型号名称(未进行任何适配默认蓝牙名称代码的情况)。
所以说明这个蓝牙配置文件才是关键的蓝牙名称文件,这个文件也是蓝牙服务启动过程生成的。
下面是两个 bt_config.conf 文件读取比较相关的逻辑代码:
package/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/bluetoothKeystore/BluetoothKeystoreService.java
private static final String CONFIG_FILE_PATH = "/data/misc/bluedroid/bt_config.conf";private static final String CONFIG_BACKUP_PATH = "/data/misc/bluedroid/bt_config.bak";public void setEncryptKeyOrRemoveKey(String prefixString, String decryptedString)throws InterruptedException, IOException, NoSuchAlgorithmException {infoLog("setEncryptKeyOrRemoveKey: prefix: " + prefixString);if (prefixString == null || decryptedString == null) {return;}if (prefixString.equals(CONFIG_FILE_PREFIX)) {if (decryptedString.isEmpty()) {cleanupAll();} else if (decryptedString.equals(CONFIG_FILE_HASH)) {readHashFile(CONFIG_FILE_PATH, CONFIG_FILE_PREFIX);}return;}...}
packages/modules/Bluetooth/system/gd/os/android/parameter_provider.cc
std::string ParameterProvider::ConfigFilePath() {{std::lock_guard<std::mutex> lock(parameter_mutex);if (!config_file_path.empty()) {return config_file_path;}}return "/data/misc/bluedroid/bt_config.conf";
}
这里没有很仔细分析研究设备设置蓝牙名称前、后,蓝牙名称的读取过程,有兴趣的可以自己看看;
应该是和bt_config.conf 文件的数据比较相关的,比如里面的Name 是否存在。
5、Android14 蓝牙 BluetoothService 启动和相关代码介绍
蓝牙开关和使能开发主要用到:BluetoothService、BluetoothManagerService、BluetoothManager、BluetoothAdapter 这几个系统相关类。
某个蓝牙的配对、连接、断开 使用的是 BluetoothDevice 对象。
蓝牙开关状态不记忆或者打开异常就可以看看BluetoothManagerService的日志,
里面有打开关闭相关过程日志和时间点,这个对问题分析有一定的帮助。
详细介绍:
https://blog.csdn.net/wenzhi20102321/article/details/142264944
6、Android 蓝牙相关广播介绍
蓝牙app中的广播接收器onReceive 的蓝牙相关广播
蓝牙相关广播主要包括:蓝牙开关,蓝牙连接,蓝牙状态改变,蓝牙配对等等等等。
详细介绍:
https://blog.csdn.net/wenzhi20102321/article/details/134956116