当前位置: 首页 > news >正文

Android14 蓝牙 BluetoothService 启动和相关代码介绍

Android14 蓝牙 BluetoothService 启动和相关代码

文章目录

  • Android14 蓝牙 BluetoothService 启动和相关代码
    • 一、前言
    • 二、代码分析介绍
      • 1、蓝牙 BluetoothService 启动和相关代码
        • (1)蓝牙服务相关的有几个类有:
        • (2)几个蓝牙类对象的关系
      • 2、几个蓝牙类对象的主要关联代码
        • (1)SystemServer.java
        • (2)BluetoothService.kt
        • (3)BluetoothManagerService.java
        • (4)BluetoothManager.java
        • (5)BluetoothAdapter.java
        • (6)应用获取 BluetoothManager 和 BluetoothAdapter 对象示例
    • 三、其他
      • 1、蓝牙配对和断开、连接的代码
      • 2、Android 蓝牙相关广播介绍
      • 3、Android无线蓝牙开发总结
        • 4、Android 蓝牙设备类型判断代码介绍
      • 5、蓝牙开关日志
        • (1)蓝牙开启
        • (2)蓝牙关闭日志
        • (3)开机前蓝牙开启的开机日志
        • (4)开机前蓝牙关闭的开机日志
  • 祝各位:中秋节日快乐。

一、前言

蓝牙开关和使能开发主要用到:BluetoothService、BluetoothManagerService、BluetoothManager、BluetoothAdapter 这几个系统相关类。
某个蓝牙的配对、连接、断开 使用的是 BluetoothDevice 对象。

蓝牙开关状态不记忆或者打开异常就可以看看BluetoothManagerService的日志,
里面有打开关闭相关过程日志和时间点,这个对问题分析有一定的帮助。

本文主要介绍一下 framework 相关的几个类,
对于蓝牙应用的开发和分析解决系统上层的需求和简单问题有一定的作用,有兴趣的可以收藏看看。

本文的代码和日志是基于Android14 的设备上的。

二、代码分析介绍

1、蓝牙 BluetoothService 启动和相关代码

(1)蓝牙服务相关的有几个类有:

BluetoothService、BluetoothManagerService、BluetoothManager、BluetoothAdapter
估计没几个人熟悉这个关系的,这里简单梳理一下。

(2)几个蓝牙类对象的关系

这里先公布一下简单关系:

1、BluetoothService 是上层蓝牙最开始的服务,是在SystemServer 拉起系统其他应用的时候拉起的2、BluetoothManagerService 是BluetoothService 创建的时候创建的服务服务对象
具体实现是在 BluetoothManagerService 里面3、BluetoothManager 是暴露的蓝牙Manager,但是这个Manager并不是绑定 BluetoothManagerService;
BluetoothManager 只有简单的几个暴露方法,里面就有获取BluetoothAdapter对象的方法 getAdapter()4、BluetoothAdapter 是才是操作蓝牙的主要功能暴露类
BluetoothAdapter的大部分实现都是调用到 BluetoothManagerService 里面的。

蓝牙实现的功能基本都是要System api,都是要系统应用正常才能调用到相关实现。
BluetoothManager 和 BluetoothAdapter 都是应用能正常获取到的对象。
所以看Settings那些系统应用都是直接获取和使用的 BluetoothAdapter 进行蓝牙开关,设置蓝牙名称,获取蓝牙状态等实现。

上面只是对这几个系统中蓝牙的控制类有一定的了解,想要更深入的了解还是要看看代码。

2、几个蓝牙类对象的主要关联代码

具体代码关联:

(1)SystemServer.java

framework\base\services\java\com\android\server\SystemServer.java

/*** Entry point to {@code system_server}.*/
public final class SystemServer implements Dumpable {private static final String TAG = "SystemServer";//蓝牙服务字符串定义private static final String BLUETOOTH_SERVICE_CLASS ="com.android.server.bluetooth.BluetoothService";//启动其他服务:蓝牙,手机网络、输入法等系统服务都是这里private void startOtherServices(@NonNull TimingsTraceAndSlog t) {t.traceBegin("startOtherServices");//启动蓝牙服务if (mFactoryTestMode == FactoryTest.FACTORY_TEST_LOW_LEVEL) {Slog.i(TAG, "No Bluetooth Service (factory test)");} else if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {Slog.i(TAG, "No Bluetooth Service (Bluetooth Hardware Not Present)");} else {  //底层hal 没问题才启动上层蓝牙服务t.traceBegin("StartBluetoothService");mSystemServiceManager.startServiceFromJar(BLUETOOTH_SERVICE_CLASS,BLUETOOTH_APEX_SERVICE_JAR_PATH);t.traceEnd();}。。。}}

SystemServer.java 这个类系统开发的都比较熟悉了,可以拉起各种上层服务的类,执行相应的初始化;
如果是定义的服务类要比较早拉起来,可以加入到这里。

(2)BluetoothService.kt

package\modules\Bluetooth\service\src\com\android\server\bluetooth\BluetoothService.kt

class BluetoothService(context: Context) : SystemService(context) {private val mBluetoothManagerService = BluetoothManagerService(context)private var mInitialized = falseprivate fun initialize() {if (!mInitialized) {mBluetoothManagerService.handleOnBootPhase() //初始化mInitialized = true}}override fun onStart() {}override fun onBootPhase(phase: Int) {if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {publishBinderService(BluetoothAdapter.BLUETOOTH_MANAGER_SERVICE,mBluetoothManagerService)}}override fun onUserStarting(user: TargetUser) {if (!UserManager.isHeadlessSystemUserMode()) {initialize()}}
}

BluetoothService 怎么使用kotlin写的?
这个是Android14 才这样写的,Android13 上看了下还是 BluetoothService.java
不过这个没啥影响,只有几十行代码,没啥打印,
理解起来也是比较简单的,主要作用就是在系统起来后拉起 BluetoothManagerService。

所以到这里你就明白了,BluetoothManagerService 才是重头戏,BluetoothService只是一个简单的架子。

(3)BluetoothManagerService.java

package\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;BluetoothManagerService(Context context) {//基础设置,广播监听等}//初始化public void handleOnBootPhase() {if (DBG) {Log.d(TAG, "Bluetooth boot completed");}}//获取蓝牙是否打开public boolean isEnabled() {return getState() == BluetoothAdapter.STATE_ON;}//打开蓝牙public boolean enable(AttributionSource attributionSource) throws RemoteException {}//关闭蓝牙,persist 表示是否记忆蓝牙状态,普通蓝牙关闭都是记忆状态public boolean disable(AttributionSource attributionSource, boolean persist)throws RemoteException {if (persist) {persistBluetoothSetting(BLUETOOTH_OFF);}}。。。
}

其实蓝牙功能使用的就上面几个接口方法,还有一些是gatt 低功耗的判断。
看起来实际功能的类也不多,主要是控制蓝牙开关的。

(4)BluetoothManager.java

package\modules\Bluetooth\framework\java\android\bluetooth\BluetoothManager.java


/*** High level manager used to obtain an instance of an {@link BluetoothAdapter}* and to conduct overall Bluetooth Management.* @see Context#getSystemService* @see BluetoothAdapter#getDefaultAdapter()*/
@SystemService(Context.BLUETOOTH_SERVICE)
@RequiresFeature(PackageManager.FEATURE_BLUETOOTH)
public final class BluetoothManager {/*** @hide , 1、私有的,需要SystemService 方式获取*/public BluetoothManager(Context context) {mAttributionSource = (context != null) ? context.getAttributionSource() :AttributionSource.myAttributionSource();mAdapter = BluetoothAdapter.createAdapter(mAttributionSource);}//2、获取BluetoothAdapter,进行蓝牙开关控制等功能@RequiresNoPermissionpublic BluetoothAdapter getAdapter() {return mAdapter;}//3、获取某个蓝牙对象的连接状态public int getConnectionState(BluetoothDevice device, int profile) {if (DBG) Log.d(TAG, "getConnectionState()");List<BluetoothDevice> connectedDevices = getConnectedDevices(profile);for (BluetoothDevice connectedDevice : connectedDevices) {if (device.equals(connectedDevice)) {return BluetoothProfile.STATE_CONNECTED;}}return BluetoothProfile.STATE_DISCONNECTED;}//4、获取已连接的蓝牙列表 ? 系统上没看到有用这个的。public List<BluetoothDevice> getConnectedDevices(int profile) {if (DBG) Log.d(TAG, "getConnectedDevices");return getDevicesMatchingConnectionStates(profile, new int[] {BluetoothProfile.STATE_CONNECTED});}//5、打开低功耗蓝牙 ?public BluetoothGattServer openGattServer(Context context,BluetoothGattServerCallback callback) {return (openGattServer(context, callback, BluetoothDevice.TRANSPORT_AUTO));}}

其实没看到有啥大作用的方法,只有个 获取BluetoothAdapter对象方法是比较有用的 ,但是 BluetoothAdapter 是可以直接获取的。
所以 BluetoothManager 在开发场景中是没啥作用的。
类定义的最开头的备注也写了高版本用 BluetoothAdapter 即可。

(5)BluetoothAdapter.java

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;private final IBluetoothManager mManagerService;private IBluetooth mService;//1、获取 BluetoothAdapter 的暴露的静态方法@RequiresNoPermissionpublic static synchronized BluetoothAdapter getDefaultAdapter() {if (sAdapter == null) {sAdapter = createAdapter(AttributionSource.myAttributionSource());}return sAdapter;}//2、打开蓝牙的暴露方法@RequiresLegacyBluetoothAdminPermission@RequiresBluetoothConnectPermission@RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)public boolean enable() {if (isEnabled()) {if (DBG) {Log.d(TAG, "enable(): BT already enabled!");}return true;}try {return mManagerService.enable(mAttributionSource);} catch (RemoteException e) {Log.e(TAG, "", e);}return false;}//2、判断蓝牙是否打开的暴露方法public boolean isEnabled() {return getState() == BluetoothAdapter.STATE_ON;}//3、设置蓝牙关闭的暴露方法,默认记忆状态public boolean disable() {return disable(true);}//4、设置蓝牙关闭的暴露方法,参数表示是否记忆,true 为记忆public boolean disable(boolean persist) {try {return mManagerService.disable(mAttributionSource, persist);} catch (RemoteException e) {Log.e(TAG, "", e);}return false;}//5、获取蓝牙mac地址public String getAddress() {try {return mManagerService.getAddress(mAttributionSource);} catch (RemoteException e) {Log.e(TAG, "", e);}return null;}//6、获取当前设备蓝牙名称public String getName() {try {return mManagerService.getName(mAttributionSource);} catch (RemoteException e) {Log.e(TAG, "", e);}return null;}下面这些api都是和硬件比较相关的,具体实现都是用 IBluetooth//7、设置当前设备蓝牙名称public boolean setName(String name) {if (getState() != STATE_ON) {return false;}mServiceLock.readLock().lock();mService.setName(name, mAttributionSource, recv);。。。return false;}//8、获取当前设备蓝牙模式,是否被其他应用发现和连接的模式public int getScanMode() {if (getState() != STATE_ON) {return SCAN_MODE_NONE;}mServiceLock.readLock().lock();。。。return SCAN_MODE_NONE;}//9、设置当前设备蓝牙模式,//20无,21,可以连接不可搜索到,23 可被连接可被搜索到public int setScanMode(@ScanMode int mode) {if (getState() != STATE_ON) {return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED;}。。。return BluetoothStatusCodes.ERROR_UNKNOWN;}//10、开始蓝牙扫描public boolean startDiscovery() {if (getState() != STATE_ON) {return false;}mServiceLock.readLock().lock();。。。return false;}//11、取消蓝牙扫描public boolean cancelDiscovery() {if (getState() != STATE_ON) {return false;}mServiceLock.readLock().lock();。。。return false;}//12、判断是否正在进行蓝牙扫描public boolean isDiscovering() {if (getState() != STATE_ON) {return false;}。。。return false;}//13、获取一次蓝牙被扫描发现的时间,对应的是ScanMode为23的情况public @Nullable Duration getDiscoverableTimeout() {if (getState() != STATE_ON) {return null;}。。。return null;}//14、获取一次蓝牙被扫描发现的时间还剩下多少时间,public long getDiscoveryEndMillis() {mServiceLock.readLock().lock();。。。return -1;}//15、设置被其他设备发现的时间长度,单位秒public int setDiscoverableTimeout(@NonNull Duration timeout) {if (getState() != STATE_ON) {return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED;}。。。return BluetoothStatusCodes.ERROR_UNKNOWN;}//16、获取当前设备保存的蓝牙列表,配对过的public Set<BluetoothDevice> getBondedDevices() {if (getState() != STATE_ON) {return toDeviceSet(Arrays.asList());}mServiceLock.readLock().lock();。。。return null;}}

看一下上面这里api 方法,常用的就是上面的这些方法。

IBluetooth 再往下到 AdapterService 和 AdapterProperties,距离底层代码还有一段距离!

AdapterService 和 AdapterProperties 的源码位置:

package\modules\Bluetooth\android\app\src\com\android\bluetooth\btservice\AdapterService.javapackage\modules\Bluetooth\android\app\src\com\android\bluetooth\btservice\AdapterProperties.java

有兴趣的可以自己看看。

(6)应用获取 BluetoothManager 和 BluetoothAdapter 对象示例
//BluetoothManager 的获取
BluetoothManager bluetoothManager = context.getSystemService(BluetoothManager.class);//BluetoothAdapter 的获取
BluetoothAdapter bluetoothAdapter= BluetoothAdapter.getDefaultAdapter();看起来还是 BluetoothAdapter 获取比较简单,并且实用。

三、其他

上面的代码都是开关和扫描控制相关,下面介绍一下断开、连接的代码。

1、蓝牙配对和断开、连接的代码

//蓝牙配对,连接
BluetoothDevice.createBond();//蓝牙断开
BluetoothAdapter.disconnectAllEnabledProfiles(BluetoothDevice)
//蓝牙忘记
BluetoothDevice.removeBond();

这个 BluetoothDevice 怎么得来的?
就是通过蓝牙扫描收集起来的,或者通过 SettingsLib 库的api或者到当前扫描到的蓝牙列表。

 Collection<CachedBluetoothDevice> cachedDevices = LocalBluetoothManager.getCachedDeviceManager().getCachedDevicesCopy();

LocalBluetoothManager 是 SettingsLib 里面的类,里面应该也是有服务一直在监听蓝牙广播,收集蓝牙列表。

2、Android 蓝牙相关广播介绍

主要介绍Android 蓝牙相关的广播,并非硬件相关的蓝牙广播信号,而是蓝牙app中的广播接收器onReceive 的蓝牙相关广播。

最近刚好开发了一下蓝牙相关的功能,所以进行一些知识总结和介绍,本文应该是全网最面的接收Android广播介绍知识的文章。

Android 蓝牙广播是系统应用或者蓝牙功能应用必备知识。

https://blog.csdn.net/wenzhi20102321/article/details/134956116

3、Android无线蓝牙开发总结

早期写的普通应用端的蓝牙开发:

https://blog.csdn.net/wenzhi20102321/article/details/53870789

4、Android 蓝牙设备类型判断代码介绍

Android 蓝牙设备有各种类型,比如蓝牙手机,蓝牙耳机,蓝牙手环,蓝牙鼠标键盘,蓝牙玩具,健康检测设备等等。

有些场景需要具体区分就需要进行判断了。一个是扫描到后图标显示设备类型,还是可能是具体处理的区别。

这些设备的类型,硬件设备本身其实是有定义的,
但是也不排除有些设备定义不正确,这些都是要我们开发者进行调试才清楚的。

https://blog.csdn.net/wenzhi20102321/article/details/133777224

5、蓝牙开关日志

通过logcat通过grep “BluetoothManagerService” 可以看到蓝牙相关日志;
这个在开关机过程可以看到主要日志,判断设备是否进行开蓝牙的开关控制。

下面主要是展示 BluetoothManagerService 的相关日志

(1)蓝牙开启
130|console:/ # logcat | grep -i BluetoothManagerService           
09-14 17:32:17.558   643   741 D BluetoothManagerService: Trying to bind to profile: 21, while Bluetooth was disabled //等待蓝牙打开
09-14 17:32:18.448   643   740 D BluetoothManagerService: enable(com.skg.settings):  mBluetooth =null mBinding = false mState = OFF
09-14 17:32:18.449   643   771 D BluetoothManagerService: MESSAGE_ENABLE(0): mBluetooth = null
09-14 17:32:18.449   643   771 D BluetoothManagerService: Persisting Bluetooth Setting: 1
09-14 17:32:18.449   643   740 D BluetoothManagerService: enable returning
09-14 17:32:18.450   643   771 D BluetoothManagerService: binding Bluetooth service
09-14 17:32:18.585   643   643 D BluetoothManagerService: BluetoothServiceConnection: com.android.bluetooth.btservice.AdapterService
09-14 17:32:18.585   643   771 D BluetoothManagerService: MESSAGE_BLUETOOTH_SERVICE_CONNECTED: 1
09-14 17:32:18.587   643   771 D BluetoothManagerService: Broadcasting onBluetoothServiceUp() to 7 receivers.
09-14 17:32:18.589   643   771 D BluetoothManagerService: MESSAGE_GET_NAME_AND_ADDRESS
09-14 17:32:18.591   643   771 D BluetoothManagerService: MESSAGE_BLUETOOTH_STATE_CHANGE: OFF > BLE_TURNING_ON
09-14 17:32:18.591   643   771 D BluetoothManagerService: Sending BLE State Change: OFF > BLE_TURNING_ON
09-14 17:32:20.506   643   643 D BluetoothManagerService: Bluetooth Adapter address changed to 22:22:76:B0:09:00
09-14 17:32:20.506   643   643 D BluetoothManagerService: Stored Bluetoothaddress: 22:22:76:B0:09:00
09-14 17:32:20.507   643   643 D BluetoothManagerService: Bluetooth Adapter name changed to W81B by android
09-14 17:32:20.507   643   643 D BluetoothManagerService: Stored Bluetooth name: W81B
09-14 17:32:20.508   643   643 D BluetoothManagerService: Bluetooth Adapter address changed to 22:22:76:B0:09:00
09-14 17:32:20.509   643   643 D BluetoothManagerService: Stored Bluetoothaddress: 22:22:76:B0:09:00
09-14 17:32:20.509   643   771 D BluetoothManagerService: MESSAGE_BLUETOOTH_STATE_CHANGE: BLE_TURNING_ON > BLE_ON
09-14 17:32:20.509   643   771 D BluetoothManagerService: Bluetooth is in LE only mode
09-14 17:32:20.509   643   771 D BluetoothManagerService: Binding Bluetooth GATT service
09-14 17:32:20.510   643   771 D BluetoothManagerService: Sending BLE State Change: BLE_TURNING_ON > BLE_ON
09-14 17:32:20.511   643   643 D BluetoothManagerService: BluetoothServiceConnection: com.android.bluetooth.gatt.GattService
09-14 17:32:20.511   643   771 D BluetoothManagerService: MESSAGE_BLUETOOTH_SERVICE_CONNECTED: 2
09-14 17:32:20.511   643   771 D BluetoothManagerService: continueFromBleOnState()
09-14 17:32:20.513   643   771 D BluetoothManagerService: Persisting Bluetooth Setting: 1  //设置了蓝牙的settings属性 bluetooth_on 为 1
09-14 17:32:20.513   643   771 D BluetoothManagerService: MESSAGE_BLUETOOTH_STATE_CHANGE: BLE_ON > TURNING_ON
09-14 17:32:20.513   643   771 D BluetoothManagerService: Sending BLE State Change: BLE_ON > TURNING_ON
09-14 17:32:20.514   643   771 D BluetoothManagerService: Sending State Change: OFF > TURNING_ON
09-14 17:32:20.665   643   771 D BluetoothManagerService: MESSAGE_BLUETOOTH_STATE_CHANGE: TURNING_ON > ON
09-14 17:32:20.665   643   771 D BluetoothManagerService: Broadcasting onBluetoothStateChange(true) to 20 receivers.
09-14 17:32:20.671   643   771 D BluetoothManagerService: Sending State Change: TURNING_ON > ON
09-14 17:32:20.705   643   643 D BluetoothManagerService: Bluetooth Adapter name changed to IWB by android
09-14 17:32:20.705   643   643 D BluetoothManagerService: Stored Bluetooth name: IWB//查看蓝牙开启状态为1,开启
130|console:/ # settings get global bluetooth_on
1
console:/ # 

手动打开蓝牙就会有上面的 BluetoothManagerService 相关日志

(2)蓝牙关闭日志

09-14 17:32:28.422   643  1125 D BluetoothManagerService: disable(): mBluetooth = android.bluetooth.IBluetooth$Stub$Proxy@d9debac mBinding = false
09-14 17:32:28.422   643  1125 D BluetoothManagerService: Persisting Bluetooth Setting: 0 //设置了蓝牙的settings属性 bluetooth_on 为 0
09-14 17:32:28.423   643   771 D BluetoothManagerService: MESSAGE_DISABLE: mBluetooth = android.bluetooth.IBluetooth$Stub$Proxy@d9debac, mBinding = false
09-14 17:32:28.724   643   771 D BluetoothManagerService: MESSAGE_HANDLE_DISABLE_DELAYED: disabling:false
09-14 17:32:28.724   643   771 D BluetoothManagerService: Sending off request.
09-14 17:32:28.727   643   771 D BluetoothManagerService: MESSAGE_BLUETOOTH_STATE_CHANGE: ON > TURNING_OFF
09-14 17:32:28.727   643   771 D BluetoothManagerService: Sending BLE State Change: ON > TURNING_OFF
09-14 17:32:28.727   643   771 D BluetoothManagerService: Sending State Change: ON > TURNING_OFF
09-14 17:32:28.775   643   771 D BluetoothManagerService: MESSAGE_BLUETOOTH_STATE_CHANGE: TURNING_OFF > BLE_ON
09-14 17:32:28.775   643   771 D BluetoothManagerService: Intermediate off, back to LE only mode
09-14 17:32:28.775   643   771 D BluetoothManagerService: Sending BLE State Change: TURNING_OFF > BLE_ON
09-14 17:32:28.775   643   771 D BluetoothManagerService: Broadcasting onBluetoothStateChange(false) to 36 receivers.
09-14 17:32:28.776   643   771 D BluetoothManagerService: Calling sendBrEdrDownCallback callbacks
09-14 17:32:28.776   643   771 D BluetoothManagerService: isBleAppPresent() count: 0
09-14 17:32:28.778   643   771 D BluetoothManagerService: Sending State Change: TURNING_OFF > OFF
09-14 17:32:28.779   643   771 D BluetoothManagerService: MESSAGE_BLUETOOTH_STATE_CHANGE: BLE_ON > BLE_TURNING_OFF
09-14 17:32:28.779   643   771 D BluetoothManagerService: Sending BLE State Change: BLE_ON > BLE_TURNING_OFF
09-14 17:32:29.026   643   771 D BluetoothManagerService: MESSAGE_HANDLE_DISABLE_DELAYED: disabling:true
09-14 17:32:29.026   643   771 D BluetoothManagerService: Handle disable is finished
09-14 17:32:29.060   643   771 D BluetoothManagerService: MESSAGE_BLUETOOTH_STATE_CHANGE: BLE_TURNING_OFF > OFF
09-14 17:32:29.060   643   771 D BluetoothManagerService: Bluetooth is complete send Service Down
09-14 17:32:29.060   643   771 D BluetoothManagerService: Broadcasting onBluetoothServiceDown() to 7 receivers.
09-14 17:32:29.061   643   771 D BluetoothManagerService: unbindAndFinish(): android.bluetooth.IBluetooth$Stub$Proxy@d9debac mBinding = false mUnbinding = false
09-14 17:32:29.065   643   771 D BluetoothManagerService: Sending BLE State Change: BLE_TURNING_OFF > OFF//查看蓝牙开启状态为0,关闭
130|console:/ # settings get global bluetooth_on
0
console:/ # 

上面是手动关闭蓝牙的日志。

(3)开机前蓝牙开启的开机日志
console:/ # logcat | grep BluetoothManagerService
09-11 17:52:32.516   810  1200 D BluetoothManagerService: Trying to bind to profile: 21, while Bluetooth was disabled
09-11 17:52:32.620   810   810 D BluetoothManagerService: Trying to bind to profile: 1, while Bluetooth was disabled
...
09-11 17:52:32.943   810   810 V BluetoothManagerService: Checking activity com.android.bluetooth.opp.BluetoothOppLauncherActivity
09-11 17:52:33.033   810   827 D BluetoothManagerService: Trying to bind to profile: 1, while Bluetooth was disabled
09-11 17:52:33.879   810   844 D BluetoothManagerService: User UserHandle{0} unlocked
09-11 17:52:33.879   810   939 D BluetoothManagerService: MESSAGE_USER_UNLOCKED
09-11 17:52:34.947   810   810 D BluetoothManagerService: Bluetooth Adapter name changed to tt by android //蓝牙名称
09-11 17:52:34.947   810   810 D BluetoothManagerService: Stored Bluetooth name: tt
09-11 17:52:34.965   810   810 D BluetoothManagerService: BluetoothServiceConnection: com.android.bluetooth.btservice.AdapterService
09-11 17:52:34.965   810   939 D BluetoothManagerService: MESSAGE_BLUETOOTH_SERVICE_CONNECTED: 1
09-11 17:52:34.973   810   939 D BluetoothManagerService: Broadcasting onBluetoothServiceUp() to 8 receivers.
09-11 17:52:34.977   810   939 D BluetoothManagerService: MESSAGE_BLUETOOTH_STATE_CHANGE: OFF > BLE_TURNING_ON
09-11 17:52:34.977   810   939 D BluetoothManagerService: Sending BLE State Change: OFF > BLE_TURNING_ON
09-11 17:52:34.977   810   939 W BroadcastLoopers: Found previously unknown looper Thread[BluetoothManagerService,5,main]
09-11 17:52:35.018   810   810 D BluetoothManagerService: Bluetooth Adapter address changed to 22:22:4B:FA:0C:00
09-11 17:52:35.019   810   810 D BluetoothManagerService: Stored Bluetoothaddress: 22:22:4B:FA:0C:00
09-11 17:52:35.023   810   810 D BluetoothManagerService: Bluetooth Adapter name changed to tt by android
09-11 17:52:35.023   810   810 D BluetoothManagerService: Stored Bluetooth name: tt
09-11 17:52:35.033   810   939 D BluetoothManagerService: MESSAGE_BLUETOOTH_STATE_CHANGE: BLE_TURNING_ON > BLE_ON
09-11 17:52:35.033   810   939 D BluetoothManagerService: Bluetooth is in LE only mode
09-11 17:52:35.033   810   939 D BluetoothManagerService: Binding Bluetooth GATT service
09-11 17:52:35.035   810   939 D BluetoothManagerService: Sending BLE State Change: BLE_TURNING_ON > BLE_ON
09-11 17:52:35.036   810   810 D BluetoothManagerService: BluetoothServiceConnection: com.android.bluetooth.gatt.GattService
09-11 17:52:35.036   810   939 D BluetoothManagerService: MESSAGE_BLUETOOTH_SERVICE_CONNECTED: 2
09-11 17:52:35.041   810   939 D BluetoothManagerService: continueFromBleOnState()
09-11 17:52:35.042   810   939 D BluetoothManagerService: Persisting Bluetooth Setting: 1
09-11 17:52:35.043   810   939 D BluetoothManagerService: MESSAGE_BLUETOOTH_STATE_CHANGE: BLE_ON > TURNING_ON
09-11 17:52:35.043   810   939 D BluetoothManagerService: Sending BLE State Change: BLE_ON > TURNING_ON
09-11 17:52:35.044   810   939 D BluetoothManagerService: Sending State Change: OFF > TURNING_ON
09-11 17:52:35.163   810   939 D BluetoothManagerService: MESSAGE_BLUETOOTH_STATE_CHANGE: TURNING_ON > ON
09-11 17:52:35.163   810   939 D BluetoothManagerService: Broadcasting onBluetoothStateChange(true) to 17 receivers.
09-11 17:52:35.163   810   939 D BluetoothManagerService: Creating new ProfileServiceConnections object for profile: 1
...
09-11 17:52:35.175   810   939 D BluetoothManagerService: Sending BLE State Change: TURNING_ON > ON
09-11 17:52:35.176   810   939 D BluetoothManagerService: Sending State Change: TURNING_ON > ON

这个是开机后打印的日志,可以看到有蓝牙从关闭到开启的状态过程打印。
还有蓝牙名称打印。

(4)开机前蓝牙关闭的开机日志
console:/ # logcat | grep BluetoothManagerService
09-11 17:52:32.098   811  1015 D BluetoothManagerService: Trying to bind to profile: 1, while Bluetooth was disabled
09-11 17:52:32.102   811  1015 D BluetoothManagerService: Trying to bind to profile: 2, while Bluetooth was disabled
09-11 17:52:32.104   811  1015 D BluetoothManagerService: Trying to bind to profile: 11, while Bluetooth was disabled
09-11 17:52:32.107   811  1015 D BluetoothManagerService: Trying to bind to profile: 21, while Bluetooth was disabled
09-11 17:52:32.111   811  1015 D BluetoothManagerService: Trying to bind to profile: 22, while Bluetooth was disabled
09-11 17:52:32.116   811  1015 D BluetoothManagerService: Trying to bind to profile: 26, while Bluetooth was disabled
09-11 17:52:32.294   811   811 D BluetoothManagerService: Bluetooth boot completed
09-11 17:52:32.295   811   811 D BluetoothManagerService: Trying to bind to profile: 2, while Bluetooth was disabled
...
09-11 17:52:32.871   811   811 V BluetoothManagerService: Searching package com.android.bluetooth
09-11 17:52:32.872   811   811 V BluetoothManagerService: Checking activity com.android.bluetooth.BluetoothPrefs
09-11 17:52:32.872   811   811 V BluetoothManagerService: Checking activity com.android.bluetooth.map.BluetoothMapSettings
09-11 17:52:32.872   811   811 V BluetoothManagerService: Checking activity com.android.bluetooth.opp.BluetoothOppLauncherActivity
09-11 17:52:32.934   811   828 D BluetoothManagerService: Trying to bind to profile: 1, while Bluetooth was disabled
09-11 21:12:06.753   811   846 D BluetoothManagerService: User UserHandle{0} unlocked
09-11 21:12:06.754   811   943 D BluetoothManagerService: MESSAGE_USER_UNLOCKED

蓝牙关闭的情况, 从上面代码是看不到蓝牙打开的过程的,
但是也有一些蓝牙准备的过程,蓝牙一些服务绑定需要等待底层初始化OK才能正常绑定。

上面的日志比较多,可能不一定全部有用,
只需要知道,蓝牙开关过程中 BluetoothManagerService 都会有一些打印就可以了。

祝各位:中秋节日快乐。

相关文章:

Android14 蓝牙 BluetoothService 启动和相关代码介绍

Android14 蓝牙 BluetoothService 启动和相关代码 文章目录 Android14 蓝牙 BluetoothService 启动和相关代码一、前言二、代码分析介绍1、蓝牙 BluetoothService 启动和相关代码&#xff08;1&#xff09;蓝牙服务相关的有几个类有&#xff1a;&#xff08;2&#xff09;几个蓝…...

【秋招笔试-支持在线评测】9.19小米秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集…...

动态IP与静态IP:哪种更适合用户使用?

在现代网络环境中&#xff0c;IP地址的管理对于网络的运行和安全至关重要。IP地址是网络中每一个设备的唯一标识符&#xff0c;通常分为动态IP和静态IP两种类型。每种类型都有其独特的优缺点&#xff0c;适用于不同的使用场景。本文将探讨动态IP和静态IP的特点&#xff0c;并分…...

Flowable基础篇

Flowable基础篇 课程环境说明&#xff1a; JDK8Flowable6.7.2MySQL8 一、基础知识科普 1.工作流发展 BPM(BusinessProcessManagement)&#xff0c;业务流程管理是一种管理原则&#xff0c;通常也可以代指BPMS(BusinessProcessManagementSuite)&#xff0c;是一个实现整合不同…...

SQL Server数据库简单的事务日志备份恢复

模拟数据库备份恢复过程 1.基础操作 1.创建TestDB数据库&#xff0c;并添加数据 USE [master] GO CREATE DATABASE TestDB CONTAINMENT NONE ON PRIMARY ( NAME NTestDB, FILENAME ND:\TestDB.mdf , SIZE 8192KB , MAXSIZE UNLIMITED, FILEGROWTH 65536KB ) LOG ON ( …...

二级C语言2023-3易错题

1 下列叙述中正确的是 A. 循环队列是队列的链式存储结构 B. 能采用顺序存储的必定是线性结构 C. 所有的线性结构都可以采用顺序存储结构 D. 具有两个以上指针的链表必定是非线性结构 正确答案&#xff1a;C C的陈述是正确的。线性结构是一种基本的数据结构&#xff0c;它包括…...

【2024】前端学习笔记9-内部样式表-外部导入样式表-类选择器

学习笔记 内部样式表外部导入样式表类选择器&#xff1a;class 内部样式表 内部样式表是将 CSS 样式规则写在 HTML 文档内部。通过<style>标签在 HTML 文件的<head>部分定义样式。 简单示例&#xff1a; <!DOCTYPE html><html><head><style…...

回归传统,Domino拷贝式迁移!

大家好&#xff0c;才是真的好。 前面讲太多普及型的概念&#xff0c;今天我们来点实在的内容。 在Notes/Domino的黄金年代&#xff0c;有一件事情大家干得风生水起&#xff0c;那就是Domino服务器迁移。 要么迁移到另一台硬件服务器上&#xff0c;要么迁移到新换的磁盘当中…...

商品搜索API返回值解析:关键字搜索如何优化商品推荐

优化商品推荐 关键字搜索优化&#xff1a;分析用户搜索的关键字&#xff0c;并确定每个关键字的权重&#xff0c;使用这些权重来调整搜索结果和推荐结果的相关性。 taobao.item_search 公共参数 请求地址: 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接…...

暴雨总裁孙辉:不是所有应用都要追求“大”模型

9月19日&#xff0c;在暴雨青海渠道大会上&#xff0c;暴雨总裁孙辉谈及了AI的发展趋势和暴雨的智能化战略。 当前AI依然火热&#xff0c;孙辉认为&#xff1a;“从商业应用角度看&#xff0c;从来没有一项技术进步像AI一样&#xff0c;在如此短的时间内产生如此大的影响。AI技…...

【掌桥科研-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…...

BERT推理显存爆满?7个实用技巧教你快速优化!显存优化的最佳实践指南

如果只使用BERT进行推理得到词向量&#xff0c;但显存仍然爆满&#xff0c;以下几个建议可以帮助缓解显存问题&#xff1a; 分批处理&#xff08;Batching&#xff09;&#xff1a; 即使是在推理阶段&#xff0c;也可以将输入数据分成较小的批次&#xff08;batch&#xff09;&…...

JS实现树形结构数据中特定节点及其子节点显示属性设置的技巧(可用于树形节点过滤筛选)

大家好&#xff0c;今天我要分享的是如何在树形结构的数据中&#xff0c;根据特定条件设置节点及其所有子节点的显示属性。在实际项目中&#xff0c;这种需求非常常见&#xff0c;特别是在需要动态展示和隐藏节点的情况下。下面我将通过一个具体的示例来讲解实现过程。 需求分析…...

第二证券:金价涨了!创一历史之最!

当地时间周四&#xff0c;金融商场进一步消化美联储大幅降息50个基点的利率抉择&#xff0c;认为这是为了完结美国经济“软着陆”的一次防备式降息&#xff0c;而非紧急应对阑珊风险的降息&#xff0c;加之当天公布的上星期初度申请赋闲救助人数低于预期&#xff0c;投资者对美…...

maxwell 输出消息到 kafka

文章目录 1、kafka-producer2、运行一个Docker容器&#xff0c;该容器内运行的是Zendesk的Maxwell工具&#xff0c;一个用于实时捕获MySQL数据库变更并将其发布到Kafka或其他消息系统的应用3、进入kafka容器内部4、tingshu_album 数据库中 新增数据5、tingshu_album 数据库中 更…...

青柠视频云——视频丢包(卡顿、花屏、绿屏)排查

一、问题说明 近期有客户反馈&#xff0c;接入平台的设备经常出来卡顿、花屏、录屏的情况&#xff0c;出现这样的场景很是尴尬。 客户是私有化部署在公网环境&#xff0c;于是我们联系客户&#xff0c;对问题进行追踪排查。 二、场景复现 我们现场情况确认的过程中&#xff0c;…...

单片机原理及应用

引言 单片机&#xff08;Microcontroller Unit, MCU&#xff09;作为现代电子技术的核心之一&#xff0c;广泛应用于工业自动化、消费电子、医疗设备、汽车电子、航空航天等多个领域。它集成了CPU&#xff08;中央处理器&#xff09;、存储器、输入输出接口及定时/计数器等功能…...

sql中拼接操作

SQL中的拼接操作 常用listagg聚合函数用法 也可用 XMLAGG代替上述操作 常用listagg聚合函数 LISTAGG(column, [separator]) WITHIN GROUP (ORDER BY order_by_clause)column&#xff1a;你想要连接起来的列。 [separator]&#xff1a;可选参数&#xff0c;用于指定列值之间的分…...

基于C语言+SQL Server2008实现(控制台)图书管理系统

第1章 概述 1.1项目背景 随着科技的发展&#xff0c;尤其是计算机技术的迅猛发展&#xff0c;图书馆管理的问题从以往的人工管理&#xff0c;到现在的电脑化&#xff0c;系统化&#xff0c;是对图书馆管理方法的质的飞跃&#xff0c;这些技术不仅让图书馆管理变得更加方便、快…...

Msf之Python分离免杀

Msf之Python分离免杀 ——XyLin. 成果展示&#xff1a; VT查杀率:8/73 (virustotal.com) 火绒和360可以过掉&#xff0c;但Windows Defender点开就寄掉了 提示&#xff1a;我用360测的时候&#xff0c;免杀过了&#xff0c;但360同时也申报了&#xff0c;估计要不了多久就寄…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...