android的充电图标显示

解析Android开机充电机制及充电模式设置原理
本文深入分析了Android系统中开机充电过程,包括充电代码与图标位置、初始化脚本启动流程、关键属性读取与设置机制,以及如何通过驱动配置实现开机充电模式。重点介绍了如何在内核传递的命令行参数中设置`androidboot.mode=charger`属性,进而触发充电模式的执行。此外,文章还详细解释了在不同条件下系统的行为变化,包括充电执行后的重启逻辑与充电阈值设定。

最近RK3026的项目需要修改开机充电,才分析了android原生态的充电过程。

充电的代码和图标在system/core/charger中,会编译成名字为charger的可执行文件,打包进ramdisk中,在init.rc中脚本启动:

on charger
    setprop ro.boot.charger.emmc 0
    export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
    export LD_LIBRARY_PATH /vendor/lib:/system/lib
    setprop sys.usb.config adb 

service charger /charger                                                                                                                                       
    disabled

on charger会触发该服务执行,所以现在要分析的就是on charger是如被何触发的。

在system/core/init/init.c中:

is_charger = !strcmp(bootmode, "charger");
。。。。。。
    if (is_charger) {
        action_for_each_trigger("charger", action_add_queue_tail);
    } else {
        action_for_each_trigger("early-boot", action_add_queue_tail);
        action_for_each_trigger("boot", action_add_queue_tail);
    }   

可见,要触发charger, is_charger为真即可,即bootmode为“charger”,所以继续跟踪代码:

    struct {
        const char *src_prop;
        const char *dest_prop;
        const char *def_val;
    } prop_map[] = {
     //   { "ro.boot.serialno", "ro.serialno", "", },
        { "ro.boot.mode", "ro.bootmode", "unknown", },                                                                                                         
        { "ro.boot.baseband", "ro.baseband", "unknown", },
        { "ro.boot.bootloader", "ro.bootloader", "unknown", },
    };

    for (i = 0; i < ARRAY_SIZE(prop_map); i++) {
        ret = property_get(prop_map[i].src_prop, tmp);
        if (ret > 0)
            property_set(prop_map[i].dest_prop, tmp);
        else
            property_set(prop_map[i].dest_prop, prop_map[i].def_val);
    }

    ret = property_get("ro.boot.console", tmp);
    if (ret)
        strlcpy(console, tmp, sizeof(console));

    /* save a copy for init's usage during boot */
    property_get("ro.bootmode", tmp);
    strlcpy(bootmode, tmp, sizeof(bootmode));

读取“ro.bootmode”得到的,但是“ro.bootmode”的属性又是通过"ro.boot.mode"来设置的。

而这个属性是读取/proc/cmdline参数,最终在import_kernel_nv函数中设置的:

    if (!strcmp(name,"qemu")) {
        strlcpy(qemu, value, sizeof(qemu));
    } else if (!strncmp(name, "androidboot.", 12) && name_len > 12) {
        const char *boot_prop_name = name + 12;
        char prop[PROP_NAME_MAX];
        int cnt;

        cnt = snprintf(prop, sizeof(prop), "ro.boot.%s", boot_prop_name);
        if (cnt < PROP_NAME_MAX)
            property_set(prop, value);
    }
}

命令行是kernel传进来的,所以要进入驱动中去了。

在kernel/drivers/power/rk29_charger_display.c文件中:

static void add_bootmode_charger_to_cmdline(void)                                                                                                              
{
    char *pmode=" androidboot.mode=charger";
    //int off = strlen(saved_command_line);
    char *new_command_line = kzalloc(strlen(saved_command_line) + strlen(pmode) + 1, GFP_KERNEL);
    sprintf(new_command_line, "%s%s", saved_command_line, pmode);
    saved_command_line = new_command_line;
    //strcpy(saved_command_line+off,pmode);

    //int off = strlen(boot_command_line);
    //strcpy(boot_command_line+off,pmode);

    printk("Kernel command line: %s\n", saved_command_line);
}

终于看到了,就是在这里设置了androidboot.mode=charger属性。

继续跟进什么条件下才设置该属性,发现关机充电情况下,设置该属性,机子运行charger执行文件;这时候如果电源键按下超过两秒,charger执行文件重启机子,把标记设置为BOOT_MODE_CHARGE;重启后在驱动中,判断电量如果小于5%(可以修改该值),继续进入charger模式;否则不再设置androidboot.mode=charger属性,系统不会再执行charger文件,系统进入正常启动。













Android 15 中,充电图标显示的判断逻辑主要涉及电池状态的监听、系统 UI 的更新机制以及底层硬件电源管理的协调。以下是关键部分的分析: ### 电池状态监听与更新机制 Android 系统通过 `BatteryService` 类来监听电池状态的变化。该类位于 `frameworks/base/services/core/java/com/android/server/BatteryService.java`,它负责从系统底层读取电池状态信息,包括电池电量、充电状态等 [^1]。当设备连接到电源时,系统会更新电池状态,并将这些信息广播给注册了电池状态变化监听器的应用程序和系统组件。 ### 系统 UI 更新 系统 UI 的更新主要由 `BatteryMeterView` 类处理,该类位于 `frameworks/base/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java`。当电池状态发生变化时,`BatteryMeterView` 会根据当前的电池电量和充电状态来决定是否显示充电图标 。例如,当电池电量达到 100% 并且处于充电状态时,系统应该停止显示充电图标。 ### 充电状态判断逻辑 在 Android 系统中,充电状态通常通过 `BatteryManager` 类提供的常量来表示,包括 `BatteryManager.BATTERY_STATUS_CHARGING` 和 `BatteryManager.BATTERY_STATUS_FULL` 等。当电池电量达到 100% 时,系统会检查当前的充电状态,并据此决定是否继续显示充电图标 。 ### 示例代码 以下是一个简化的示例代码,展示了如何在 Android 应用中获取电池状态并根据状态更新 UI: ```java import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.BatteryManager; import android.widget.ImageView; public class BatteryStatusReceiver extends BroadcastReceiver { private ImageView batteryIcon; public BatteryStatusReceiver(ImageView batteryIcon) { this.batteryIcon = batteryIcon; } @Override public void onReceive(Context context, Intent intent) { int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING; boolean isFull = status == BatteryManager.BATTERY_STATUS_FULL; if (isCharging && !isFull) { batteryIcon.setImageResource(R.drawable.ic_battery_charging); } else if (isFull) { batteryIcon.setImageResource(R.drawable.ic_battery_full); } else { batteryIcon.setImageResource(R.drawable.ic_battery_not_charging); } } } ``` ### 充电动画与显示调整 对于特定平台(如展讯平台),在关机充电时,充电动画的显示可能需要调整以适应不同的屏幕方向需求。例如,在平板设备上,可能需要将默认的竖屏充电动画调整为横屏显示 [^3]。 ### 开机充电流程 在 Android 系统启动过程中,如果设备处于充电状态,系统会根据充电状态启动相应的充电动画。这一过程涉及到电源管理模块的交互,包括判断充电状态和启动充电动画 [^2]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值