安卓系统定制:android的充电图标的制作和显示

http://blog.csdn.net/lushengchu_luis/article/details/20382775

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

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

[java] view plain copy

 

  1. on charger  
  2.     setprop ro.boot.charger.emmc 0  
  3.     export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin  
  4.     export LD_LIBRARY_PATH /vendor/lib:/system/lib  
  5.     setprop sys.usb.config adb   
  6.   
  7. service charger /charger                                                                                                                                         
  8.     disabled  

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

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

[java] view plain copy

 

  1. is_charger = !strcmp(bootmode, "charger");  
  2. 。。。。。。  
  3.     if (is_charger) {  
  4.         action_for_each_trigger("charger", action_add_queue_tail);  
  5.     } else {  
  6.         action_for_each_trigger("early-boot", action_add_queue_tail);  
  7.         action_for_each_trigger("boot", action_add_queue_tail);  
  8.     }     

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

[java] view plain copy

 

  1. struct {  
  2.     const char *src_prop;  
  3.     const char *dest_prop;  
  4.     const char *def_val;  
  5. } prop_map[] = {  
  6.  //   { "ro.boot.serialno", "ro.serialno", "", },  
  7.     { "ro.boot.mode", "ro.bootmode", "unknown", },                                                                                                           
  8.     { "ro.boot.baseband", "ro.baseband", "unknown", },  
  9.     { "ro.boot.bootloader", "ro.bootloader", "unknown", },  
  10. };  
  11.   
  12. for (i = 0; i < ARRAY_SIZE(prop_map); i++) {  
  13.     ret = property_get(prop_map[i].src_prop, tmp);  
  14.     if (ret > 0)  
  15.         property_set(prop_map[i].dest_prop, tmp);  
  16.     else  
  17.         property_set(prop_map[i].dest_prop, prop_map[i].def_val);  
  18. }  
  19.   
  20. ret = property_get("ro.boot.console", tmp);  
  21. if (ret)  
  22.     strlcpy(console, tmp, sizeof(console));  
  23.   
  24. /* save a copy for init's usage during boot */  
  25. property_get("ro.bootmode", tmp);  
  26. strlcpy(bootmode, tmp, sizeof(bootmode));  

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

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

[java] view plain copy

 

  1.     if (!strcmp(name,"qemu")) {  
  2.         strlcpy(qemu, value, sizeof(qemu));  
  3.     } else if (!strncmp(name, "androidboot.", 12) && name_len > 12) {  
  4.         const char *boot_prop_name = name + 12;  
  5.         char prop[PROP_NAME_MAX];  
  6.         int cnt;  
  7.   
  8.         cnt = snprintf(prop, sizeof(prop), "ro.boot.%s", boot_prop_name);  
  9.         if (cnt < PROP_NAME_MAX)  
  10.             property_set(prop, value);  
  11.     }  
  12. }  

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

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

[java] view plain copy

 

  1. static void add_bootmode_charger_to_cmdline(void)                                                                                                                
  2. {  
  3.     char *pmode=" androidboot.mode=charger";  
  4.     //int off = strlen(saved_command_line);  
  5.     char *new_command_line = kzalloc(strlen(saved_command_line) + strlen(pmode) + 1, GFP_KERNEL);  
  6.     sprintf(new_command_line, "%s%s", saved_command_line, pmode);  
  7.     saved_command_line = new_command_line;  
  8.     //strcpy(saved_command_line+off,pmode);  
  9.   
  10.     //int off = strlen(boot_command_line);  
  11.     //strcpy(boot_command_line+off,pmode);  
  12.   
  13.     printk("Kernel command line: %s\n", saved_command_line);  
  14. }  

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

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

时间: 2024-09-03 01:57:49

安卓系统定制:android的充电图标的制作和显示的相关文章

安卓系统定制:让机器永不休眠并且没有锁屏界面

frameworks/base/packages/SettingsProvider/res/values/defaults.xml中修改def_screen_off_timeout为-1   frameworks/base/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java中mExternallyEnabled设置为false 

暗示Android L即将发布?谷歌自曝下一代安卓系统名称

不断有消息称下一代的安卓系统为Android L,而谷歌今天自曝图片,似乎暗示Android L即将发布?谷歌已经16岁了,为了庆生他们换上新的Logo,同时还不忘在G+上晒晒蛋糕啥的.Android L的正式名称一直是个谜,它的真会叫Lemon Meringue Pie(柠檬酥皮馅饼)吗?由外媒发现,G+上谷歌晒出的图片中棒棒糖多次出现,这似乎是暗示Android L的代号是Lollipop,其实之前也有过相同的消息传出.其实叫什么不重要,只是希望Android L正式版能快到到来.

android-安卓系统定制替换launcher

问题描述 安卓系统定制替换launcher 用我自己的launcher替换了原生launcher之后,烧写到开发板中之后发现我的launcher程序会显示一个图标,按照网上的方法设置隐式启动launcher之后再烧写却直接黑屏了,- =:什么原因 解决方案 你说的按照网上的方法是指什么方法?黑屏的具体情况是什么?这些请描述清楚.一般开发板都带串口工具,可以看到Launcher安装之后的Log. 理论上来说,一个应用某个Activity加上了下面这个属性就可以成为桌面应用. <intent-fil

launcher-安卓系统定制Launcher的问题

问题描述 安卓系统定制Launcher的问题 定制过launcher之后,烧进系统,然后在开发板上运行,发现运行的效果并不是自己设定的那样,但是在设置里面手动清空程序数据之后就显示正常了.出现的问题如下,我取消了allapps键,然后在workspace上预置了一些应用,然后allapps面板中会出现跟预置的应用相同的图标.不明白其中的原因.尝试过修改launcherprovider首次启动初始化数据库的方式,依旧没有解决问题.求大神解救 解决方案 定制自己的桌面:launcher定制你自己的桌

网络机与安卓系统的结合

Android是一种以Linux为基础的开放源代码操作系统,中文叫安卓系统.Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l"Isle-Adam)在1886年发表的科幻小说<未来夏娃>(L"ève future)中.他将外表像人的机器(机器人)起名为Android. 安卓系统以突出的开放性著称,是当前最流行的操作系统,2012年7月数据,安卓系统占据全球智能操作系统市场59%的份额,中国市场占有率为76.7%.艾媒咨询的一份最新调查数

谷歌:新安卓系统Android 7.0 Root难度将加大

一直对用户root安卓系统不管不问的谷歌近日宣布:Android 7.0 (牛轧糖)将会安装一种新的开机验证功能,root难度会因该功能而加大 很多安卓用户会Root安卓系统以DIY自己的手机.在某种程度上,Root后的Android设备可以变得更安全--然而事实并非如此,越来越多恶意软件盯上了使用Android系统的个人和企业,由此引发的安全问题愈发突出.为此,谷歌为使Android 7.0 牛轧糖更加安全添加了一种称为verified boot的新特性,使得系统难以被root. 新功能ver

小米,华为等系统定制的android权限控制问题

问题描述 小米,华为等系统定制的android权限控制问题 现在在开发应用,发现小米,华为等机型在权限管理里面可以控制我应用的定位权限 ,有允许,询问和禁止三种选择,我想知道怎么判断用户在小米等系统的权限管理那 选的是那三种的哪种. 解决方案 个人觉得,程序里面只能做到 定位调用是成功还是失败,而且你也只要知道这2种结果就够了呀

在android系统上写C语言程序--开机启动该程序不进入安卓系统

     今天要写的这篇博文意义重大,也是网上很少有的,这是在我工作中学会的一项技术,当然,它也是由简单的问题组合而来的.如何在安卓中写C语言程序,调试安卓驱动,测试程序的的一项重要技能,下面我就不说废话了,直接说实用的,怎么用这个东西.      关于这个问题,相信很多学Android的都会去关注这个问题,大家普遍会有个这样的疑问:安卓是怎么跑起来的?     最简单的说法,安卓系统是这样加载的:     Bootloader------Kernel(对应平台版本的Linux内核)------

一加手机推出 Oxygen OS 开放定制 Android 系统

本月早些时候,一加手机宣布 开发应用于自家手机产品的定制版安卓系统 ,以回应跟 Cyanogen 陷入的僵局.现在,该公司 透露 ,它将在 2 月 12 日发布可以安装到第三方安卓设备的 ROM(刷机包). 更正: 一加手机告诉我们,事实上,他们不会在 12 日发布这款 ROM.当日的活动可算是预告片的预告片,我们预计可以了解到"关于这款 ROM 的更多信息",而无法下载到适用于第三方安卓设备的刷机包. 一加手机将这款名为"Oxygen"(氧气)的 ROM 描述为&