• Android的亮灯逻辑辨析


    Android手机的亮灯逻辑由三层结构:

    1. framework层控制行为逻辑

    2. hardware提供HAL接口

    3. 驱动层负责亮灯。

    首先在/framework/base/core/res/res/values/config.xml中定义了灯的颜色和亮灯阈值

    1. <!-- Display low battery warning when battery level dips to this value -->
    2. 1144 <integer name="config_lowBatteryWarningLevel">20</integer>
    3. 1145
    4. 1146 <!-- The default suggested battery % at which we enable battery saver automatically. -->
    5. 1147 <integer name="config_lowBatteryAutoTriggerDefaultLevel">15</integer>
    6. 1148
    7. 1149 <!-- Close low battery warning when battery level reaches the lowBatteryWarningLevel
    8. 1150 plus this -->
    9. 1151 <integer name="config_lowBatteryCloseWarningBump">5</integer>
    10. notification LED. -->
    11. 1154 <color name="config_defaultNotificationColor">#ffffffff</color>
    12. 1155
    13. 1156 <!-- Default LED on time for notification LED in milliseconds. -->
    14. 1157 <integer name="config_defaultNotificationLedOn">500</integer>
    15. 1158
    16. 1159 <!-- Default LED off time for notification LED in milliseconds. -->
    17. 1160 <integer name="config_defaultNotificationLedOff">2000</integer>
    18. 1161
    19. 1162 <!-- Default value for led color when battery is low on charge -->
    20. 1163 <integer name="config_notificationsBatteryLowARGB">0xFFFF0000</integer>
    21. 1164
    22. 1165 <!-- Default value for led color when battery is medium charged -->
    23. 1166 <integer name="config_notificationsBatteryMediumARGB">0xFF0000FF</integer>
    24. 1167
    25. 1168 <!-- Default value for led color when battery is fully charged -->
    26. 1169 <integer name="config_notificationsBatteryFullARGB">0xFF00FF00</integer>
    27. 1170

    诸如电量15%显示一种灯,电量为FULL时显示一种;而颜色为0xFFFF0000; 其中最高两位的FF表示灯的通透性(景深),而接下来的6位,2位为一种颜色,分别为RGB,RED,GREEN,BLUE;因此0xFFFF0000红色,0xFFFFFF00(橙色,红绿), 0xFF00FF00(绿), 0xFF0000FF(蓝);

    这些值在/framework/base/services/core/java/com/android/server/BatteryService.java中被解析,进而进行判断行为

    1. public void updateLightsLocked() {
    2. final int level = mHealthInfo.batteryLevel;
    3. final int status = mHealthInfo.batteryStatus;
    4. if (level < mLowBatteryWarningLevel) {
    5. if (status == BatteryManager.BATTERY_STATUS_CHARGING) {
    6. // Solid red when battery is charging
    7. mBatteryLight.setColor(mBatteryLowARGB);
    8. } else {
    9. // Flash red when battery is low and not charging
    10. mBatteryLight.setFlashing(mBatteryLowARGB, Light.LIGHT_FLASH_TIMED,
    11. mBatteryLedOn, mBatteryLedOff);
    12. }
    13. } else if (status == BatteryManager.BATTERY_STATUS_CHARGING
    14. || status == BatteryManager.BATTERY_STATUS_FULL) {
    15. if (status == BatteryManager.BATTERY_STATUS_FULL || level >= 90) {
    16. // Solid green when full or charging and nearly full
    17. mBatteryLight.setColor(mBatteryFullARGB);
    18. } else {
    19. // Solid orange when charging and halfway full
    20. mBatteryLight.setColor(mBatteryMediumARGB);
    21. }
    22. } else {
    23. // No lights if not charging and not low
    24. mBatteryLight.turnOff();
    25. }
    26. }

    这段逻辑就是控制底层亮灯行为;大家可以仔细看一下有没有问题,在status为CHARGING或者FULL的时候亮灯。这是一个或逻辑!也就是说或在充电,或满,就显示红灯(惯例),那么有没有可能是FULL而不是CHARGING呢?又或者既不是CHARGING也不是FULL的时候按照这里的逻辑是灭灯,但是手机还连着USB线呢? 这里就涉及到了充电相关的知识。

           电量低的时候,不在充电则闪烁,充电则常亮; 而充电时亮两种灯,充满与不充满; 那么你一定会问,可以有不在充电但是满的情况吗? 有的;但是,FULL的时候一定是连接着充电器的,所以一定会亮灯。而不连接充电器的时候也是满的怎么办?不连接充电器的时候一定不是FULL,而是DIS_CHARGING,放电状态,所以关灯。还有一种情况,连接着充电器,又不满 FULL,又不在充电CHARGING,也就是所谓的NOT_CHARGING状态。这种状态亮不亮灯呢? 按照这个逻辑一定是关灯的。NOT_CHARGING在高通平台上通过/sys/class/power_supply/battery/battery_charging_enabled这个节点来实现。也就是插着USB线只做调试不做充电,实测与逻辑一致,是灭灯的。该节点后来移动其他地方去了,又后来隐藏了。

    接下来我们看hardware中的接口hardware/qcom/display/liblight/lights.c中定义了各种接口,比如很重要的呼吸灯接口handle_speaker_battery_locked()

    如果在充电,又有消息来,那么我们通常的逻辑就是消息优先显示,而充电作为第二优先级;则这里就需要改动,调换g_battery与g_notification的顺序。

    1. static void
    2. handle_speaker_battery_locked(struct light_device_t* dev)
    3. {
    4. if (is_lit(&g_battery)) {
    5. set_speaker_light_locked(dev, &g_battery);
    6. } else {
    7. set_speaker_light_locked(dev, &g_notification);
    8. }
    9. }

    这个文件下,通过写sysfs节点的方式与驱动层进行数据交流:

    /sys/class/leds/%s/delay_off

    通过设置常亮,或者亮灭的时间间隔达到呼吸灯的效果。

    再往下就是驱动层的事情了。

    由此,我们就清楚了android亮灯的逻辑。

  • 相关阅读:
    Python考前综合练习-第六章[python123题库]
    unity 使用RenderTexture映射到UIRawImage上,拖拽Image旋转模型
    js的toString方法
    VS Code中PlatformIO IDE的安装并开发Arduino
    SpringBoot学习小结之数据库版本管理工具Flyway
    可root设备复制文件到system目录或者子目录下
    python面试题——抽象基类和接口
    【WebGL 3D前沿】threeJs 入门篇
    Java技能树-网络-HTTP-HttpURLConnection
    LeetCode中等题之逆波兰表达式求值
  • 原文地址:https://blog.csdn.net/dj0227/article/details/134404293