Android5.0 & 5.1
分析Android系统中,灯光系统如何调用灯光服务、JNI、HAL等从而操控底层Linux驱动控制的led电池灯去闪烁或者亮不同颜色的灯来通知用户。
详细调用过程:
1. 首先Android系统加载后会执行init进程,然后加载SystemService.java系统服务
SystemService.java
private void startCoreServices() {
// Manages LEDs and display backlight.
mSystemServiceManager.startService(LightsService.class);
// Tracks the battery level. Requires LightService.
mSystemServiceManager.startService(BatteryService.class);
}
private void startBootstrapServices() {
/* 加载电源管理服务,灯光系统属于电源管理的一部分 */
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());
}
2 . mSystemServiceManager.startService(LightsService.class);
调用LightsService.java的onStart方法,开启一个LightsManager服务。
LightsManager服务用来管理所有的灯光,包括电池灯、通知灯、背光灯。当需要控制这些灯的时候就需要getLocalService获取这个服务,然后调用这个服务的getLight方法,传入对应的灯的id(参考lighs.h)就可以获取对应的灯的实例化对象,从而可以通过这个对象获取对象里面的操作各种灯的方法。
LightsService.java
//实例化多个LightImpl对象,分别对应电池灯、通知灯、背光灯,通过getLight方法传入不同的id就可以获取对应的对象
final LightImpl mLights[] = new LightImpl[LightsManager.LIGHT_ID_COUNT];
public void onStart() {
publishBinderService("hardware", mLegacyFlashlightHack);
publishLocalService(LightsManager.class, mService);
}
private final