android backlight
背光设置是在:设置->声音和显示->亮度,通过进度条来设置的。
文件:packages/apps/Settings/src/com/android/settings/BrightnessPreference.java
private static final int MINIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_DIM + 10;
private static final int MAXIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_ON;
mSeekBar.setMax(MAXIMUM_BACKLIGHT - MINIMUM_BACKLIGHT);
设置进度条的范围,BRIGHTNESS_DIM = 20 BRIGHTNESS_ON=255,它们的定义在:
frameworks/base/core/java/android/os/Power.java
3.1.2 设置亮度
文件:packages/apps/Settings/src/com/android/settings/BrightnessPreference.java
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
setMode(isChecked ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
: Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
setBrightness(mSeekBar.getProgress() + MINIMUM_BACKLIGHT);
private void setBrightness(int brightness) {
IPowerManager power = IPowerManager.Stub.asInterface(
ServiceManager.getService("power"));
power.setBacklightBrightness(brightness);
} catch (RemoteException doe) {
由以上代码可知,brightness的范围是:20~255;代码通过服务管理器(ServiceManager)获得power服务,然后通过power服务设置亮度。
power.setBacklightBrightness的定义在:
rameworks/base/core/java/android/os/IPowerManager.aidl.java
frameworks/base/core/java/android/os/PowerManager.java
3.2 Power服务
文件:frameworks/base/core/java/android/os/Power.java
* Brightness value for dim backlight
public static final int BRIGHTNESS_DIM = 20;
* Brightness value for fully on
public static final int BRIGHTNESS_ON = 255;
文件:frameworks/base/core/java/android/os/PowerManager.java
* sets the brightness of the backlights (screen, keyboard, button).
* @param brightness value from 0 to 255
public void setBacklightBrightness(int brightness)
mService.setBacklightBrightness(brightness);
电源管理器(powermager)将brightness转给电源服务,该服务位置如下:
文件:frameworks/base/services/java/com/android/server/PowerManagerService.java
public void setBacklightBrightness(int brightness) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
// Don't let applications turn the screen all the way off
brightness = Math.max(brightness, Power.BRIGHTNESS_DIM);
mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, brightness,
HardwareService.BRIGHTNESS_MODE_USER);
mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD,
(mKeyboardVisible ? brightness : 0), HardwareService.BRIGHTNESS_MODE_USER);
mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, brightness,
HardwareService.BRIGHTNESS_MODE_USER);
long identity = Binder.clearCallingIdentity();
mBatteryStats.noteScreenBrightness(brightness);
Log.w(TAG, "RemoteException calling noteScreenBrightness on BatteryStatsService", e);
Binder.restoreCallingIdentity(identity);
mScreenBrightness.curValue = brightness;
mScreenBrightness.animating = false;
mScreenBrightness.targetValue = -1;
if (ANIMATE_KEYBOARD_LIGHTS) {
mKeyboardBrightness.curValue = brightness;
mKeyboardBrightness.animating = false;
mKeyboardBrightness.targetValue = -1;
mButtonBrightness.curValue = brightness;
mButtonBrightness.animating = false;
mButtonBrightness.targetValue = -1;
由以上代码可知,同时设置了背光、键盘、按钮的亮度。mHardware 是硬件服务,通过该服务调用底层与设备打交道的C/C++代码,setLightBrightness_UNCHECKED原型如下:
文件:frameworks/base/services/java/com/android/server/HardwareService.java
void setLightBrightness_UNCHECKED(int light, int brightness, int brightnessMode) {
int b = brightness & 0x000000ff;
b = 0xff000000 | (b << 16) | (b << 8) | b;
setLight_native(mNativePointer, light, b, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
static final int LIGHT_ID_BACKLIGHT = 0;
static final int LIGHT_ID_KEYBOARD = 1;
static final int LIGHT_ID_BUTTONS = 2;
static final int LIGHT_ID_BATTERY = 3;
static final int LIGHT_ID_NOTIFICATIONS = 4;
static final int LIGHT_ID_ATTENTION = 5;
int brightnessMode 表示亮度的控制模式,选项如下:
* Light brightness is managed by a user setting.
static final int BRIGHTNESS_MODE_USER = 0;
* Light brightness is managed by a light sensor.
static final int BRIGHTNESS_MODE_SENSOR = 1;
int b = brightness & 0x000000ff;
b = 0xff000000 | (b << 16) | (b << 8) | b;
可知,亮度值在此进行了修改,即亮度值的格式变成:FFRRGGBB,FF是没有的,RR、GG、BB分别是256色的红绿蓝,并且红绿蓝的值都是一样的亮度值。
3.3 硬件调用
3.3.1获取硬件
文件:frameworks/base/services/jni/com_android_server_HardwareService.cpp
LIGHT_INDEX_NOTIFICATIONS = 4,
#define LIGHTS_HARDWARE_MODULE_ID "lights"
static jint init_native(JNIEnv *env, jobject clazz)
devices = (Devices*)malloc(sizeof(Devices));
err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
devices->lights[LIGHT_INDEX_BACKLIGHT]
= get_device(module, LIGHT_ID_BACKLIGHT);
devices->lights[LIGHT_INDEX_KEYBOARD]
= get_device(module, LIGHT_ID_KEYBOARD);
devices->lights[LIGHT_INDEX_BUTTONS]
= get_device(module, LIGHT_ID_BUTTONS);
devices->lights[LIGHT_INDEX_BATTERY]
= get_device(module, LIGHT_ID_BATTERY);
devices->lights[LIGHT_INDEX_NOTIFICATIONS]
= get_device(module, LIGHT_ID_NOTIFICATIONS);
devices->lights[LIGHT_INDEX_ATTENTION]
= get_device(module, LIGHT_ID_ATTENTION);
memset(devices, 0, sizeof(Devices));
用hw_get_module获取ID为LIGHTS_HARDWARE_MODULE_ID的硬件模块,该模块含有6个不同类型的亮度控制。
文件:hardware/libhardware/Hardware.c
#define HAL_LIBRARY_PATH "/system/lib/hw"
static const char *variant_keys[] = {
"ro.hardware", /* This goes first so that it can pick up a different
static const int HAL_VARIANT_KEYS_COUNT =
(sizeof(variant_keys)/sizeof(variant_keys[0]));
int hw_get_module(const char *id, const struct hw_module_t **module)
const struct hw_module_t *hmi = NULL;
* Here we rely on the fact that calling dlopen multiple times on
* the same .so will simply increment a refcount (and not load
* We also assume that dlopen() is thread-safe.
/* Loop through the configuration variants looking for a module */
for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {
if (i < HAL_VARIANT_KEYS_COUNT) {
if (property_get(variant_keys[i], prop, NULL) == 0) {
snprintf(path, sizeof(path), "%s/%s.%s.so",
snprintf(path, sizeof(path), "%s/%s.default.so",
/* we found a library matching this id/variant */
if (i < HAL_VARIANT_KEYS_COUNT+1) {
/* load the module, if this fails, we're doomed, and we should not try
* to load a different variant. */
status = load(id, path, module);
property_get(variant_keys[i], prop, NULL) 会按如下顺序去获取如下变量所对应的值,然后返回给prop:
"ro.hardware", /* This goes first so that it can pick up a different
"ro.product.board=$TARGET_BOOTLOADER_BOARD_NAME"
"ro.board.platform=$TARGET_BOARD_PLATFORM"
setLight_native对应的jni C/C++代码是:
文件:frameworks/base/services/jni/com_android_server_HardwareService.cpp
static void setLight_native(JNIEnv *env, jobject clazz, int ptr,
int light, int colorARGB, int flashMode, int onMS, int offMS, int brightnessMode)
Devices* devices = (Devices*)ptr;
if (light < 0 || light >= LIGHT_COUNT || devices->lights[light] == NULL) {
memset(&state, 0, sizeof(light_state_t));
state.brightnessMode = brightnessMode;
devices->lights[light]->set_light(devices->lights[light], &state);
通过light标识找到对应的light设备,然后再设置亮度。
3.3.3 硬件原型
msm7k的lights对应的硬件原型是在:hardware/msm7k/liblights
文件:hardware/msm7k/liblights/Android.mk
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
LOCAL_MODULE := lights.$(TARGET_BOARD_PLATFORM)
也就是生成模块:/system/lib/hw/lights. msm7k.so
文件:hardware/msm7k/liblights/lights.c
/** Open a new instance of a lights device using name */
static int open_lights(const struct hw_module_t* module, char const* name,
int (*set_light)(struct light_device_t* dev,
struct light_state_t const* state);
if (0 == strcmp(LIGHT_ID_BACKLIGHT, name)) {
set_light = set_light_backlight;
else if (0 == strcmp(LIGHT_ID_KEYBOARD, name)) {
set_light = set_light_keyboard;
else if (0 == strcmp(LIGHT_ID_BUTTONS, name)) {
set_light = set_light_buttons;
else if (0 == strcmp(LIGHT_ID_BATTERY, name)) {
set_light = set_light_battery;
else if (0 == strcmp(LIGHT_ID_NOTIFICATIONS, name)) {
set_light = set_light_notifications;
else if (0 == strcmp(LIGHT_ID_ATTENTION, name)) {
set_light = set_light_attention;
pthread_once(&g_init, init_globals);
struct light_device_t *dev = malloc(sizeof(struct light_device_t));
dev->common.tag = HARDWARE_DEVICE_TAG;
dev->common.module = (struct hw_module_t*)module;
dev->common.close = (int (*)(struct hw_device_t*))close_lights;
*device = (struct hw_device_t*)dev;
static struct hw_module_methods_t lights_module_methods = {
devices->lights[LIGHT_INDEX_BACKLIGHT]
= get_device(module, LIGHT_ID_BACKLIGHT);
devices->lights[LIGHT_INDEX_KEYBOARD]
= get_device(module, LIGHT_ID_KEYBOARD);
devices->lights[LIGHT_INDEX_BUTTONS]
= get_device(module, LIGHT_ID_BUTTONS);
devices->lights[LIGHT_INDEX_BATTERY]
= get_device(module, LIGHT_ID_BATTERY);
devices->lights[LIGHT_INDEX_NOTIFICATIONS]
= get_device(module, LIGHT_ID_NOTIFICATIONS);
devices->lights[LIGHT_INDEX_ATTENTION]
= get_device(module, LIGHT_ID_ATTENTION);
= "/sys/class/leds/lcd-backlight/brightness";
rgb_to_brightness(struct light_state_t const* state)
int color = state->color & 0x00ffffff;
return ((77*((color>>16)&0x00ff))
+ (150*((color>>8)&0x00ff)) + (29*(color&0x00ff))) >> 8;
set_light_backlight(struct light_device_t* dev,
struct light_state_t const* state)
int brightness = rgb_to_brightness(state);
err = write_int(LCD_FILE, brightness);
handle_trackball_light_locked(dev);
pthread_mutex_unlock(&g_lock);
rgb_to_brightness(struct light_state_t const* state)
int color = state->color & 0x000000ff;
android backlight相关推荐
- lcd4linux亮度,Android LCD和键盘 背光亮度设置
举例,背光设置,背光对应的代码如下: char const*const LCD_FILE = "/sys/class/leds/lcd-backlight/brightness"; ...
- Android系统中的屏幕状态切换以及亮度设置
Android系统的状态包括wake.earlysuspend以及suspend状态,其使用锁和定时器来进行状态的切换. 而在wake状态,屏幕首先是调至设定的亮度,如果没有其他动作,当经过一段时间后 ...
- [RK3128][Android 6.0] PWM backlight注册及调用流程
硬件平台:RK3128 Android版本:6.0 Kernel版本:3.10.92 首先来看pwm配置: pwm1: pwm@20050010 {compatible = "rockchi ...
- Android:展锐backlight
展锐平台屏幕亮度查询和修改,其他平台如MTK高通等类似,只需要找到相关节点即可. 屏幕亮度查询: adb root adb shell cat /sys/class/backlight/sprd_ba ...
- Android模拟器学framework和driver之battery backlight-----5. backlight in linux
前面介绍了battery的相关的东西,现在我们来介绍下backlight模块,背光主要是用来调节显示屏亮度的,一般背光都是用PWM控制的,调节占空比达到改变有效电压值来调节光的强弱. 背光的移植在li ...
- Backlight driver on Android
http://www.qrsdev.com/forum.php?mod=viewthread&tid=1895&extra=page%3D1
- Android实现手机手电筒
首先,我们来看一下这个程序的运行截图: 首先点击菜单键,我们会看到菜单中有两个选项,一个是选择背光颜色,另一个是离开按钮,当我们点击背光颜色之后,会出现如上所示的效果. 接着,我们点击蓝色背光,出现如 ...
- Android SystemServer分析
一.Zygote到SystemServer SystemServer是由Zygote fork生成的,进程名为system_server,这个进程包含里framework中的核心服务,在Zygot ...
- Android Framework常用工具及LOG调试方法
概述 Framework开发是一项非常繁琐复杂的工作,需要阅读大量的源代码,分析及其多的LOG信息来定位错误位置.这个时候如果使用一些工具或者知道如何定位重要LOG信息,就可以使一些复杂的工作变的简单 ...
最新文章
- 损失函数理解汇总,结合PyTorch1.7和TensorFlow2
- Python的 5 种高级用法,效率提升没毛病!
- pycharm自定义格式化
- java中min用法,java11教程--类MinguoDate用法
- UVa 11520 Fill the Square 填充正方形
- linux系统命令基础知识
- input的readonly属性与TextBox的ReadOnly和Enabled属性区别
- 零基础学Python(第十五章 日期时间datetime、time、Calendar)
- day38 19-Spring整合web开发
- 用 Span 对 C# 进程中三大内存区域进行统一访问 ,太厉害了!
- 适合手机端的ckeditor样式_抖音运营干货(三):9款手机视频剪辑APP,让你轻松玩转后期!...
- mysql之锁与事务
- 使用动态优先权的进程调度算法的模拟_我爱OS第12讲:系统调度
- 迁移应用程序到.NET Framework 4.5:弃用类型与新特性
- 101与金根回顾敏捷个人:(82)《把时间当做朋友》
- 统计学基础Statistics for the Behavioral Sciences 之 Sample Variance as an Unbiased Statistic
- 多媒体SCM格式介绍
- JavaSE进阶582-589 IO流(二)File类/目录拷贝
- 传奇开服教程完整版GOM引擎超详细的单机架设图文教程(小白一看就会)
- 用伪造的TCP协议头花式欺骗核心转发设备?
热门文章
- delete,drop,truncate 区别
- 038_Steps步骤条
- 016_泛型常见通配符
- 006_Curator框架一
- 006_Buzz属性和组
- 015_CSS伪元素选择器
- visual studio 2008 html中调用外部css文件,的Visual Studio 2008 IDE冻结/崩溃打开.aspx文件中使用CSS时包括...
- 百一测评mysql数据库答案_MySQL练习题,百炼成神~
- Java基础:动态代理
- java导出word表格_使用PowerDesigner16.5 逆向数据库 导出word文档