首页 文章 精选 留言 我的

精选列表

搜索[图片显示],共10000篇文章
优秀的个人博客,低调大师

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

http://blog.csdn.net/lushengchu_luis/article/details/20382775 最近RK3026的项目需要修改开机充电,才分析了Android原生态的充电过程。 充电的代码和图标在system/core/charger中,会编译成名字为charger的可执行文件,打包进ramdisk中,在init.rc中脚本启动: [java] view plain copy oncharger setpropro.boot.charger.emmc0 exportPATH/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin exportLD_LIBRARY_PATH/vendor/lib:/system/lib setpropsys.usb.configadb servicecharger/charger disabled on charger会触发该服务执行,所以现在要分析的就是on charger是如被何触发的。 在system/core/init/init.c中: [java] view plain copy 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”,所以继续跟踪代码: [java] view plain copy struct{ constchar*src_prop; constchar*dest_prop; constchar*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)); /*saveacopyforinit'susageduringboot*/ property_get("ro.bootmode",tmp); strlcpy(bootmode,tmp,sizeof(bootmode)); 读取“ro.bootmode”得到的,但是“ro.bootmode”的属性又是通过"ro.boot.mode"来设置的。 而这个属性是读取/proc/cmdline参数,最终在import_kernel_nv函数中设置的: [java] view plain copy if(!strcmp(name,"qemu")){ strlcpy(qemu,value,sizeof(qemu)); }elseif(!strncmp(name,"androidboot.",12)&&name_len>12){ constchar*boot_prop_name=name+12; charprop[PROP_NAME_MAX]; intcnt; 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文件中: [java] view plain copy staticvoidadd_bootmode_charger_to_cmdline(void) { char*pmode="androidboot.mode=charger"; //intoff=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); //intoff=strlen(boot_command_line); //strcpy(boot_command_line+off,pmode); printk("Kernelcommandline:%s\n",saved_command_line); } 终于看到了,就是在这里设置了androidboot.mode=charger属性。 继续跟进什么条件下才设置该属性,发现关机充电情况下,设置该属性,机子运行charger执行文件;这时候如果电源键按下超过两秒,charger执行文件重启机子,把标记设置为BOOT_MODE_CHARGE;重启后在驱动中,判断电量如果小于5%(可以修改该值),继续进入charger模式;否则不再设置androidboot.mode=charger属性,系统不会再执行charger文件,系统进入正常启动。

优秀的个人博客,低调大师

OpenAI 上线专属翻译网页,支持图片与文档

OpenAI 近日悄然上线了名为ChatGPT Translate的新功能。该网页版界面与 Google 翻译高度相似,目前已向所有用户开放,无需付费账户即可使用。 用户可以通过chatgpt.com/translate直接访问该工具。虽然外观极简,但其功能表现远超传统翻译软件: 多模态输入:支持粘贴文本、语音输入、附加文件,甚至可以上传标志或菜单的照片。 意译优先:与传统的逐字翻译不同,该功能旨在保留原文深层含义,并支持用户实时调整语气,如“商务正式”、“学术风”或“通俗易懂”。 对话式微调:与传统翻译工具最大的区别在于,翻译完成后用户可以继续与其对话,对特定词汇或句式进行追问和微调。 目前 OpenAI 尚未明确该功能背后搭载的具体模型,引发了外界关于其是否由GPT5.2驱动的猜测。 该功能暂时仅限网页端,Android 或 iOS 客户端尚未内置专属开关。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册