android 9.0背光调节流程

1.背光服务框架
如下图是背光框架层图
在这里插入图片描述

2.UML时序图
这里主要标出的是各个服务或者框架层之间连接的api,中间会省略一些调用流程。
如下图,PowerManagerService会监听SettingProvider的亮度背光值screen_brightness变化,然后进行背光调节。
该图主要是一些服务之前的通信。
在这里插入图片描述

Jni层访问过程如下图:
jni通过hidl直通式访问light库,对hardware层light库会访问对应的sys节点从而进行背光驱动的访问,最终达到调节
背光的目的。
在这里插入图片描述

注意点:
(1)背光的调节并不是一步到位的,而是通过一个线程按照一定的速度来减少或者增加一个背光亮度值来调节的,例如一般背光的调控范围是0-255,假如目前背光150,用户想要调节到180的话,那么系统会开启一个线程按照一定的速度来每次增加背光亮度值1,连续增加30次来达到调节目的。这样调节的目的可能是为了让用户感受到舒适吧。
核心代码部分如下:

代码路径:base\services\core\java\com\android\server\display\RampAnimator.java

//创建了一个线程
 private final Runnable mAnimationCallback = new Runnable() {
   
   
        @Override // Choreographer callback
        public void run() {
   
   
            final long frameTimeNanos = mChoreographer.getFrameTimeNanos();
            final float timeDelta = (frameTimeNanos - mLastFrameTimeNanos)
                    * 0.000000001f;
            mLastFrameTimeNanos = frameTimeNanos;

            // Advance the animated value towards the target at the specified rate
            // and clamp to the target. This gives us the new current value but
            // we keep the animated value around to allow for fractional increments
            // towards the target.
            final float scale = ValueAnimator.getDurationScale();
            if (scale == 0) {
   
   
                // Animation off.
                mAnimatedValue = mTargetValue;
            } else {
   
   
                final float amount = timeDelta * mRate / scale;
                if (mTargetValue > mCurrentValue) {
   
   
                    mAnimatedValue = Math.min(mAnimatedValue + amount, mTargetValue);
                } else {
   
   
                    mAnimatedValue = Math.max(mAnimatedValue - amount, mTargetValue);
                }
            }
            final int oldCurrentValue = mCurrentValue;
            mCurrentValue = Math.round(mAnimatedValue);

            if (oldCurrentValue != mCurrentValue) {
   
   
                //在线程run中调节背光,mProperty是DisplayPowerState对像,
                //base\services\core\java\com\android\server\display\DisplayPowerState.java
                mProperty.setValue(mObject, mCurrentValue);
            }

            if (mTargetValue != mCurrentValue) {
   
   
                postAnimationCallback();
            } else {
   
   
                mAnimating = false;
                if (mListener != null) {
   
   
                    mListener.onAnimationEnd();
                }
            }
        }
    };

(2)如何获取从灯光服务中确定背光调用对象
LightsService是一个有关光调节的服务,其中包括了背光,按键灯,无线通信指示灯等的控制,DisplayService与LightsService通信主要是背光调节,那么DisplayService是如何通知或者获取lightservice中背光的调节对象呢?其实如下代码在LocalDisplayDevice对象构建的时候用LightsManager.LIGHT_ID_BACKLIGHT参数明确了获取的LightsService服务中的lights对象为背光调节类型。所以mBacklight.setBrightness(brightness);调用的是背光的灯光对象。

public abstract class LightsManager {
   
   
    //背光
    public static final int LIGHT_ID_BACKLIGHT = Type.BACKLIGHT;
    //键盘灯
    public static final int LIGHT_ID_KEYBOARD = Type.KEYBOARD;
    //按键灯
    public static final int LIGHT_ID_BUTTONS = Type.BUTTONS;
    //电池相关灯,可能是充电吧
    public static final int LIGHT_ID_BATTERY = Type.BATTERY;
    //通知类型的灯光
    public static final int LIGHT_ID_NOTIFICATIONS = Type.NOTIFICATIONS;
    public static final int LIGHT_ID_ATTENTION = Type.ATTENTION;
    //蓝牙模块的灯光
    public static final int LIGHT_ID_BLUETOOTH = Type.BLUETOOTH;
    //wifi模块的灯光
    public static final int LIGHT_ID_WIFI = Type.WIFI;
    public static final int LIGHT_ID_COUNT = 
<think>好的,我现在要回答用户关于Android系统中手动调整背光的实现流程的问题。首先,我需要仔细理解用户的需求。用户提到了引用1到3,其中涉及Android 9.0背光调整、SystemUI和Settings中的手动调节,以及写入brightness文件的方法,还有DisplayPowerController的相关代码。我需要将这些信息整合起来,形成一个清晰的流程。 首先,根据引用1,手动调节亮度主要涉及SystemUI和Settings应用。用户通过拖动进度条调整亮度,这时候需要知道这些UI组件是如何与底层系统交互的。可能需要提到BrightnessController类,因为这在Android中通常用于处理亮度调节的逻辑。 接下来,当用户调整亮度时,Settings应用会调用相应的接口,比如setScreenBrightness()。这部分需要确认是否正确,可能需要参考Android源码中的相关方法。根据引用2,最终亮度值会写入/sys/class/leds/lcd-backlight/brightness文件,这里是通过write_int函数实现的。这部分需要详细描述,包括文件路径和驱动交互。 然后,涉及到的DisplayPowerController,在引用3中提到了nativeSetDebouncedAmbientLight方法,这可能与自动亮度调节有关,但用户问的是手动调节,所以需要区分两者。手动调节可能会绕过自动调节逻辑,直接设置亮度值。需要确认DisplayPowerController在手动调节中的作用,比如处理亮度变化请求并调用底层接口。 流程步骤可能需要分为几个部分:用户界面交互、系统服务处理、内核驱动执行。每个步骤需要对应到具体的代码或模块。例如,用户操作触发Settings中的逻辑,然后调用PowerManagerService,接着通过HAL层写入sysfs节点。 需要检查是否有遗漏的步骤,比如权限管理,或者是否有其他服务参与,比如DisplayManagerService。另外,Android的版本差异可能影响流程,用户提到的是Android 9.0,所以需要确保引用的信息适用于该版本。 最后,确保回答结构清晰,分点说明,并正确引用提供的参考资料。可能还需要生成相关问题,比如手动和自动调节的优先级,写入sysfs的权限问题,或者UI如何更新亮度值等。</think>### Android手动调节背光实现流程 Android系统中手动调节背光涉及用户界面、系统服务及底层驱动的协同工作,具体流程如下: --- #### **1. 用户界面交互** - **触发入口**:用户在SystemUI的快速设置面板或Settings应用的**显示设置**中拖动亮度条,触发手动调节事件。 - **关键组件**: - **BrightnessController**:处理亮度条滑动事件,将输入值映射为亮度范围(通常0-255)[^1]。 - **Settings应用**:通过`setScreenBrightness(int brightness)`接口将目标亮度值传递给系统服务。 --- #### **2. 系统服务处理** - **PowerManagerService**:接收来自UI的亮度值,进行合法性校验(如范围限制)。 - **DisplayPowerController**:负责协调亮度调节逻辑: - 若系统启用自动亮度,手动调节会临时禁用自动调节模式。 - 调用`setScreenBrightness(int brightness)`更新目标亮度,并通过JNI调用底层接口`nativeSetBacklight()`[^3]。 --- #### **3. 内核驱动执行** - **写入sysfs节点**:最终通过`write_int(LCD_FILE, brightness)`将亮度值写入`/sys/class/leds/lcd-backlight/brightness`文件[^2]。 - **硬件响应**:LCD背光驱动读取该文件中的值,通过PWM或电流控制调整背光强度。 --- #### **4. 流程图解** ```plaintext 用户滑动亮度条 → SystemUI/Settings → PowerManagerService → DisplayPowerController → 写入/sys节点 → 驱动调节背光 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值