Android系统服务之LightsService实现架构
1.Android灯的种类
Android原生设计了8种灯,分别为LCD背光灯、键盘灯、Button灯、电池灯、消息通知灯、重视灯、蓝牙灯、Wifi灯。
这些在LightsService中有定义,定义如下:
static final int LIGHT_ID_BACKLIGHT = 0; //LCD背光灯
static final int LIGHT_ID_KEYBOARD = 1; //键盘灯
static final int LIGHT_ID_BUTTONS = 2; //Button灯
static final int LIGHT_ID_BATTERY = 3; //电池灯
static final int LIGHT_ID_NOTIFICATIONS = 4; //消息通知灯
static final int LIGHT_ID_ATTENTION = 5;//重视灯
static final int LIGHT_ID_BLUETOOTH = 6; //蓝牙灯
static final int LIGHT_ID_WIFI = 7;//Wifi灯
Android目前只用到了前面6种灯,蓝牙和Wifi灯暂未应用。
2.灯系统结构
Android灯系统用于统一控制系统中的各个光源,基本上是一个用于输出控制的系统。
3.灯系统框架
灯系统之下而上,包含了如下框架层次:
3.1驱动程序:特定硬件平台灯系统的驱动程序,可以使用Linux中的LED驱动程序实现。
3.2硬件抽象层,灯系统硬件抽象层接口路径为:
代码路径:hardware/libhardware/include/hardware/lights.h
这是一个Android中标准的硬件模块。
3.3本地类
代码路径:
frameworks/base/services/jni/com_android_server_LightsService.cpp
这个类调用硬件抽象层,也同时提供了JNI的接口。
3.4 JAVA类
代码路径:
frameworks/base/services/java/com/android/server/LightsService.java
LightsService.java通过调用,LightsServiceJNI来实现com.android.server包中的LightsService类。
这个类不是平台的API,被Android系统JAVA框架中的其他一些部分调用(如notificationService等)。
4.灯系统框架图
灯系统的硬件抽象层是一个Android中标准的硬件模块,接口在hardware/libhardware/include/hardware/目录中的lights.h文件中定义。
struct light_state_t {
unsigned int color; /*光源的颜色 */
int flashMode; /* Flash的模式、开关时间 */
int flashOnMS;
int flashOffMS;
int brightnessMode; /*亮度模式 */
};
struct light_device_t {
struct hw_device_t common;
int (*set_light)(struct light_device_t* dev, /*设置光源 */
struct light_state_t const* state);
};
灯系统的主要特点是需要为每一个光源实现一个设备light_device_t。
灯系统模块的函数,也就是Android中标准打开模块的函数hw_module_methods_t中的open()需要通过参数“返回”一个light_device_t类型的指针。
这个指针表示的是一个光设备,在模块的打开函数中指定的名称来确定得到哪一个设备。
灯系统的硬件抽象层实现后,将生成名称为liblights.default.so的动态库,放置在目标文件系统/system/lib/hw目录中。