android10 systemUI亮度调节分析

裁剪服务的时候,裁掉了lightservice,想着这可能是灯光控制的,但是改了之后,发现bug了, systemUI背光亮度控制滑动失效了。 最后分析是在lightservice里面的

流程分析

首先看类调用

frameworks\base\packages\SystemUI\src\com\android\systemui\settings\BrightnessController.java中的setBrightness方法开始
frameworks\base\core\java\android\hardware\display\DisplayManager中的setTemporaryBrightness方法
这里DisplayManager会有一些实现类之类的,暂时不需要看,最后是调用到下面的service,属于系统服务了
frameworks\base\services\core\java\com\android\server\display\DisplayManagerService.java
frameworks\base\services\core\java\com\android\server\display\DisplayPowerController.java
frameworks\base\services\core\java\com\android\server\display\RampAnimator.java
frameworks\base\services\core\java\com\android\server\display\DisplayPowerState.java
PhotonicModulator内部类DisplayPowerState -> setScreenBrightness -> scheduleScreenUpdate -> postScreenUpdateThreadSafe->  mScreenUpdateRunnable -> mPhotonicModulator.setState(mScreenState, brightness)PhotonicModulator是一个Thread,里面run是死循环,通过setState方法唤醒对象锁Object mLock = new Object();
设置一些状态值,和判断是否改变亮度的条件,关键看下面这句
mBlanker.requestDisplayState(state, backlight);
DisplayBlanker的实现是在DisplayManagerService中的LocalService类中实现的,
来看DisplayBlanker中requestDisplayState的实现
callbacks.onDisplayStateChange(state);改变状态的回调
关键点,亮度调节方法requestGlobalDisplayStateInternal(state, brightness);
这个方法的实现中,会有一些判断,判断是否是超过上限值和下限值之类的,毕竟简单
调用applyGlobalDisplayStateLocked(List<Runnable> workQueue)
这里有个DisplayDevice的循环判断,其实就是判断显示设备,如果有外接hdmi显示,外屏之类的,都是这个类的实现
Runnable runnable = updateDisplayStateLocked(device);if (runnable != null) {workQueue.add(runnable);}
这里updateDisplayStateLocked其实就是调节亮度了
DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();if ((info.flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) == 0) {return device.requestDisplayStateLocked(mGlobalDisplayState, mGlobalDisplayBrightness);}> getDisplayDeviceInfoLocked
> requestDisplayStateLocked
这两个实现全部是在LocalDisplayAdapter.java中的
frameworks\base\services\core\java\com\android\server\display\LocalDisplayAdapter.java
requestDisplayStateLocked返回的是Runable,其实最后的调用就一句话,
mBacklight.setBrightness(brightness);
这个mBacklight就是背光了,看前面的初始化LightsManager lights = LocalServices.getService(LightsManager.class);mBacklight = lights.getLight(LightsManager.LIGHT_ID_BACKLIGHT);是LightsManager 获取的,因为开始我把LightsManager 裁掉了,然后这个位置报错, 我就直接屏蔽掉了代码,导致背光失效,后面的调用,就是lightservice调用jni了
com_android_server_lights_LightsService.cpp
后面的具体去分析

总结:

裁掉了lightManager导致背光控制失败,实际上是调用不到com_android_server_lights_LightsService.cpp里面的方法,其实在设置中,也可以通过Settings.System.putInt(getContentResolver(),Settings.System.SCREEN_BRIGHTNESS,brightness);
和get方法去设置或者获取亮度值,但是对于滑动的seekbar来说,频繁读写并不好, 所以systemUI才会用displaymanager来控制调用,但是这个设置的值,最后调用的还是DisplayPowerState中的
public static final IntProperty SCREEN_BRIGHTNESS =
new IntProperty(“screenBrightness”) {
@Override
public void setValue(DisplayPowerState object, int value) {
object.setScreenBrightness(value);
}

    @Overridepublic Integer get(DisplayPowerState object) {return object.getScreenBrightness();}
};

最终都会走到setScreenBrightness -> scheduleScreenUpdate -> postScreenUpdateThreadSafe -> mScreenUpdateRunnable -> mPhotonicModulator.setState(mScreenState, brightness)跟调用DisplayManager的
setTemporaryBrightness方法最后是一样的,底层同样是用的lightservice,有兴趣的同学可以分析一下lightservice对应jni的调用setLight_native,往下调用的hal层部分,有一些修改过这类亮度控制的,其实就是对sys设备下的节点的读写,
原理基本一样,有空也可以分析,背光节点/sys/class/leds/lcd-backlight


android10 systemUI亮度调节分析相关推荐

  1. android 6.0 SystemUI源码分析(1)-SystemUI介绍

    1. SystemUI介绍 SystemUI是一个系统应用,主要功能有: 1)状态栏信息显示,比如电池,wifi信号,3G/4G等icon显示 2)通知面板,比如系统消息,第三方应用消息,都是在通知面 ...

  2. PWM调光方法在LED亮度调节中的应用

    LED 是一种固态电光源, 是一种半导体照明器件,其电学特性具有很强的离散性.它具有体积小.机械强度大.功耗低.寿命长, 便于调节控制及无污染等特征,有极大发展前景的新型光源产品.LED 调光方法的实 ...

  3. java手机太亮,Android 亮度调节

    最近在做一个App的设置项,亮度调节.真正做时,发现Android亮度调节比预想要复杂一些.其实目前网上已有不少这方面的资料,但有些博文具有一定误导性.在此将这块内容按照自己理解整理一下. 整体上看, ...

  4. 笔记本电脑亮度调节按钮不起作用

    问题:在使用电脑过程中,发现屏幕亮度调节按钮失灵,但是音量以及其他按钮都可以使用? 原因分析:设备管理器--监视器  被禁用了   是比较常见的一种原因 解决方案:进入设备管理器--将监视器启动即可 ...

  5. android设置自动亮度,Android亮度调节的几种实现方法

    最近在做一个App的设置项,亮度调节.真正做时,发现Android亮度调节比预想要复杂一些.其实目前网上已有不少这方面的资料,但有些博文具有一定误导性.在此将这块内容按照自己理解整理一下. 整体上看, ...

  6. Android 亮度调节

    专注Android领域开发.仰望星空,同时需要脚踏实地. --好记性不如烂博客 Android 亮度调节 最近在做一个App的设置项,亮度调节.真正做时,发现Android亮度调节比预想要复杂一些.其 ...

  7. mtk8788 pwm频率及背光亮度调节

    =======pwm频率修改 当前ALPS branch上,disp_pwm driver采用的是turnkey code,不同芯片型号,或不同branch,disp_pwm频率设定可能会有差异,因此 ...

  8. android护目镜软件,亮度调节护目镜

    还在为看手机伤眼睛而担忧吗?快来使用亮度调节护目镜吧!亮度调节护目镜app软件中包含了护眼模式,开启护眼模式后,不管是夜间.阅读还是游戏.影音都能有效的保护你的眼睛,还会有疲劳提醒,为你的眼睛健康着想 ...

  9. linux pwm 调屏_PWM调光方法在LED亮度调节中的应用

    LED 是一种固态电光源, 是一种半导体照明器件,其电学特性具有很强的离散性.它具有体积小.机械强度大.功耗低.寿命长, 便于调节控制及无污染等特征,有极大发展前景的新型光源产品.LED 调光方法的实 ...

  10. Android 9.0 亮度调节的变化(伽马曲线)

    平台  RK3399 + Android 9.0 概述  众所周知, Android 平台的上层亮度值的设置值范围为[0, 255], 在9.0之前, 亮度调节一直是线性变化, 在9.0开始, 它变成 ...

最新文章

  1. 漫谈时序设计(3)走进时序约束的大门!
  2. android java 延时函数,如何在Android中设置文本之间的延迟
  3. 如何在hadoop中控制map的个数
  4. Nmap配合Masscan实现高效率扫描资产
  5. JPBC库只使用椭圆曲线群,不使用双线性性质。找单位元,逆元等
  6. HTML5 Canvas专题
  7. vs.net c# 安装、注册windows service服务,判断服务是否存在,是否启动
  8. python图像边缘检测_使用python获取图像中形状的轮廓(x,y)坐标
  9. mybatis 多表关联查询_Java修行第041天--MyBatis框架(下)--多表查询
  10. Failed to connect to github.com port 443: Connection refused问题解决
  11. SpringCloud Gateway堆外内存溢出排查
  12. SQL Server numeric数据类型
  13. 按照日期:蓝桥杯真题、洛谷题单、力扣题单汇总
  14. pyecharts 画K线图
  15. 一个后端工程师如何实现漂亮的后台管理系统
  16. java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to
  17. 【持续更新】java多线程面试题整理
  18. Java编程入门之前篇
  19. 4个查询网站收录的方式,你中意哪个查询方式呢?
  20. Google Chrome常规浏览器设置: Adobe Flash Player

热门文章

  1. 趣图 | 念念不忘必有回响
  2. 260. 只出现一次的数字 III【我亦无他唯手熟尔】
  3. db2归档日志与循环日志(转载weiruan85)
  4. go语言打印日期_专访Go语言布道师Dave Cheney:Go语言这十年,只能用“成功”一词总结...
  5. Android平台下JNI调用第三方so库
  6. 嵌入式开发——基于小熊派的智慧农业案例(一)
  7. 微信公众平台测试账号本地配置
  8. 电视不正常Android镜像投屏,爱奇艺乐播投屏
  9. 第一集 斗罗世界 第六章
  10. java程序员的cto成长之路