Android电量优化,让你的手机续航更持久

server/2024/9/23 4:16:51/

节能减排,从我做起。一款Android应用如果非常耗电,是一定会被主人嫌弃的。自从Android手机的主人用了你开发的app,一天下来,也没干啥事,电就没了。那么他就会想尽办法找出耗电量杀手,当他找出后,很有可能你开发的app就被无情的卸载了。为了避免这种事情发生,我们就要想想办法让我们的应用不那么耗电,电都用在该用的时候和地方。

通过power_profile.xml查看各个手机硬件的耗电量

Google要求手机硬件生产商都要放入power_profile.xml文件到ROM里面。有些不太负责的手机生产商,就乱配,也没有真正测试过。但我们还是可以大概知道耗电的硬件都有哪些。

先从https://ibotpeaches.github.io/Apktool/ 下载apktool反编译工具,然后执行adb命令,将手机framework的资源apk拉取出来。

adb pull /system/framework/framework-res.apk ./

然后我们用下载好的反编译工具,将framework-res.apk进行反编译。

java -jar apktool_2.7.0.jar d framework-res.apk

apktool_2.7.0.jar换成你下载的具体的jar包名称。
power_profile.xml文件的目录如下:

framework-res/res/xml/power_profile.xml

<?xml version="1.0" encoding="utf-8"?>
<device name="Android"><item name="ambient.on">0.1</item><item name="screen.on">0.1</item><item name="screen.full">0.1</item><item name="bluetooth.active">0.1</item><item name="bluetooth.on">0.1</item><item name="wifi.on">0.1</item><item name="wifi.active">0.1</item><item name="wifi.scan">0.1</item><item name="audio">0.1</item><item name="video">0.1</item><item name="camera.flashlight">0.1</item><item name="camera.avg">0.1</item><item name="gps.on">0.1</item><item name="radio.active">0.1</item><item name="radio.scanning">0.1</item><array name="radio.on"><value>0.2</value><value>0.1</value></array><array name="cpu.active"><value>0.1</value></array><array name="cpu.clusters.cores"><value>1</value></array><array name="cpu.speeds.cluster0"><value>400000</value></array><array name="cpu.active.cluster0"><value>0.1</value></array><item name="cpu.idle">0.1</item><array name="memory.bandwidths"><value>22.7</value></array><item name="battery.capacity">1000</item><item name="wifi.controller.idle">0</item><item name="wifi.controller.rx">0</item><item name="wifi.controller.tx">0</item><array name="wifi.controller.tx_levels" /><item name="wifi.controller.voltage">0</item><array name="wifi.batchedscan"><value>.0002</value><value>.002</value><value>.02</value><value>.2</value><value>2</value></array><item name="modem.controller.sleep">0</item><item name="modem.controller.idle">0</item><item name="modem.controller.rx">0</item><array name="modem.controller.tx"><value>0</value><value>0</value><value>0</value><value>0</value><value>0</value></array><item name="modem.controller.voltage">0</item><array name="gps.signalqualitybased"><value>0</value><value>0</value></array><item name="gps.voltage">0</item>
</device>

抓到不负责任的手机生产商一枚,好家伙,这么多0.1,明眼人一看就知道这是为了应付Google。尽管这样,我们还是可以从中知道,耗电的有Screen(屏幕亮屏)、Bluetooth(蓝牙)、Wi-Fi(无线局域网)、Audio(音频播放)、Video(视频播放)、Radio(蜂窝数据网络)、Camera的Flashlight(相机闪光灯)和GPS(全球定位系统)等。

电量杀手简介

Screen

屏幕是非常耗电的一个硬件,不要问我为什么。屏幕主要有LCD和OLED两种。LCD屏幕白色光线从屏幕背后的灯管发出,尽管屏幕显示黑屏,依旧耗电,这种屏幕逐渐被淘汰,如果你翻出个早点的功能机,或许能看到。那么大部分Android手机都是OLED的屏幕,每个像素点都是独立的发光单元,屏幕黑屏时,所有像素都不发光。有必要时,让屏幕息屏很重要,当然手机也有自动息屏的时间设置,这个不太需要我们操心。

Radio数据网络和Wi-Fi无线网络

网络也是非常耗电的,其中又以数据网络的耗电更多于Wi-Fi的耗电。所以请尽量引导用户使用Wi-Fi网络使用app的部分功能,比如下载文件。

GPS

GPS也是很耗电的硬件,所以不要动不动就请求地理位置,GPS平常是要关闭的,除非你在使用定位和导航等功能,这样你的手机续航会更好。

WakeLock

如果使用了WakeLock,是可以有效防止息屏情况下的CPU休眠,但是如果不用了,你不释放掉锁的话,则会带来很大的电量的开销。

查看手机耗电的历史记录
// 上次拔掉电源到现在的耗电情况
adb shell dumpsys batterystats --unplugged

你在逗我?让我看命令行的输出?后面我们来使用Battery Historian的图表进行分析。

使用Battery Historian分析手机耗电量

安装Docker

Docker下载网址 https://docs.docker.com/desktop/install/mac-install/

使用Docker容器编排

docker run -p 9999:9999 gcr.io/android-battery-historian/stable:3.0 --port 9999

获取bugreport文件

Android7.0及以上

adb bugreport bugreport.zip

Android6.0及以下

adb bugreport > bugreport.txt

上传bugreport文件进行分析

在浏览器地址栏输入http://localhost:9999
截屏2023-02-05 05.39.12.png
点击Browse按钮并上传bugreport.zip或bugreport.txt生成分析图表。
截屏2023-02-05 05.44.59.png
我们可以通过时间轴来分析应用当下的电池使用情况,比较耗电的是哪部分硬件。

使用JobScheduler来合理执行后台任务

JobScheduler是Android5.0版本推出的API,允许开发者在符合某些条件时创建执行在后台的任务。比如接通电源的情况下才执行某些耗电量大的操作,也可以把一些不紧急的任务在合适的时候批量处理,还可以避开低电量的情况下执行某些任务。

谨慎使用加入电池使用白名单

各个品牌的手机都有加入到电池使用白名单的设置的,需要用户手动开启,但是这势必会大大加大电量的开销。所以,没有必要就不要乱申请白名单了。


http://www.ppmy.cn/server/47451.html

相关文章

浅谈MySQL事务

目录 一&#xff0c;事务的引入 上述的特性叫做“原子性”&#xff08;事务最核心操作&#xff0c;事务还具备别的性质在下文&#xff09;&#xff1b; 二&#xff0c;日志体系 三&#xff0c;事务的使用 四&#xff0c;事务的基本特性 1.脏读&#xff1a; 2.不可重复读 …

Unity3D 基于YooAssets的资源管理详解

前言 Unity3D 是一款非常流行的游戏开发引擎&#xff0c;它提供了丰富的功能和工具来帮助开发者快速创建高质量的游戏和应用程序。其中&#xff0c;资源管理是游戏开发中非常重要的一部分&#xff0c;它涉及到如何有效地加载、管理和释放游戏中的各种资源&#xff0c;如模型、…

1.3 寻找灵感:认知系谱图

一个比较具体的例子&#xff0c;你有一个母亲和一个父亲&#xff0c;你同时拥有他们的特点&#xff0c;但你还会有一些自己独有的特点。你继承了你爸妈的基因&#xff0c;还包括他们祖先的基因。 和你拥有一个家族系谱一样&#xff0c;你也拥有一个知识系谱。它不是来自你的家…

Dinky FlinkSQL Doris读取写入

Dinky运行前开启全局变量&#xff0c;以支持使用&#xff1a; sink.sink.label-prefix ${idUtil.simpleUUID()} Mysql同步Doris - testMysqlCdcDoris&#xff1a; EXECUTE CDCSOURCE demo_doris WITH (connector mysql-cdc,hostname 172.xxx,port 3306,username xxx,pas…

Java Keyword

文章目录 Java Keyword一、基本数据类型相关关键字(8个)&#xff08;1&#xff09;byte&#xff1a;单字节类型&#xff08;2&#xff09;short&#xff1a;短整型&#xff08;3&#xff09;int&#xff1a;整型&#xff08;4&#xff09;long&#xff1a;长整型&#xff08;5&…

MAX7219(模拟SPI)驱动灯环的简单应用

文章目录 一、MAX7219是什么&#xff1f;二、使用步骤1.硬件1.1 引脚说明1.2 应用电路1.2.1 驱动数码管1.2.2 驱动点阵 2.软件2.1 时序2.2 寄存器2.2.1 掉电寄存器2.2.2 译码模式寄存器2.2.3 亮度寄存器2.2.4 扫描寄存器2.2.5 显示测试寄存器 2.3 初始化2.4 控制左侧灯环特定位…

Go 语言中基础数据类型、运算符、类型转换与类型别名

在编程语言中&#xff0c;数据类型是程序设计的基石&#xff0c;它们决定了变量的存储方式、允许的操作以及运算结果。在 Go 语言中&#xff0c;数据类型丰富而灵活&#xff0c;提供了强大的工具来处理各种数据和运算需求。无论是简单的布尔值、整型和浮点型&#xff0c;还是复…

【JAVA架构】开发在线开具电子发票系统

【JAVA架构VUE】开发在线开具电子发票系统 对接税务厂家接口 实现销售发票开具 进项发票在线拉取 红冲发票在线开具 详细内容可以关注本人专栏等 销售发票开具 开具发票 进项发票在线拉取 红冲发票在线开具