Android 进阶——性能优化之电量优化全攻略及实战小结(一)

news2024/11/16 12:04:33

文章大纲

  • 引言
  • 一、偷懒至上的原则
  • 二、低电耗模式
    • 1、低电耗模式概述
    • 2、低电耗模式限制
    • 3、适配适应低电耗模式
  • 三、应用待机模式
    • 对其他用例的支持

引言

电池续航时间是移动用户体验中最重要的一个方面。没电的设备完全无法使用。因此,对于应用来说,尽可能地考虑电池续航时间是至关重要的。为使应用保持节能,有三点需要注意:

  • 让应用变得“偷懒至上”。
  • 充分利用可帮助您管理应用耗电量的平台功能。
  • 使用可帮助您找出耗电源头的工具。

当测试或者其他人反馈耗电问题时,bug report结合Battery Historian是最好的排查方法。

//7.0和7.0以后
$ adb bugreport bugreport.zip
//6.0和6.0之前:
$ adb bugreport > bugreport.txt
//通过historian图形化展示结果
python historian.py -a bugreport.txt > battery.html
在这里插入图片描述

一、偷懒至上的原则

让应用变得“偷懒至上”是指设法减少和优化特别耗电的操作,“偷懒至上”设计背后的核心问题包括:

  • 减少操作:您的应用是否存在可删减的多余操作?例如,是否可以缓存已下载的数据,而不是反复唤醒无线装置来重新下载数据?
  • 推迟操作:应用是否需要立即执行某项操作?例如,是否可以等到设备充电后再将数据备份到云端?
  • 合并操作:工作是否可以批处理,而不是多次将设备置于活动状态?例如,是否真的有必要让数十个应用分别在不同时间打开无线装置发送消息?是否可以改为在无线装置单次唤醒期间传输消息?

在使用 CPU、无线装置和屏幕时,您应该考虑这些问题。“偷懒至上”设计通常可以很好地优化这些耗电因素。

二、低电耗模式

从 Android 6.0(API 级别 23)开始,Android 引入了两项省电功能:低电耗模式和应用待机模式通过管理应用在设备未连接至电源时的行为方式,帮助用户延长电池寿命。

1、低电耗模式概述

当用户长时间未使用设备时,低电耗模式会延迟应用的后台 CPU 和网络活动,从而降低耗电量。如果用户未插接设备的电源,在屏幕关闭的情况下,让设备在一段时间内保持不活动状态,那么设备就会进入低电耗模式。在低电耗模式下,系统会:

  • 尝试通过限制应用访问占用大量网络和 CPU 资源的服务来节省电量。
  • 会阻止应用访问网络,并延迟其作业、同步和标准闹钟。

系统会定期退出低电耗模式一小段时间,让应用完成其延迟的活动。在此维护期内,系统会运行所有待处理的同步、作业和闹钟,并允许应用访问网络。

在这里插入图片描述

在每个维护期结束时,系统会再次进入低电耗模式,暂停网络访问并推迟作业、同步和闹钟。随着时间的推移,系统安排维护期的次数越来越少,这有助于在设备未连接至充电器的情况下长期处于不活动状态时降低耗电量。一旦用户通过移动设备、打开屏幕或连接至充电器唤醒设备,系统就会立即退出低电耗模式,并且所有应用都会恢复正常活动

2、低电耗模式限制

在低电耗模式下,您的应用会受到以下限制:

  • 暂停访问网络。
  • 系统忽略唤醒锁定。
  • 标准 AlarmManager 闹钟(包括 setExact()setWindow())推迟到下一个维护期。
    • 如果您需要设置在设备处于低电耗模式时触发的闹钟,请使用 setAndAllowWhileIdle()setExactAndAllowWhileIdle()
    • 使用 setAlarmClock() 设置的闹钟将继续正常触发,系统会在这些闹钟触发之前不久退出低电耗模式。
  • 系统不执行 WLAN 扫描。
  • 系统不允许运行同步适配器。
  • 系统不允许运行 JobScheduler

3、适配适应低电耗模式

低电耗模式可能会对应用产生不同的影响,具体取决于应用提供的功能和使用的服务。许多应用无需修改即可在低电耗模式周期内正常运行。在某些情况下,您必须优化应用管理网络、闹钟、作业和同步的方式。应用应该能够在每个维护期内高效地管理活动。低电耗模式尤其可能会影响 AlarmManager 闹钟和定时器管理的活动,因为当系统处于低电耗模式时,不会触发 Android 5.1(API 级别 22)或更低版本中的闹钟。为了帮助安排闹钟,Android 6.0(API 级别 23)引入了两种新的 AlarmManager 方法:setAndAllowWhileIdle()setExactAndAllowWhileIdle()。通过这些方法,您可以设置即使设备处于低电耗模式也会触发的闹钟。

注意setAndAllowWhileIdle()setExactAndAllowWhileIdle() 为每个应用触发闹钟的频率都不能超过每 9 分钟一次。

低电耗模式对网络访问的限制也有可能影响应用,特别是当应用依赖于操作消息或通知等实时消息时更是如此。如果应用需要与网络建立持久性连接来接收消息,您应尽可能使用 Firebase 云消息传递 (FCM)。要确认应用在低电耗模式下的行为方式符合预期,您可以使用 adb 命令强制系统进入和退出低电耗模式并观察应用的行为。如需了解详情,请参阅在低电耗模式和应用待机模式下进行测试。

三、应用待机模式

应用待机模式会延迟用户近期未与之交互的应用的后台网络活动。当设备处于低电耗模式时,应用对某些高耗电量资源的访问会延迟到维护期,应用待机模式允许系统判定应用在用户未主动使用它时是否处于闲置状态。当用户有一段时间未触摸应用时,系统便会作出此判定,但以下条件均不适用:

  • 用户明确启动应用。

  • 应用当前有一个进程在前台运行(作为活动或前台服务,或者正在由其他活动或前台服务使用)。

    注意:您只能将前台服务用于用户希望系统立即执行或不中断的任务。 此类情况包括将照片上传到社交媒体,或者即使在音乐播放器应用不在前台运行时也能播放音乐。您不应该只是为了阻止系统判定您的应用处于闲置状态而启动前台服务。

  • 应用生成用户可在锁定屏幕或通知栏中看到的通知。

  • 应用是正在使用中的设备管理应用(例如设备政策控制器)。虽然设备管理应用通常在后台运行,但永远不会进入应用待机模式,因为它们必须保持可用性,以便随时从服务器接收策略。

当用户将设备插入电源时,系统会从待机状态释放应用,允许它们自由访问网络并执行任何待处理的作业和同步。如果设备长时间处于闲置状态,系统将允许闲置应用访问网络,频率大约每天一次。 未主动使用应用、一段时间未触摸应用进入以下情况不会进入:

  • 用户显式启动应用。
  • 应用当前有一个进程位于前台(表现为 Activity 或前台服务形式,或被另一 Activity 或前台服务占用)。
  • 应用生成用户可在锁屏或通知托盘中看到通知时。

通过运行以下命令强制应用进入应用待机模式:

$ adb shell dumpsys battery unplug

$ adb shell am set-inactive true

使用以下命令模拟唤醒应用:

$ adb shell am set-inactive false

$ adb shell am get-inactive

对其他用例的支持

通过妥善管理网络连接、闹钟、作业和同步以及使用高优先级 FCM 消息,几乎所有应用都应该能够支持低电耗模式。对于一小部分用例,这可能还不够。对于此类用例,系统提供了一个可配置的白名单,将部分免除低电耗模式和应用待机模式优化的应用列入其中。

在低电耗模式和应用待机模式期间,列入白名单的应用可以使用网络并保留部分唤醒锁定。不过,列入白名单的应用仍会受到其他限制,就像其他应用一样。例如,列入白名单的应用的作业和同步会延迟(在搭载 API 级别 23 及更低级别的设备上),并且其常规 AlarmManager 闹钟不会触发。应用可以调用 isIgnoringBatteryOptimizations() 来检查它当前是否在豁免白名单中。用户可以依次转到设置 > 电池 > 电池优化来手动配置该白名单。另外,系统也提供了一些方法,让应用要求用户将其列入白名单。

  • 应用可以触发 ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS Intent,让用户直接转到电池优化,以便他们在其中添加该应用。
  • 具有 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 权限的应用可以触发一个系统对话框,让用户直接将该应用添加到白名单,而无需转到“设置”。此类应用将通过触发 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS Intent 来触发该对话框。
  • 用户可以根据需要从白名单中手动移除应用。

在要求用户将您的应用添加到白名单之前,请确保该应用符合列入白名单的可接受用例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98374.html

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

相关文章

数据库拆分4--sharding-jdbc-spring-boot-starter自动装配启动过程

学习一下springboot是如何整合sharding-jdbc的。 添加依赖以后 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version> </dependency…

Java8之JMX与MBean

参考文章&#xff1a; 《JMX超详细解读》 《JMX》 写在开头&#xff1a;本文为学习后的总结&#xff0c;可能有不到位的地方&#xff0c;错误的地方&#xff0c;欢迎各位指正。 在学习tomcat源码架构的时候了解到其中使用了JMX来实现一些管理工作&#xff0c;于是便整理了这篇…

Linux systemd-run unit封装CGroup资源进行任务运行

Linux systemd-run 封装资源使用 序 之前我们讲了关于 systemctl 对各种服务或者说是 unit 进行了讲解&#xff0c;也讲了怎么创建一个 unit&#xff0c;进行相关配置或者依赖设置等等。在使用 systemctl status xxx 时&#xff0c;我们可以发现对应的资源使用情况&#xff0…

JSTL标签库 | 深入解析JSTL标签库

目录 一&#xff1a;深入解析JSTL标签库 1、什么是JSTL标签库 2、使用JSTL标签库的步骤 3、JSTL标签的原理 4、jstl中的核心标签库core当中常用的标签 一&#xff1a;深入解析JSTL标签库 1、什么是JSTL标签库 ①Java Standard Tag Lib&#xff08;Java标准的标签库&am…

电脑文件不小心删除了怎么恢复 ? 删除的文件如何恢复文件?

如果误删电脑文件后&#xff0c;如何恢复文件&#xff1f; 电脑删除文件是很经常的事&#xff0c;为了电脑运行更快我们经常都会清理&#xff0c;但是有时候也会出现不小心删除重要文件的情况。如何恢复删除的文件&#xff1f;本文总结的2种常用方法可以帮助到你。 方法1、注册…

惠普CP1025 因转印离合器导致打印不全大片空白的问题

问题症状 自检只打印出一部分, 后面大部分都是空白. 如果是碳盒缺粉, 应该是均匀地浅或者空白, 如果是成像鼓的问题, 应该是从上到下成条状的不均匀, 这样显示一节后空白的情况是没见过, 上网查有类似的问题 惠普CP1025彩色激光打印机打印图像前半部有字后半部白纸惠普1025打印…

Java框架:Spring框架

文章目录一、Spring概念二、Spring特征三、Spring基本架构3.1Spring体系结构3.2Core Container(核心容器)3.3Data Access/Integration(数据访问/集成)3.4Web(MVC/Remoting)3.5Test(测试)3.6AOP(面向切面编程)四、Spring主要jar包五、Spring用到的设计模式一、Spring概念 什么是…

vue学习笔记(三)-组件化编程基础

概念 传统方式与组件化对比 存在问题 1.依赖关系混乱 2.代码复用率不高 模块与组件、模块化与组件化的关系 模块 a.理解&#xff1a;向外提供特定功能的 js 程序&#xff0c;一般就是一个 js 文件 b.为什么&#xff1a;js 文件很多很复杂 c.作用&#xff1a;复用、简化 …

【Docker技术内幕】(十二)使用docker安装Kafka

目录 一、准备工作 1、安装docker 2、设置加速镜像 二、开始安装 1、启动容器 三、验证Kafka是否安装成功 四、部署kafka-manager 一、准备工作 1、安装docker 参考 【Docker技术内幕】&#xff08;四&#xff09;Linux环境下安装docker 2、设置加速镜像 vim /etc/do…

C语言 数据存储 char int 数据存储 关于原码反码补码

上图 前五个整形是整形家族&#xff0c;为什么char也是 因为他是字符型 字符实际存储的时候寸的是这个的ascll值 ascll值是个整数 除了以上两种 还有构造类型 又叫自定义类型 为什么又数组类型 如下代码 arr和【】的内容都可以自定义 为什么出现以上情况.(ffff 是16进制表示…

第二证券|通过磁铁制造功率更大的电动汽车电池

德克萨斯大学奥斯汀分校的研讨人员表明&#xff0c;一个更厚的电极&#xff0c;经过磁优化的离子道路&#xff0c;能够使充电更快&#xff0c;充电之间的功率更大。 研讨人员制作了一种具有‘快速通道’摆放的电极&#xff0c;以进步充电速度和续航路程。 研讨人员发现了一种共…

Apache Hudi 数据湖介绍

目录​​​​​​​ Apache Hudi 数据湖介绍 Hudi 历程 Hudi Features Apache Hudi 数据湖介绍 Apache Hudi&#xff08;发音为“hoodie”&#xff09;是下一代流媒体数据湖平台源于Uber 。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的追加…

[附源码]Nodejs计算机毕业设计基于云数据库的便民民宿租赁系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

人人都能看懂的Spring底层原理,看完绝对不会懵逼

人人都能看懂的Spring原理&#xff0c;绝对不会懵逼为什么要使用Spring&#xff1f;Spring的核心组件Spring是如何实现IOC和DI的&#xff1f;定义了BeanDefinition扫描加载BeanDefinition根据BeanDefinition进行Bean的实例化和初始化实例化属性赋值保存到单例缓冲池一个Bean从创…

docker高级篇2-分布式存储之三种算法

面试题&#xff1a; 1~2亿条数据需要缓存&#xff0c;请问如何设计这个缓存案例&#xff1f; 答&#xff1a;单机单台100%是不可能的。肯定是分布式缓存的。那么用Redis如何落地&#xff1f; 一般有三种方案&#xff1a; 哈希取余分区&#xff1b;一致性哈希算法分区&#…

HttpRunner4.x 安装与使用

HttpRunner4.x 安装与使用HttpRunner4.x 安装与使用安装使用运行脚手架项目方式一&#xff1a;录制生成用例步骤1&#xff1a;导出har文件步骤2&#xff1a;转化成测试用例文件步骤3&#xff1a;执行测试用例方式二&#xff1a;手工编写测试用例HttpRunner4.x 安装与使用 以下…

卡塔尔世界杯终局之战,阿根廷VS法国,是老将加冕还是新王登基?

【世界杯】阿根廷VS法国 不知不觉&#xff0c;世界杯已经走到最后的尾声&#xff0c;此前经历的28天&#xff0c;63场比赛皆是铺垫&#xff0c;卢赛尔体育场将会迎来2022卡塔尔世界杯最终的决赛&#xff0c;究竟是梅西球王加冕还是法国卫冕世界杯冠军&#xff0c;今晚23&#x…

KNN算法 鸢尾花种类预测

目录 一&#xff1a;KNN原理 二&#xff1a;数据处理 三&#xff1a;超参调试、模型保存及使用 四&#xff1a;鸢尾花种类预测 详细步骤 一&#xff1a;KNN原理 从训练集中找到跟待测数据最近的k条记录 根据这些记录的分类决定新数据的分类 主要因素包括有&#xff1a;K邻…

java------JVM之类加载和双亲委派机制

类加载器&#xff1a;加载.class文件。 将新建的对象放入堆里面&#xff0c;而对象的引用(地址)放到栈&#xff0c;其中引用指向堆里面对应的对象。 1-启动类加载器&#xff0c;负责加载jre\lib目录下的rt.jar包c编写&#xff0c;加载java核心库 java.*,构造ExtClassLoader和A…

[CocosCreator]封装行为树(一)

(老规矩:广告位留给自己) 欢迎喜欢或者从事CocosCreator开发的小伙伴请加入我的大家庭CocosCreator游戏开发Q群:26855530 行为树的定义:控制AI实体决策流程的分层节点树。游戏中Npc的活动,或者主角挂机行为都十分依赖行为树,本章开始,封装适用CococCreator使用的TypeScript行…