android的充电图标显示
来源:互联网 发布:java中的interface 编辑:程序博客网 时间:2024/04/29 10:15
from: http://blog.csdn.net/lushengchu_luis/article/details/20382775
充电的代码和图标在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 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);
- }
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));
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);
- }
- }
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);
- }
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文件,系统进入正常启动。
0 0
- android的充电图标显示
- android的充电图标显示
- 安卓系统定制:android的充电图标的制作和显示
- android 充电图标
- android开机充电logo的显示方法
- android关机充电流程、充电画面显示
- android关机充电流程、充电画面显示
- android关机充电流程、充电画面显示
- android关机充电流程、充电画面显示
- android关机充电流程、充电画面显示
- 充电低电量(少于5%)的时候开机充电图标默认是没有显示动画,如果需要充电动画,该如何配置
- [FAQ04241][BMT]充电低电量(少于5%)的时候开 机充电图标默认是没有显示动画,如果需要充电 动画,该如何配置
- android关机充电流程及关机充电时的画面显示
- Android电池充电显示数据
- android 电池电量检测,充电显示效果
- android开机充电及画面显示
- Android不显示SDK图标的解决
- Eclipse修改android工程的图标显示
- Android 进化
- STL 概述
- 改变了世界历史的13台计算机
- Android内置颜色及其它颜色RGB对照表
- (c语法百题3)计算矩形的周长和面积
- android的充电图标显示
- 在S5PV210平台上实现二代身份证解码,安卓系统,可以获取全部文字信息以及电子照片
- 触摸屏驱动分析之——tslib概览
- Bluetooth SDP介绍
- buffer pool和shared pool详解(之四,重要视图、以及转储)
- JavaWeb---Servlet过滤器
- hdoj 2072 单词数 【字符串处理】
- Android Service
- (c语法百题4)求两数中的较大者