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初始化:
-
创建存储文件、校准文件和每日文件;
-
创建handler信息,注此looper为AMS提供;
-
初始化各类型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表格示例,包含列、data数据、展开、选中、自定义等相关属性 基础表格 <a-table :columns"columns1" :data"tableData1" />const columns1 [{ title: "编号", dataIndex: "no"},{ title: "名称…...
Python机器学习 模型
Python机器学习模型、回归预测模型、数据清洗、数据处理、数据挖掘、数据分析代做。 模型不仅限于线性回归、逻辑回归、决策树、SVM、随机森林、贝叶斯、XGBoost、LightGBM、CatBoost,聚类:K-Means、DBSCAN,机器学习都可。 时间序列分析&…...
基于 STM32 的 NAS私有云盘搭建:集成LwIP 协议、HTTP/HTTPS、WEB前端技术栈(代码示例)
项目概述 在本项目中,我们将搭建一个基于 STM32 的 NAS(网络附加存储)私盘,通过网络访问存储在外部 SATA 硬盘上的文件。该项目将使用 STM32 开发板、外接 SATA 硬盘、LwIP 协议栈以及 FATFS 文件系统来实现文件的上传、下载和管…...
蓝屏?死机?爆CPU?多开卡顿?你有关心过你的硬盘吗?
上来先叠甲 蓝屏、死机、爆cpu、多开卡顿,不一定是硬盘的问题,只是硬盘有问题都可能会引起这些现象,所以不要遇到这些问题就一定认为是硬盘的问题然后说我说的,只是给你一个排除问题的思路。本文会采用比较通俗所以不太专业的角度…...
Flutter开发报错error: unable to unlink old ‘pubspec.yaml‘: Invalid argument
背景:主分支master,然后每人1个分支,每次push到自己分支后,再提mr到master。 于是每次提交前要先git merge origin/master。 有时候会报这个错误,无法merge 原因:很简单,就是pubspec.yaml这个文…...
零基础进程最详解:进程状态、僵尸进程、孤儿进程、阻塞态、挂起态、进程切换、进程常用命令、进程创建、队列优先级
目录 强烈建议全文阅读!!! 强烈建议全文阅读!!! 强烈建议全文阅读!!! 一、进程状态 二、僵尸和孤儿进程 1、僵尸进程 Z(zombie) 2、孤儿进…...
Redis的分布式锁
目录 一、定义与原理 基于Redis的分布式锁 获取锁 释放锁 锁误删问题:因为key值一样,将别人的锁删掉了 锁误判问题二:判断锁和释放锁不是原子性的 Lua脚本 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁 分布式锁的优点…...
C++笔记---类和对象
1. 类的定义 类是C中的一种自定义类型,是某个具体事物或概念的抽象化代码表示,通过类的成员(变量函数/方法),可以表征出事物或概念的特征。 1.1 类定义的格式 class Stack { public:// 成员函数void Init(int n 4)…...
全国区块链职业技能大赛样题第9套后端源码
后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 项目预览 登录 用户管理...
3个功能强大的PDF转换工具,免费试用
给大家分享3个功能强大能满足更高需求的PDF转换工具,都提供免费的试用机会。 1.嗨动PDF编辑器 一款多功能的PDF编辑软件,集PDF阅读、PDF转换、PDF编辑功能为一体。支持转换的格式多样,转换速度快,转换后的排版和内容与原文保持一…...
表单修改数字输入框保留小数点
1.在表单设计打开修改的表单 2.打开需要修改的字段 3.按F12,进入“开发模式” 4.开启“开发者工具”左上角检索工具 开启:鼠标左键点击,当图标颜色为蓝色 关闭:鼠标左键点击,当图标颜色为灰色 5.鼠标移动到需要修改的…...
[VS Code扩展]写一个代码片段管理插件(一):介绍与界面搭建
文章目录 VS Code扩展机制项目搭建创建UI元素活动栏按钮主边栏视图主边栏工具栏按钮侧边栏右键菜单编辑器右键菜单 项目地址 [VS Code扩展]写一个代码片段管理插件(一):介绍与界面搭建[VS Code扩展]写一个代码片段管理插件(二&…...
vxe grid slots 用法
官方例子:Vxe Table v3.8 {field: num1,title: Num1,showHeaderOverflow: true,filters: [{ data: }],editRender: { autofocus: .my-input },slots: {// 使用插槽模板渲染default: num1_default,header: num1_header,footer: num1_footer,filter: num1_filter,edi…...
【网络】基于UDP协议的聊天室(第二篇)
目录 UDP服务器 UDP客户端 在C中,使用UDP协议进行网络通信通常涉及到socket编程。下面我将给出基于UDP的简单的客户端和服务器示例代码。这些示例将使用C标准库以及POSIX套接字接口(主要适用于Linux和类Unix系统)。如果你在使用Windows&…...
【SpringBoot3】场景整合(实战)
0 环境准备 0.0 云服务器 阿里云、腾讯云、华为云 服务器开通; 按量付费,省钱省心 安装以下组件:docker、redis、kafka、prometheus、grafana 下载windterm: https://github.com/kingToolbox/WindTerm/releases/download/2.5…...
【全网最全最详细】MYSQL 面试题大全(上)
目录 一、关系型数据库和非关系型数据库主要有哪些区别? 二、MYSQL的数据存储一定是基于硬盘的吗? 三、InnoDB和MyISAM有什么区别? 四、MyISAM的索引结构是怎么样的?存在的问题是什么? 五、char和varchar的区别? 六、MYSQL 5.x和8.0有什么区别? 七、为什么大厂不…...
【C语言】程序环境,预处理,编译,汇编,链接详细介绍,其中预处理阶段重点讲解
目录 程序环境 翻译环境 1. 翻译环境的两个过程 2. 编译过程的三个阶段 执行环境 预处理(预编译) 1. 预定义符号 2. #define 2.1 用 #define 定义标识符(符号) 2.2 用 #define 定义宏 2.3 #define 的替换规则 2.4 # 和 ## 的用法 2.5 宏和函数 2.6 #undef …...
人生低谷来撸C#--021 多线程
1、概念 线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。 线程是轻量级进程。一个使用线程的常见实例是现代操作系统中…...
岳阳整站优化/关键词搜索推广
UINavigationController详解 通过这个接口可以初始化自定义的工具栏和导航栏 - (instancetype)initWithNavigationBarClass:(Class)navigationBarClass toolbarClass:(Class)toolbarClass NS_AVAILABLE_IOS(5_0) 使用水平滑动过渡。如果视图控制器已在堆栈中在调用就没有效果 -…...
网页设计网站设计欣赏/阿里巴巴关键词排名优化
oracle数据库根据不同条件给同一字段修改相应的值:例如:根据职务调整雇员的工资,如果职务为“SALESMAN”或者“ANALYST”工资上调100元,如果职务为“MANAGER”工资上调200元,其它职务工资上调50元。update empset sal(casewhen jo…...
怎么查有做网站的公司有哪些/seo 知乎
zebra http://www.zebra.org/ quagga http://www.quagga.net/...
做网站要多少像素/做竞价托管的公司
大家都知道使用线程的2种方式,一是继承Thread类,二是实现Runnable接口。实际上,即使你实现了Runnable接口,终于还是要构造一个Thread类的对象。看过Thread源码发现,事实上这个Thread类也实现了Runnable接口,…...
佛山顺德容桂网站制作/seo虚拟外链
一、在项目的根目录下新建external文件夹 二、将你要导入的包放入external文件夹 三、在你要导入的包的根目录内,执行go mod init example.com/xxx/xxx,把包名替换为你自己的; 四、打开你项目的go.mod文件,引入你要引入的包&am…...
绿色在线网站/服务营销的七个要素
...