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

news2024/12/24 21:00:37

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,开机充电,关机充电,recovery
    healthd_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.coloradmin.cn/o/1831661.html

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

相关文章

普通人如何入门AI人工智能?最短学习路线分享

学AI能干什么? 首先说一下我个人的观点,我认为未来一定会有很多很多人工的重复工作会被AI替代,并且这个趋势无法逆转,不管是你想象得到的行业还是想象不到的行业,从实体到互联网,从工业到家用,…

【Linux】进程_7

文章目录 五、进程8. 进程地址空间9. 进程终止10. 进程等待 未完待续 五、进程 8. 进程地址空间 我们上节知道了进程地址空间是根据页表来使虚拟地址转换成内存中的物理地址,那这种 地址空间 页表 的机制有什么好处呢?①这种机制可以将物理内存从无序…

基于TCAD与紧凑模型结合方法探究陷阱对AlGaN/GaN HEMTs功率附加效率及线性度的影响

来源:Investigation of Traps Impact on PAE and Linearity of AlGaN/GaN HEMTs Relying on a Combined TCAD–Compact Model Approach(TED 24年) 摘要 本文提出了一种新型建模方法,用于分析GaN HEMTs的微波功率性能。通过结合工…

劝你现在别秦L,不然得后悔死

文 | AUTO芯球 作者 | 雷慢 这真得听劝, 现在别急着买车,不然过不了两个月你得后悔死, 你现在看到秦L将B级车价格打下来了,就急着买车, 几个月后比亚迪还有更大的王炸,价格战还得更残酷! …

Thinkphp起名网宝宝起名网站源码

Thinkphp起名网宝宝起名网站源码 源码介绍 1.宝宝在线起名 2.八字起名,周易取名 3.一对一起名 5.支持手机wap 链接数据库地址:Application\Common\Conf 修改里面config.php数据库连接,导入sm.sql数据库文件即可 伪静态用thinkphp 后台…

销售如何提高回复客户消息的速度?

在如今竞争激烈的商业环境中,能够快速回复客户消息是维护客户关系和提升用户体验的重要一环。尤其是对于很多企业或是销售客服人员来说,及时回复客户的咨询和反馈,能够有效增强客户的粘性和满意度。 那么怎样才能快速回复客户消息呢&#xf…

剧本杀小程序开发,线上剧本杀游戏新体验

近几年,剧本杀行业快速崛起,吸引了广大年轻人的眼光,成为年轻人社交娱乐的新选择。剧本杀在线上也崭露头角,获得大众的关注,性价比高的优势成为了大众玩剧本杀的首要方式。 随着互联网的快速发展,年轻人都…

时间复杂度 空间复杂度分析

时间复杂度就是需要执行多少次&#xff0c;空间复杂度就是对象被创建了多少次。 O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(2^n) < O(n!) < O(n^n) 这里写目录标题 时间复杂度O(1)O(logn)、O(nlogn)O(mn)、O(m*n)最好、最坏情况时间复杂度平均情况…

利用反向代理编写HTTP抓包工具——可视化界面

手写HTTP抓包工具——可视化界面 项目描述语言golang可视化fynev2功能代理抓包、重发、记录 目录 1. 示例1.1 主界面1.2 开启反向代理1.3 抓包1.4 历史记录1.5 重发 2. 核心代码2.1 GUI2.1 抓包 3. 结语3.1 传送门 1. 示例 1.1 主界面 1.2 开启反向代理 1.3 抓包 1.4 历史记录…

AI写真:Stable Diffusion 之 IPAdapter-FaceId

自Stable Diffusion发布以来&#xff0c;AI写真一直是AIGC界的热门话题。 AI写真为摄影师和艺术家提供了全新的创作工具。通过AI技术&#xff0c;艺术家可以轻松实现复杂的图像效果&#xff0c;如风格迁移、图像合成等&#xff0c;AI写真能够在短时间内完成传统摄影师和设计师…

基于single flight来解决缓存击穿

目录 1. 缓存击穿2. 常见解决方案3.single flight方式3.1 模拟业务场景3.2 使用single flight的方式 缓存雪崩、缓存击穿、缓存穿透不单单是缓存领域的经典场景&#xff0c;更是面试当牛马时必备&#xff08;背&#xff09;八股文。 我们来讨论下缓存击穿场景下的解决方案。 …

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

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

Vue46-render函数

一、非单文件和单文件的main.js对比 1-1、非单文件的main.js 1-2、 单文件的main.js 将单文件的main.js中的render函数变成非单文件的main.js中的template形式&#xff0c;报如下错误&#xff1a; 解决方式&#xff1a; 二、解决方式 2-1、引入完成版的vue.js 精简版的vue&a…

Elixir学习笔记——Erlang 库

Elixir 提供了与 Erlang 库的出色互操作性。事实上&#xff0c;Elixir 不鼓励简单地包装 Erlang 库&#xff0c;而是直接与 Erlang 代码交互。在本节中&#xff0c;我们将介绍一些 Elixir 中没有的最常见和最有用的 Erlang 功能。 Erlang 模块的命名约定与 Elixir 不同&#x…

Windows电脑部署Jellyfin服务端并进行远程访问配置详细教程

文章目录 前言1. Jellyfin服务网站搭建1.1 Jellyfin下载和安装1.2 Jellyfin网页测试 2.本地网页发布2.1 cpolar的安装和注册2.2 Cpolar云端设置2.3 Cpolar本地设置 3.公网访问测试4. 结语 前言 本文主要分享如何使用Windows电脑本地部署Jellyfin影音服务并结合cpolar内网穿透工…

建筑效果图为啥要用渲染100?渲染100邀请码1a12

建筑效果图是建筑设计师向客户展示方案的重要手段&#xff0c;通常在完成建模和材质贴图后&#xff0c;设计师会把它通过本地电脑渲染出来&#xff0c;不过本地渲染效率低&#xff0c;时间长&#xff0c;所以很多时候设计师也会使用网渲平台&#xff0c;今天我们介绍的渲染100就…

onnx基本概念

onnx基本概念 参考 文章目录 onnx基本概念Input, Output, Node, Initializer, AttributesSerialization with protobuf元数据List of available operators and domains支持的类型Opset版本Subgraphs, tests and loopsExtensibilityFunctionsShape (and Type) Inferencetools O…

元宇宙三维虚拟场景制作平台为数字化营销发展注入了新的活力

​在数字化浪潮的推动下&#xff0c;我们迎来了全新的3D元宇宙场景在线制作编辑器&#xff0c;为您带来前所未有的创作体验。这款轻量级实时创作工具&#xff0c;让您轻松构建丰富的3D元宇宙场景&#xff0c;实现全网全终端的展示。 3D元宇宙场景在线制作编辑器拥有海量的3D模…

Go 并发控制:RWMutex 实战指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

HTML5新标签

HTML5 特点 新标签 <header>...<header> 头部标签 <footer>...<footer> 尾部标签 <section>...<section> 内容区块 <article>...&#xff0c;article> 表示页面中的独立内容 <aside>...<aside> 标签定义其所处…