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

简介: http://blog.csdn.net/lushengchu_luis/article/details/20382775最近RK3026的项目需要修改开机充电,才分析了Android原生态的充电过程。

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

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

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

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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文件,系统进入正常启动。


目录
相关文章
|
17天前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
214 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
20天前
|
缓存 Unix Android开发
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
110 8
|
20天前
|
XML 存储 Java
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
55 3
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
|
20天前
|
存储 消息中间件 人工智能
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
52 4
|
20天前
|
XML 编解码 Android开发
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
53 0
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
|
3月前
|
存储 机器学习/深度学习 API
Android API Level 到底是什么?和安卓什么关系?应用发布如何知道自己的版本?优雅草卓伊凡
Android API Level 到底是什么?和安卓什么关系?应用发布如何知道自己的版本?优雅草卓伊凡
562 31
Android API Level 到底是什么?和安卓什么关系?应用发布如何知道自己的版本?优雅草卓伊凡
|
8月前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
234 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
4月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
191 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
8月前
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
217 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
8月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
266 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡

热门文章

最新文章