充电学习—5、healthed 电池服务

1、healthed服务监听接收内核kernel的电池事件,然后上传数据给framware层的batterysevice,BatteryService计算电池的电量,显示,绘制动画等

android电池系统框架:
在这里插入图片描述

2、healthd服务入口:android/system/core/healthd/healthd.cpp 中main函数

healthd_mode_ops是一个关于充电状态的结构体变量,main里面做healthed初始化,并做一个主循环持续

main函数中,首先根据传入的参数不同区分:开机充电、recovery、关机充电。这三种情况,然后指定不同的healthd_mode_ops回调函数

int main(int argc, char **argv) {
。。。。。。。。。。。。。。。//healthd_mode_ops是一个关于充电状态的结构体变量,healthd_mode_ops = &android_ops;//开机充电时,指向android_ops
。。。。。。。。。。。。。。。。。。。ret = healthd_init(); //healthed初始化
。。。。。。。。。。。。。。。。。。。healthd_mainloop(); //主循环
}

3、healthed_init函数:

static int healthd_init() {epollfd = epoll_create(MAX_EPOLL_EVENTS);//创建一个epoll变量if (epollfd == -1) {KLOG_ERROR(LOG_TAG,"epoll_create failed; errno=%d\n",errno);return -1;}//和板子级别的初始化,里面其实是一个空函数,什么也没做healthd_board_init(&healthd_config);//根据系统所处的模式,有三种情况的init,开机充电,关机充电,recoveryhealthd_mode_ops->init(&healthd_config);//wakealarm定时器初始化wakealarm_init();//uevent事件初始化,用以监听电池的uevent事件。uevent_init();//BatteryMonitor初始化。gBatteryMonitor = new BatteryMonitor();//创建batteryMonitor对象gBatteryMonitor->init(&healthd_config);//初始化batteryMonitor,打开/sys/class/power_supply,//遍历该节点下的电池参数初始化healthd的config参数return 0;
}

4、wakeupalarm_init函数:

static void wakealarm_init(void) {//创建一个wakealarm对应的定时器描述符wakealarm_fd = timerfd_create(CLOCK_BOOTTIME_ALARM, TFD_NONBLOCK);if (wakealarm_fd == -1) {KLOG_ERROR(LOG_TAG, "wakealarm_init: timerfd_create failed\n");return;}//将wakealarm事件注册到wakealarm_fd文件节点上以监听wakealarm事件。if (healthd_register_event(wakealarm_fd, wakealarm_event))KLOG_ERROR(LOG_TAG,"Registration of wakealarm event failed\n");//设置alarm唤醒间隔wakealarm_set_interval(healthd_config.periodic_chores_interval_fast);
}

5、BatteryService电池监听广播服务:

frameworks/base/services/core/java/com/android/server/BatteryService.java

//将电池监听注册到底层

public void onStart() {IBinder b = ServiceManager.getService("batteryproperties");final IBatteryPropertiesRegistrar batteryPropertiesRegistrar =IBatteryPropertiesRegistrar.Stub.asInterface(b);try {//注册电池监听,当底层电池电量发生变化调用此监听,并调用update。batteryPropertiesRegistrar.registerListener(new BatteryListener());} catch (RemoteException e) {// Should never happen.}publishBinderService("battery", new BinderService());publishLocalService(BatteryManagerInternal.class, new LocalService());
}

//当底层有信息时,会调用update更新BatteryService中相关值。

    private void update(BatteryProperties props) {synchronized (mLock) {if (!mUpdatesStopped) {mBatteryProps = props;// Process the new values.processValuesLocked(false);} else {mLastBatteryProps.set(props);}}}

processValuesLocked函数更新上报的电池信息:
电池电量、充电状态、低温关机、低电关机、电池状态、适配器插拔等
在这里:
//发送电池状态变换广播

  sendIntentLocked();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/854378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年设计、数字化技术与新闻传播国际学术会议(ICDDTJ 2024)

2024年设计、数字化技术与新闻传播国际学术会议(ICDDTJ 2024) 2024 International Conference on Design, Digital Technology and Journalism 会议地点:哈尔滨,中国 网址:www.icddtj.com 邮箱: icddtjsub-conf.com 投稿主题请注明:ICDD…

python之Bible快速检索器

内容将会持续更新,有错误的地方欢迎指正,谢谢! python之Bible快速检索器 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取! 助力快…

CSS入门基础2

目录 1.标签类型 2.块元素 3.行内元素 4.行内块元素 5.标签行内转换 6.背景样式 1.标签类型 标签以什么方式进行显示,比如div 自己占一行, 比如span 一行可以放很多个HTML标签一般分为块标签和行内标签两种类型: 块元素行内元素。 2.块…

数据结构进阶——AVL树

数据结构进阶——AVL树 0. 前言1. AVL树的概念2. AVL树节点,和树的定义3. AVL树的插入4. AVL树的旋转5. AVL树的验证6. AVL树的删除(了解)7. AVL树实现完整代码8. AVL树的性能 0. 前言 学习本章,需要大家先掌握搜索二叉树&#xf…

「6.18福利」精选大厂真题|笔试刷题陪伴|明天正式开屋啦 - 打卡赢价值288元丰厚奖励

🍰关于清隆学长 大家好,我是清隆,拥有ACM区域赛 银牌🥈,CCCC天梯赛 国一,PTA甲级 98 分。 致力于算法竞赛和算法教育已有 3 年,曾多次 AK 互联网大厂笔试,大厂实习经验丰富。 打卡…

新手如何入门Web3?

一、什么是Web3? Web3是指下一代互联网,它基于区块链技术,致力于将各种在线活动变得更加安全、透明和去中心化。Web3是一个广义的概念,涵盖了包括数字货币、去中心化应用、智能合约等在内的多个方面。它的主要特点包括去中心化、区…

cesium ClippingPolygon多边形裁切

1.多边形裁切 1.1 基本流程 cesium117版本添加了多边形裁切功能,本文分析源码,看看是如何处理的。多边形裁切的大概流程分为4部分: 通过经纬度坐标传入多个闭合的边界;将多个边界打包成两张纹理,一张是每个多边形的坐标&#xf…

语音识别相关文章整理目录

一、语音大模型架设与功能实现 使用sherpa-ncnn进行中文语音识别(ubuntu22)-CSDN博客文章浏览阅读953次,点赞30次,收藏26次。请注意,需要首先安装安装了所有必要的依赖项,包括 CMake、Git 和一个合适的 C/…

本地localhost与目标地址跨域问题的解决方法

场景 开发过程中遇到一个控件,上传图片到某cdn,目标地址对localhost会有跨域问题: 解决方法 参照此博客,将本地地址定义为某网址,如abc: win10修改本地host文件,用以增加自定义本地访问域名12…

装机后操作纪录

刚刚装完机 什么都没有 就像在一片一望无际的草原 要恢复原来笔记本的“秩序” 就像在这个草原建立全新的王国 1、关于显示器电脑屏幕图标巨大且糊的处理方法 用一台可正常使用的电脑,到主板官网下载相关驱动。(铭瑄B760M D4 WIFI驱动下载) 2、关于桌面没有显示“…

[Python学习篇] Python元组

元组(Tuple):元组是不可变的,一旦创建就不能修改其内容。这意味着你不能增加、删除或更改元组中的元素。元组使用小括号()表示。元组可以一次性存储多个数据,且可以存不同数据类型。 定义元组 语法: # 存…

GitLab安装部署以及bug修复

使用git,还需要一个远程代码仓库。常见的github、gitee这种远程代码仓库,公司中一般不会使用,因为他们是使用外网的,不够安全。一般企业都会搭建一个仅内网使用的远程代码仓库,最常见就是 GitLab 安装准备 需要开启s…

从11个视角看全球Rust程序员1/4:深度解读JetBrains最新报告

讲动人的故事,写懂人的代码 五个月前,编程界的大佬JetBrains发布了他们的全球开发者年度报告。 小吾从这份报告中找出了下面11个关于全球程序员如何使用Rust的有趣的趋势,让你学习和使用Rust更轻松。 1 这两年有多少程序员在工作中使用了Rust? 2 全球程序员使用Rust有多…

设备保养计划不再是纸上谈兵,智能系统让执行更到位!

在物业管理的日常工作中,我们常常听到“设备保养台账”“设备保养计划”“设备保养记录”等等这些词,但你是否真正了解它们的含义?是否知道一个完善的设备保养计划、记录、台账对于物业运营的重要性?今天,我们就来深入…

3大法则教你高效制定奖励规则(含参考案例)

在实施全民分销的过程中,SaaS产品方和合作伙伴推广者之间的合作关系可以用河马与牛椋鸟之间的共生关系来形容——牛椋鸟以栖息在河马背上并清理其身上的昆虫为生。这种关系对两者来说都是极其有益的:牛椋鸟获得了稳定的食物来源,而河马则有效…

使用宝塔面板部署Django应用(不成功Kill Me!)

使用宝塔面板部署Django应用 文章目录 使用宝塔面板部署Django应用 本地操作宝塔面板部署可能部署失败的情况 本地操作 备份数据库 # 备份数据库 mysqldump -u root -p blog > blog.sql创建requirements # 创建requirements.txt pip freeze > requirements.txt将本项目…

梳理Y3游戏编辑器入门者需要明白的基础概念

前言 Y3编辑器是网易开发的一款类似于“War3地图编辑器”的产品。 最近KK对战平台上不少热门的RPG地图都出自Y3编辑器: 最近我花了些时间学习了这款编辑器的基础知识。我发现其中很多概念是比较抽象需要理解的,而有些概念比如“物件”、“物体”、“物…

二叉树-根据先序遍历和中序遍历序列重建二叉树

目录 一、问题描述 二、解题思路 1.首先明确先序遍历和中序遍历的性质: 2.确定根节点及左右子树 3.对子树进行递归操作 4.递归返回条件 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 1.首先明确先序遍历和中序遍历的性质: 先序遍历&am…

Excel和Word等工具小技能分享汇编(一)

这里汇集刘小生前期微信公众号分享的Excel和Word等工具小技能,为方便大家查看学习,刘小生对其进行分类整理,后期也会不定期整理更新,如有想学习交流或其他小技巧需求,欢迎留言,我们一起学习进步&#xff01…

探索比特币多面体

目录 前言 一、比特币挖矿 1.挖矿设备的演化 2.矿池 二、比特币脚本 1.交易结构 2.交易的输入 3.交易的输出 4.P2PK 输入输出脚本的形式 实际执行情况 5.P2PKH 输入输出脚本的形式 实际执行情况 6.P2SH 输入输出脚本的形式 7.进一步说明 8.多重签名 9.脚本执…