下面大致看看Android 蓝牙部分.
先大致走读一遍,android系统蓝牙相关代码基本分布:
<1> : 应用层:
Setting工程,Bluetooth工程,Phone工程,这三个工程代码都在~/packages/app目录下(主要是这几个见得多,面熟).
Settings : 这个是用户见过最多的,蓝牙的开关,扫描,配对.
Bluetooth : 实现一部分用户交互(比如蓝牙发送接收文件,一般都会在通知栏出现),重点是它提供了蓝牙各种协议,比如A2DP,HFP,HSP,HID,OPP...的各项服务,所以展开这个工程时,可以发现,工程源码下的每个包基本上都有一个向应用层提供的一个Service.据我自己使用情况,A2DP是播放音乐之类的,HFP/HSP是蓝牙耳机/音响类型,比如HFP就可以支持拨打电话挂机按键(蓝牙耳机上面有按键),当然HSP也有一些简单按键,比如V=/V-.不过这个提供的主要是给Phone那边使用.
这个工程的jni主要是去调用蓝牙的协议栈(android4.2及以后就是bluedroid协议栈),所这个工程是上下跨度,对上提供一些应用操作和服务,对下调用协议栈操作.放在应用层不是很准确.
Phone : RFComm的通信对接的接口和使用时在这边,一些AT命令,这些可以控制电话的挂机取线,音量调节等等,当然会因为HFP和HSP的不同有所差别,一般这个地方需要到实验认证,自己以前为产品去实验室做过一次.
<2> : framework 层 : 看多了android framework源代码,framework最多的就是Service和Manager,所以蓝牙主要的是BluetoothManagerService类在处理蓝牙的操作.即然这是一个服务,那么启动呢?其实和其他服务启动方式都是差不多的.前面涉及打Audio部分的,对于大部分android服务都是在System server中启动:
// Skip Bluetooth if we have an emulator kernel // TODO: Use a more reliable check to see if this product should // support Bluetooth - see bug 988521 if (SystemProperties.get("ro.kernel.qemu").equals("1")) { Slog.i(TAG, "No Bluetooh Service (emulator)"); } else if (factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) { Slog.i(TAG, "No Bluetooth Service (factory test)"); } else { Slog.i(TAG, "Bluetooth Manager Service"); bluetooth = new BluetoothManagerService(context); ServiceManager.addService(BluetoothAdapter.BLUETOOTH_MANAGER_SERVICE, bluetooth); }
如果你对源码稍微好奇一点的话,看了这部分程序,继续看这段程序的上面部分,会发现,基本上有N个服务都在这里一起启动:
AccountManagerService accountManager = null; ContentService contentService = null; LightsService lights = null; PowerManagerService power = null; DisplayManagerService display = null; BatteryService battery = null; VibratorService vibrator = null; AlarmManagerService alarm = null; MountService mountService = null; NetworkManagementService networkManagement = null; NetworkStatsService networkStats = null; NetworkPolicyManagerService networkPolicy = null; ConnectivityService connectivity = null; WifiP2pService wifiP2p = null; WifiService wifi = null; NsdService serviceDiscovery= null; IPackageManager pm = null; Context context = null; WindowManagerService wm = null; BluetoothManagerService bluetooth = null; DockObserver dock = null; UsbService usb = null; SerialService serial = null; TwilightService twilight = null; UiModeManagerService uiMode = null; RecognitionManagerService recognition = null; ThrottleService throttle = null; NetworkTimeUpdateService networkTimeUpdater = null; CommonTimeManagementService commonTimeMgmtService = null; InputManagerService inputManager = null; TelephonyRegistry telephonyRegistry = null;
上面都在这里启动.
具体参看:
framework/base/core/java/android/bluetooth
<3> : 接口层Bluetooth工程 : 基本上上面扯得再多,最终还是有它来和协议层以及底层
<4> : bluedroid协议栈,这个协议栈在4.2开始出现,没有特别研究过.
最后贴一张框架图:copy网上的.