当前位置: 首页 > news >正文

AOSP12_BatteryStats统计电池数据信息

前言

BatteryStats模块主要用于设备在电池供电是系统对各个模块电量使用的统计,Android提供的Battery Historain工具就是对此模块统计的数据进行解析和展示。

一 BatteryStats模块类图

模块主要类图如下:见根目录的模块类图

  • BatteryStats:抽象类,本模块的核心类,主要定义多个内部类,内部类主要包括Uid、Timer等;

  • BatteryStatsImpl:核心实现类,负责电池数据的统计计算,其实现亮BatteryStats中所有的抽象内部类,这些类用于不同统计实现;

  • Uid:针对每个进程的uid设置,用于统计不同uid下进程的耗电数据,如wakelock、sensor、Proc等数据;

  • BatteryStatsService:系统中battersystats服务,提供binder接口,但电池数据计算工作是在BatteryStatsImpl中;

  • BatteryStatsHelper:负责计算软件和硬件等各个模块的耗电数据,提供给设置、手机管家等模块展示;

  • BatterySipper:表示每一个耗电模块的数据统计。

二 BatteryStats启动过程

BatteryStats服务是在AMS中启动,其启动时序图如下: ActivityManagerService->BatteryStatsService:new BatteryStatsService->BatteryStatsImpl:new & setPowerProfileLocked ActivityManagerService->BatteryStatsService:initPowerManagement

2.1 初始化BatteryStatsService

ActivityManagerService->BatteryStatsService:new

在AMS的构造函数中初始化BatteryStatsService对象,读取统计文件中已经保存的信息,同时开启异步信息记录,设置回调,在AMS的onStart中发布服务。 BatteryStatsService构造函数主要初始化Handler、耗电统计和计算类BatteryStatsImpl,设置耗电参考指标参数等。

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

    public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {...// TODO: Move creation of battery stats service outside of activity manager service.mBatteryStatsService = new BatteryStatsService(systemContext, systemDir,BackgroundThread.get().getHandler());mBatteryStatsService.getActiveStatistics().readLocked();mBatteryStatsService.scheduleWriteToDisk();mOnBattery = DEBUG_POWER ? true: mBatteryStatsService.getActiveStatistics().getIsOnBattery();mBatteryStatsService.getActiveStatistics().setCallback(this);...}BatteryStatsService(Context context, File systemDir, Handler handler) {...HandlerThread = new HandlerThread("batterystats-handler");mHandlerThread.start();mHandler = new Handler(mHandlerThread.getLooper());mStats = new BatteryStatsImpl(systemDir, handler, this,this, mUserManagerUserInfoProvider);mWorker = new BatteryExternalStatsWorker(context, mStats);mStats.setExternalStatsSyncLocked(mWorker);mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger(com.android.internal.R.integer.config_radioScanningTimeout) * 1000L);mStats.setPowerProfileLocked(new PowerProfile(context));mStats.startTrackingSystemServerCpuTime();...}

2.2 BatteryStatsImpl初始化:

  1. 创建存储文件、校准文件和每日文件;

  2. 创建handler信息,注此looper为AMS提供;

  3. 初始化各类型timer和counter,每一种类型的对应一类事件。

工具类主要有三类,

  • StopwatchTimer负责计时统计

  • LongSamplingCounter负责计数、

  • ControllerActivityCounterImpl包含多个负责计数的类对象,比如数据收发包统计

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

    public BatteryStatsImpl(Clocks clocks) {...if (systemDir == null) {mStatsFile = null;mBatteryStatsHistory = new BatteryStatsHistory(mHistoryBuffer);} else {mStatsFile = new AtomicFile(new File(systemDir, "batterystats.bin"));mBatteryStatsHistory = new BatteryStatsHistory(this, systemDir, mHistoryBuffer);}mCheckinFile = new AtomicFile(new File(systemDir, "batterystats-checkin.bin"));mDailyFile = new AtomicFile(new File(systemDir, "batterystats-daily.xml"));...mHandler = new MyHandler(handler.getLooper());...initTimersAndCounters();...initTimes(uptimeUs, realtimeUs);...}
2.2.1 初始化全局Timer

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

    void initTimes(long uptimeUs, long realtimeUs) {mStartClockTimeMs = mClocks.currentTimeMillis();mOnBatteryTimeBase.init(uptimeUs, realtimeUs);mOnBatteryScreenOffTimeBase.init(uptimeUs, realtimeUs);mRealtimeUs = 0;mUptimeUs = 0;mRealtimeStartUs = realtimeUs;mUptimeStartUs = uptimeUs;}
2.2.2 初始化Uid进程Timer

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

        public Uid(BatteryStatsImpl bsi, int uid, long elapsedRealtimeMs, long uptimeMs) {mBsi = bsi;mUid = uid;/* Observer list of TimeBase object in Uid is short */mOnBatteryBackgroundTimeBase = new TimeBase(false);mOnBatteryBackgroundTimeBase.init(uptimeMs * 1000, elapsedRealtimeMs * 1000);/* Observer list of TimeBase object in Uid is short */mOnBatteryScreenOffBackgroundTimeBase = new TimeBase(false);mOnBatteryScreenOffBackgroundTimeBase.init(uptimeMs * 1000, elapsedRealtimeMs * 1000);mUserCpuTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase);mSystemCpuTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase);mCpuActiveTimeMs = new LongSamplingCounter(mBsi.mOnBatteryTimeBase);mCpuClusterTimesMs = new LongSamplingCounterArray(mBsi.mOnB

相关文章:

AOSP12_BatteryStats统计电池数据信息

前言 BatteryStats模块主要用于设备在电池供电是系统对各个模块电量使用的统计,Android提供的Battery Historain工具就是对此模块统计的数据进行解析和展示。 一 BatteryStats模块类图 模块主要类图如下:见根目录的模块类图 BatteryStats:抽象类,本模块的核心类,主要定…...

【Android Studio】UI 布局

文章目录 view布局LinearLayout view 在Android开发中,View是一个非常重要的概念,它是所有用户界面组件的基类。View类及其子类构成了Android应用中的用户界面。每个View都占用屏幕上的一个矩形区域,并可以响应用户输入(如触摸、按…...

虚拟机Windows server忘记密码解决方法

原理 utilman.exe是Windows辅助工具管理器程序,‌虽然它本身不是一个关键的系统进程,‌但通过修改这个文件,‌用户可以访问一些有用的UI设置。‌在某些情况下,‌比如忘记密码需要重置时,‌通过修改utilman.exe文件为c…...

【香橙派系列教程】(六)嵌入式SQLite数据库

【六】嵌入式SQLite数据库 文章目录 【六】嵌入式SQLite数据库1.简介2.SQLite数据库安装3.SQLite命令用法1.创建数据库2.创建和查看表格3.插入查看数据(记录)4.删除更改数据(记录) 4.SQLite编程操作1.打开/创建数据库的C接口2.创建…...

深入探讨PHP8的新特性与性能优化

本文由 ChatMoney团队出品 随着互联网技术的飞速发展,PHP作为后端开发领域的热门语言也在不断演进。近期,PHP8的发布引起了广泛关注。本文将为您详细介绍PHP8的新特性以及性能优化,并通过具体示例帮助您更好地理解和应用这些新特性。 一、PH…...

2024年06月 Scratch 图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共10题,共30分) 第1题 运行下列程序,输入单词“PLAY”,最后角色说?( ) A:LY4AP B:AP4LY C:YA4PL D:PL4AY 答案:B 根据程序分析可知,首先获取单词字符数,然后奇数位的字母放在字符数左侧,偶数位…...

书生大模型全链路开源体系

书生大模型全链路开源体系 数据 预训练 微调 评测 部署 应用...

极简聊天室-websocket版(双向通信)

我们知道WebSocket是可以双向通信的,把极简聊天室代码又改了一下,前端发信息到后端也使用websocket,其实代码量更少了。。。 const express require(express); const app express(); var wsServer require(express-ws)(app)var msgs[];ap…...

从小白到架构师 | 缓存预热

缓存预热指的是在系统启动或上线前,提前将经常访问的数据加载到缓存中,以避免在系统刚启动时,用户大量请求直接访问数据库,导致数据库压力过大或系统性能下降。通过缓存预热,可以确保系统一上线就能提供快速的响应时间…...

Modbus -- TCP协议

MODBUS TCP协议是一种基于TCP/IP协议的Modbus变种,它允许Modbus协议在以太网网络上运行,使得设备之间可以通过IP网络交换数据。 一:协议概述 modbus_TCP协议:走的是网口,所以需要创建TCPclient对象进行通信,和modubus-RTU协议最大的区别是&a…...

python四舍五入取整数

在Python中,如果你想要对一个浮点数进行四舍五入并取整(即只保留整数部分),你可以使用内置的round()函数,但不指定第二个参数(即小数位数),或者明确指定为0。这样,Python…...

洛谷 P1868 饥饿的奶牛

原题 题目描述 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字。 现用汉语翻译为: 有 N 个区间,每个区间x,y 表示提供的x∼y 共y−x1 堆优质牧草。你可以选择任意区间但不…...

Arco Design 之Table表格

此篇文章为table表格示例&#xff0c;包含列、data数据、展开、选中、自定义等相关属性 基础表格 <a-table :columns"columns1" :data"tableData1" />const columns1 [{ title: "编号", dataIndex: "no"},{ title: "名称…...

Python机器学习 模型

Python机器学习模型、回归预测模型、数据清洗、数据处理、数据挖掘、数据分析代做。 模型不仅限于线性回归、逻辑回归、决策树、SVM、随机森林、贝叶斯、XGBoost、LightGBM、CatBoost&#xff0c;聚类&#xff1a;K-Means、DBSCAN&#xff0c;机器学习都可。 时间序列分析&…...

基于 STM32 的 NAS私有云盘搭建:集成LwIP 协议、HTTP/HTTPS、WEB前端技术栈(代码示例)

项目概述 在本项目中&#xff0c;我们将搭建一个基于 STM32 的 NAS&#xff08;网络附加存储&#xff09;私盘&#xff0c;通过网络访问存储在外部 SATA 硬盘上的文件。该项目将使用 STM32 开发板、外接 SATA 硬盘、LwIP 协议栈以及 FATFS 文件系统来实现文件的上传、下载和管…...

蓝屏?死机?爆CPU?多开卡顿?你有关心过你的硬盘吗?

上来先叠甲 蓝屏、死机、爆cpu、多开卡顿&#xff0c;不一定是硬盘的问题&#xff0c;只是硬盘有问题都可能会引起这些现象&#xff0c;所以不要遇到这些问题就一定认为是硬盘的问题然后说我说的&#xff0c;只是给你一个排除问题的思路。本文会采用比较通俗所以不太专业的角度…...

Flutter开发报错error: unable to unlink old ‘pubspec.yaml‘: Invalid argument

背景&#xff1a;主分支master&#xff0c;然后每人1个分支&#xff0c;每次push到自己分支后&#xff0c;再提mr到master。 于是每次提交前要先git merge origin/master。 有时候会报这个错误&#xff0c;无法merge 原因&#xff1a;很简单&#xff0c;就是pubspec.yaml这个文…...

零基础进程最详解:进程状态、僵尸进程、孤儿进程、阻塞态、挂起态、进程切换、进程常用命令、进程创建、队列优先级

目录 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 一、进程状态 二、僵尸和孤儿进程 1、僵尸进程 Z&#xff08;zombie&#xff09; 2、孤儿进…...

Redis的分布式锁

目录 一、定义与原理 基于Redis的分布式锁 获取锁 释放锁 锁误删问题&#xff1a;因为key值一样,将别人的锁删掉了 锁误判问题二&#xff1a;判断锁和释放锁不是原子性的 Lua脚本 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁 分布式锁的优点…...

C++笔记---类和对象

1. 类的定义 类是C中的一种自定义类型&#xff0c;是某个具体事物或概念的抽象化代码表示&#xff0c;通过类的成员&#xff08;变量函数/方法&#xff09;&#xff0c;可以表征出事物或概念的特征。 1.1 类定义的格式 class Stack { public:// 成员函数void Init(int n 4)…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...