推荐个源码在线阅读网址 http://androidxref.com/
packages/apps/Bluetooth/
packages/apps/Bluetooth/src/com/android/bluetooth/btservice--
---看这路径肯定是蓝牙应用方面的代码了,主要是关于蓝牙应用协议的表现代码,包括opp、hfp、hdp、a2dp、pan等等,这些名词后面再解释。
/packages/apps/Settings/src/com/android/settings/bluetooth
---设置界面选项的蓝牙设置界面代码:
BluetoothPairingDialog.java --蓝牙匹配对话框
BluetoothSettings.java --设置界面,用于管理配对和连接设备
BluetoothEnabler.java --界面上蓝牙开启关闭
BluetoothDiscoverableEnabler.java --
frameworks/base/core/Java/android/server/
4.2以后这个目录虽然还有了,但里面代码已经转移到应用层了,就是前面那个目录,所以4.2.2上的蓝牙这里可以忽略。
framework/base/core/java/android/bluetooth
这个目录里的代码更像一个桥梁,里面有供java层使用一些类,也有对应的aidl文件联系C、C++部分的代码,还是挺重要的。
kernel\drivers\bluetoothBluetooth
具体协议实现。包括hci,hid,rfcomm,sco,SDP等协议
kernel\net\bluetooth Linux kernel
对各种接口的Bluetoothdevice的驱动。例如:USB接口,串口等,上面kernel这两个目录有可能看不到的,但一定会有的。
external\bluetooth\bluedroid BlueZ (应用空间协议),官方蓝牙协议栈。
system\bluetoothBluetooth 适配层代码,和framework那个作用类似,是串联framework与blueZ的工具。
大致代码分布就是这些,初步查看后让我们再来看下蓝牙的整体结构。
BluetoothEnabler.java --界面上蓝牙开启关闭
---BluetoothEnabler is a helper to manage the Bluetooth on/off checkbox preference. It turns on/off Bluetooth and ensures
---the summary of the preference reflects the current state.
BluetoothSettings.java--设置界面,用于管理配对和连接设备
---BluetoothSettings is the Settings screen for Bluetooth configuration and connection management.--
蓝牙布局结构
public final class BluetoothSettings extends DeviceListPreferenceFragment implements Indexable {
private static final String TAG = "BluetoothSettings";
......
@Override
void addPreferencesForActivity() {
addPreferencesFromResource(R.xml.bluetooth_settings);
mPairedDevicesCategory = new PreferenceCategory(getPrefContext());
mPairedDevicesCategory.setKey(KEY_PAIRED_DEVICES);
mPairedDevicesCategory.setOrder(1);
getPreferenceScreen().addPreference(mPairedDevicesCategory);
mAvailableDevicesCategory = new BluetoothProgressCategory(getActivity());
mAvailableDevicesCategory.setSelectable(false);
mAvailableDevicesCategory.setOrder(2);
getPreferenceScreen().addPreference(mAvailableDevicesCategory);
mMyDevicePreference = new Preference(getPrefContext());
mMyDevicePreference.setSelectable(false);
mMyDevicePreference.setOrder(3);
getPreferenceScreen().addPreference(mMyDevicePreference);
setHasOptionsMenu(true);
}
BluetoothSettings属于PreferenceFragment,需要加载布局文件bluetooth_settings.xml(/packages/apps/Settings/res/xml/bluetooth.xml).
以下是布局文件代码,总共四行。节点为PreferenceScreen,代表整个显示屏幕,内部可以嵌套不同的标签,在这里,内部没有任何标签,
是在代码中动态添加不同种类的布局
//packages/apps/Settings/res/xml/bluetooth.xml
<?xml version="1.0" encoding="utf-8"?>
......
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/bluetooth_settings" >
</PreferenceScreen>
备注:
xmlns:android="http://schemas.android.com/apk/res/android
--声明xml命名空间,xmlns意思为“xml namespace”.冒号后面是给这个引用起的别名。
----schemas是xml文档的两种约束文件其中的一种,规定了xml中有哪些元素(标签)、元素有哪些属性及各元素的关系。
从面向对象的角度理解schemas文件可以认为它是被约束的xml文档的“类”或称为“模板”。
----早期或简单的xml用的是另一种约束,称为DTD,这东西大家天天都见到。html/xhtml中都存在(早期的html可能没有),如
"<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"。
现在大部分xml文档的约束都换成schema了,原因是schema本身也是xml,二schema扩展性强。
xml补充:
------/packages/apps/Settings/src/com/android/settings/bluetooth
./DevicePickerFragment.java:54: addPreferencesFromResource(R.xml.device_picker);
./BluetoothSettings.java:162: addPreferencesFromResource(R.xml.bluetooth_settings);
整体结构
图中把JNI部分虽然在目前4.2的代码中在packages层,这里还是画在Framework层了,说明下,不要引起理解的误会
PS:上图关于蓝牙协议栈的说明有误,4.2里已经不再是bluez了,在些更正一下,当然协议栈这一部分还是要有的,新的协议栈看下面英文:
Android 4.2 introduces a new Bluetooth stack optimized for use with Android devices. The new Bluetooth stack developed in
collaboration between Google and Broadcom replaces the stack based on BlueZ and provides improved compatibility and reliability.
google和broadcom合作开发了一个新蓝牙协议栈,老版本的兼容性问题在所难免了。