Android电量相关知识
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。
目录
- 一、导读
- 二、概览
- 三、 查看耗电情况
- 3.1 注册广播 ACTION_BATTERY_CHANGED
- 3.2 battery historion
- 3.3 手机设置
- 3.4 命令行
- 3.5 AOP & 代理hook
- 四、优化思路
- 五、 推荐阅读

一、导读
我们继续总结学习知识,温故知新。
本文主要讲了一些电量相关知识。
二、概览
电量的消耗在线上是难以量化,目前没有很好的方式能精准的获取到线上用户电量消耗情况,所以电量测试在线下非常关键,
我们要测试重点业务耗电相关的场景,以及app处于后台时耗电量**(后台静默测试)**、app网络请求时机及请求次数。
特别是一些比价耗电的场景,如:
- Camera、Audio、Video、Bluetooth、Network、Wakelock、Sensor、Radio、Screen、WIFI、CPU、GPS
三、 查看耗电情况
模块电量(mAh) = 模块电流(mA)* 模块耗时(h)
厂商在 /frameworks/base/core/res/res/xml/power_profile.xml 文件中提供了组件的电源配置文件。
3.1 注册广播 ACTION_BATTERY_CHANGED
这种方式拿到的信息相对较少。
IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_BATTERY_CHANGED);Intent intent = registerReceiver(null, filter);int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
我们可以获取到电池的电量、电池状态,但这个不能反应单个app的耗电情况。
这里得到的数据都是手机整体电量,对排查耗电帮助也不到。
3.2 battery historion
可以拿到精准的电量信息及使用信息
Battery Historian 是一个工具,用于在运行 Android 5.0 Lollipop(API 级别 21)及更高版本的 Android 设备上检查电池相关信息和事件,
而设备未插入电源。它允许应用程序开发人员在时间轴上可视化系统和应用程序级事件通过平移和缩放功能,可以轻松查看自设备上次充满电以来的各种汇总统计数据,
并选择一个应用程序并检查影响所选应用程序特定电池的指标。它还允许对两个错误报告进行 A/B 比较,突出显示关键电池相关指标的差异。
github 地址
google 地址
- 安装docker
- 安装battery historion
- 准备数据
先重置
adb shell dumpsys batterystats --resetadb shell dumpsys batterystats --enable full-wake-history导出
adb bugreport bugreport.zip
- 查看数据 & 分析
具体使用可自行学习。
3.3 手机设置
在手机设置里面也可以查看耗电排行,但是只有一个总的数据,不能定位哪里耗电,没啥大作用。
3.4 命令行
adb shell dumpsys batterystats > battery.txt
batterystats 所记录的电量统计数据源自于 BatteryStatsService-电量统计服务,其实现类为 BatteryStatsImpl,内部正是使用的 PowerProfile 。
BatteryStatsImpl 为每一个应用创建与之对应的 UID 来监控器系统资源的使用情况,其统计了 12 大模块的电量消耗,如下所示:
- Camera、Audio、Video、Bluetooth、Network、Wakelock、Sensor、Radio、Screen、WIFI、CPU、GPS
在 battery.txt 搜索 ‘Estimated power use’ 关键字,可以看到大概的信息。
3.5 AOP & 代理hook
我们可以通过 aop 辅助统计耗电组件,如果耗电组件在用户的使用过程中使用过多,
那么则可以辅助断定这个用户可能出现了耗电的情况,那我们就要去了解一下情况。
我们也可以通过代理对应的 Service 实现,完成收集 Wakelock、Alarm、GPS 的申请堆栈、释放信息、手机充电状态等等。
public abstract class ProxyHook extends Hook implements InvocationHandler {/*** 要代理的真实对象* 持有的被代理对象,就是你要代理谁*/private Object proxyObj;public ProxyHook(Context context) {super(context);}public void setProxyObj(Object proxyObj) {this.proxyObj = proxyObj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {HookedMethodHandler hookedMethodHandler = mBaseHookHandle.getHookedMethodHandler(method);if (hookedMethodHandler != null){// beforeInvoke(receiver, method, args); 方法开始// 执行方法调用Object invokeResult = hookedMethodHandler.doHookInner(proxyObj, method, args);// afterInvoke(receiver, method, args, invokeResult); 方法执行结束return invokeResult;}return method.invoke(proxyObj, args);}
}
@Overridepublic void onInstall() {Object oldObj = mContext.getSystemService(Context.ALARM_SERVICE);Class<?> clazz = oldObj.getClass();try {// 获取原始mService字段Field field = clazz.getDeclaredField("mService");field.setAccessible(true);// 返回指定对象上此 Field 表示的字段的值// IAlarmManager mService;final Object mService = field.get(oldObj);// 设置被代理对象,也可以通过构造方法传入setProxyObj(mService);// 创建代理Object proxyObject = Proxy.newProxyInstance(this.getClass().getClassLoader(), mService.getClass().getInterfaces(), this);// 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。其实就是给 mService 重新赋值代理对象field.set(oldObj, proxyObject);/* 这里举个简单的例子,将用户的年龄修改为33//获取public 修饰的 指定字段名称的Field类,包含父类字段Field field = clazz.getField("age");field.set(user, 33);*/} catch (NoSuchFieldException e) {} catch (IllegalAccessException e){}}
源码下载
四、优化思路
在实际使用中,一般耗电比较多的场景有视频播放、定位、复杂运算、wakelock、网络等,
所以要避免后台长时间使用耗电组件。
同时,也可以通过 cpu profiler 查看是否处于高cpu运行状态,定位 CPU 占用率异常方法。
然后针对网络请求的优化,能使用wifi就使用wifi(用 WIFI 连接网络时的功耗要低于使用移动网络的功耗),
蜂窝移动网络下需要对请求时机及次数控制,能不请求就不请求,合理设计请求时机,禁止使用轮询,导致网络请求一直处于激活状态。
在就是定位,根据场景谨慎选择定位模式:对定位准确度没那么高的场景可以选择低精度模式,或者网络定位代替 GPS,根据业务来合理
设计请求频率,使用后要及时关闭。
用户页面上比如动画要及时关闭,后台不执行等等。
大家在具体项目中具体分析。
五、 推荐阅读
Java 专栏
SQL 专栏
数据结构与算法
Android学习专栏

相关文章:
Android电量相关知识
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、 查看耗电情况3.1 注册广播 ACTION…...
【Java多线程】线程中几个常见的属性以及状态
目录 Thread的几个常见属性 1、Id 2、Name名称 3、State状态 4、Priority优先级 5、Daemon后台线程 6、Alive存活 Thread的几个常见属性 1、Id ID 是线程的唯一标识,由系统自动分配,不同线程不会重复。 2、Name名称 用户定义的名称。该名称在各种…...
鸿蒙OS跨进程IPC与RPC通信
一、IPC与RPC通信概述 基本概念 IPC(Inter-Process Communication)与RPC(Remote Procedure Call)用于实现跨进程通信,不同的是前者使用Binder驱动,用于设备内的跨进程通信,后者使用软总线驱动…...
Effective Objective-C 学习(三)
理解引用计数 Objective-C 使用引用计数来管理内存:每个对象都有个可以递增或递减的计数器。如果想使某个对象继续存活,那就递增其引用计数:用完了之后,就递减其计数。计数变为 0时,就可以把它销毁。 在ARC中…...
蓝桥杯备赛攻略
背景 第十五届蓝桥杯大赛快要到比赛的时间了,按照惯例省赛就在4月9号开赛。有很多的小伙伴都报名了这次比赛,也有很多的同学问我应该怎么训练,什么水平可以拿奖。我自己也已经参加过两届蓝桥杯大赛了,拿到过国赛三等奖࿰…...
react反向代理
http-proxy-middleware 使用npm安装 npm i -D http-proxy-middleware 文档 点击查看 关键代码 const { createProxyMiddleware } require(http-proxy-middleware);module.exports function(app) {app.use(/api, // api开头的地址的请求createProxyMiddleware({target: ht…...
债券专题二:可转债估值-二叉树模型
1. 模型背景 由于可转债自身的属性较多,因此对其定价的难度也会加大,在诸多影响因素中,未来的股价占比最高。由于股价的不可预测性,导致了可转债的定价在实际交易中作用非常有限。随着可转债发行数量和规模的增大,越…...
【闲谈】开源软件的崛起与影响
随着信息技术的快速发展,开源软件已经成为软件开发的趋势,并产生了深远的影响。开源软件的低成本、可协作性和透明度等特点,使得越来越多的企业和个人选择使用开源软件,促进了软件行业的繁荣。然而,在使用开源软件的过…...
【教程】Linux使用aria2c多线程满速下载
转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 安装aria2c: sudo apt-get install aria2多线程下载: aria2c -x 16 -s 16 <url> 比如: aria2c -x 16 -s 16 http://images.cocodataset.org/zips/test2017.zip...
【漏洞复现】蓝网科技临床浏览系统信息泄露漏洞
Nx01 产品简介 蓝网科技临床浏览系统是一个专门用于医疗行业的软件系统,主要用于医生、护士和其他医疗专业人员在临床工作中进行信息浏览、查询和管理。 Nx02 漏洞描述 蓝网科技临床浏览系统存在信息泄露漏洞,攻击者可以利用该漏洞获取敏感信息。 Nx03…...
JSON转换List<Map<String, Object>>、Map<String, Object>
废话就不说了 早上10点研究到现在 获取redis的JSON字符串 String getPalletListNew redisService.getRedis(“getPalletListNew”, abroad “” goodsLevel “” startPort “” destinationPort “” maxTon “” minTon); 转换Map<String,Object> public …...
单主模式和多主模式切换
1 组复制模式切换注意点 组复制有两种运行模式,一种是单主模式,一种是多主模式。这个模式是在整个组中设置的,由 group_replication_single_primary_mode 这个系统变量指定,而且在所有成员上必须保持一致。ON 表示单主模式&#…...
petalinux2018.3安装步骤
1、虚拟机安装ubuntu-16.04.7-desktop-amd64.iso (注意:安装ubuntu-18.04.6-desktop-amd64.iso和ubuntu-16.04.6-desktop-i386.iso会报以下错误) environment: line 314: ((: 10 #15~1 > 10 #3: syntax error in expression (error toke…...
ubuntu22.04下使用conda安装pytorch(cpu及gpu版本)
本文介绍了conda下安装cpu、gpu版本的pytorch;并介绍了如何设置镜像源 ubuntu环境安装pytorch的CPU版本与GPU版本 系统:ubuntu22.04 显卡:RTX 3050 依赖工具:miniconda 确认环境 lsb_release -a No LSB modules are available.…...
突破编程_C++_高级教程(模板编程的基础知识)
1 模板编程的基本概念 C 的模板编程是一种编程技术,它允许程序员编写处理不同类型数据的通用代码。通过使用模板,可以创建与特定数据类型无关的函数或类,这些函数或类在编译时可以根据需要生成特定数据类型的版本。这增加了代码的复用性、灵…...
胆小勿入!AI创作恐怖电影宣传片《生化危机:重生》
胆小勿入!AI创作恐怖电影宣传片《生化危机:重生》 "The city is falling, and the dead walk among us." "In the shadow of the apocalypse, the fight for survival begins." "The streets are silent, but the nightmare …...
HTTP 超文本传送协议
1 超文本传送协议 HTTP HTTP 是面向事务的 (transaction-oriented) 应用层协议。 使用 TCP 连接进行可靠的传送。 定义了浏览器与万维网服务器通信的格式和规则。 是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。 H…...
MySQL导入/导出数据
MySQL导入/导出数据 文章目录 MySQL导入/导出数据一、MySQL 导入数据1、mysql 命令导入2、source 命令导入3、使用 LOAD DATA 导入数据4、使用 mysqlimport 导入数据4.1、mysqlimport的常用选项介绍 二、MySQL 导出数据1、使用 SELECT ... INTO OUTFILE 语句导出数据2、mysqldu…...
Matplotlib初探:认识数据可视化与Matplotlib
Matplotlib初探:认识数据可视化与Matplotlib Fig.1 利用Matplotlib进行数据可视化( 可视化代码见文末) 🌵文章目录🌵 🌳引言🌳🌳一、数据可视化简介🌳🌳二、Matplotlib库简介&#x…...
LeetCode 0987.二叉树的垂序遍历:遍历时存节点信息,遍历完自定义排序
【LetMeFly】987.二叉树的垂序遍历:遍历时存节点信息,遍历完自定义排序 力扣题目链接:https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/ 给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
