Android 系统省电软件分析

1、硬件耗电

在这里插入图片描述
主要有:
1、屏幕
2、CPU
3、WLAN
4、感应器
5、GPS(目前我们没有)
电量其实是目前手持设备最宝贵的资源之一,大多数设备都需要不断的充电来维持继续使用。不幸的是,对于开发者来说,电量优化是他们最后才会考虑的的事情。但是可以确定的是,千万不能让你的应用成为消耗电量的大户

2、参考

在这里插入图片描述

2.1

在这里插入图片描述

2.2

Purdue University研究了最受欢迎的一些应用的电量消耗,平均只有30%左右的电量是被程序最核心的方法例如绘制图片,摆放布局等等所使用掉的,剩下的70%左右的电量是被上报数据,检查位置信息,定时检索后台广告信息所使用掉的。如何平衡这两者的电量消耗,就显得非常重要了。
在这里插入图片描述

2.3

在这里插入图片描述

2.4

在这里插入图片描述

3、WIFI耗电

在这里插入图片描述
在这里插入图片描述
前段时间做的省电主要是针对wifi的,三种情况下效果很明显:
1、桌面待机
2、任何应用Home键待机
3、用浏览器或者爱奇艺看视频待机,这种效果相当的明显,完全秒杀
小米平板;同时待机86个小时小米平板(6700毫安):没电自动关机
K1平板(4060毫安) :还剩68%
这样处理过后,平板待机时间至少是10天

4、后台应用

在这里插入图片描述在这里插入图片描述

目前我们做的做法是后台只保留一个后台程序。后期我们会考虑待机一定时间后,我们会把后台程序清理掉,这样会更省电。

5、APP提高续航

在这里插入图片描述
总体原则:提高性能
1、不作没有必要的工作
2、尽量避免内存分配
通常来讲,尽量避免创建短时临时对象.少的对象创建意味着低频的垃圾回收。而这对于用户体验产生直接的影响。
例:避免内部的Getters/Setters
在源生语言像C++中,通常做法是用Getters(i=getCount())代替直接字段访问(
i=mCount)。这是C++中一个好的习惯,因为编译器会内联这些访问,并且如果需要约束或者调试这些域的访问,你可以在任何时间添加代码。
而在Android中,这不是一个好的做法。虚方法调用的代价比直接字段访问高昂许多。通常根据面向对象语言的实践,在公共接口中使用Getters和Setters是有道理的,但在一个字段经常被访问的类中宜采用直接访问。
无JIT时,直接字段访问大约比调用getter访问快3倍。有JIT时(直接访问字段开销等同于局部变量访问),要快7倍。在Froyo版本中确实如此,但以后版本可能会在JIT中改进Getter方法的内联。

6、布局

在这里插入图片描述
总体原则:控件尽量少、尽量减少布局层次
1、Textview +Imageview → Textview+icon(android:drawableXXX)
2、多个LinearLayout→单个RelativeLayout
3、使用 标签来减少视图层级结构
4、通过 标签来重用layout代码
5、Layout_weight使用时,android:layout_width或者android:layout_height值尽量为0,而不是自适应,为什么?

View渲染流程
在这里插入图片描述

7、WakeLock

在这里插入图片描述
尽量减少唤醒屏幕的次数与持续的时间(屏幕是用电大户),用WakeLock来处理唤醒的问题,能够正确执行唤醒操作并根据设定及时关闭操作进入睡眠状态,使用wakelock.acquice() 方法,一定要加上超时处理(例如释放锁)。
使用场景:Android中通过各种Lock锁对电源进⾏行控制,比如保持通信和后台续连。
另一种思路:
不用冒着忘记释放Wakelock的风险,交给系统处理,也不用在manifest中设置权限,只在布局文件XML声明即可,当然也可以用函数:View.setKeepScreenOn()方法控制即可。
在这里插入图片描述

8、优化网络

在这里插入图片描述
1、设置网络超时时间包括连接超时和请求超时
2、触发网络请求的操作,每次都会保持无线信号持续一段时间,我们可以把零散的网络请求打包进行一次操作,避免过多的无线信号引起的电量消耗(例如APP的数据采集)。比如我们的大数据和推送等应用。
3、如果没有网络连接,你的应用跳过网络操作;只在有网络连接并且无漫游的情况下更新数据;
4、选择兼容的数据格式,把含有文本数据和二进制数据的请求全部转化成二进制数据格式请求;
5、使用高效的转换工具,多考虑使用流式转换工具,少用树形的转换工具;
在这里插入图片描述
很明显,使用流的方式解析效率要高一些,因为DOM解析是在对整个文档读取完后,再根据节点层次等再组织起来。而流的方式是边读取数据边解析,数据读取完后,解析也就完毕了。
在数据格式方面,JSON和Protobuf效率明显比XML好很多,XML和JSON大家都很熟悉,Protobuf是Google提出的,一种语言无关、平台无关、扩展性好的用于通信协议、数据存储的结构化数据串行化方法。
从上面的图中我们可以得出结论就是尽量使用SAX等边读取边解析的方式来解析数据,针对移动设备,最好能使用JSON之类的轻量级数据格式为佳。
6、如果可以的话,请使用framework的GZIP库来压缩文本数据以高效使用CPU资源。
在这里插入图片描述

9、调整定时更新的频率

在这里插入图片描述

int alarmType = AlarmManager.ELAPSED_REALTIME;
long interval = AlarmManager.INTERVAL_HOUR;
long start = System.currentTimeMillis() + interval;
alarmManager.setInexactRepeating(alarmType, start, interval, pi)

如果可以,请设置提醒的类型为ELAPSED_REALTIME or RTC而不是_WAKEUP;这样在系统睡眠的时候不会唤醒CPU。

10、数据库使用事务

在这里插入图片描述
1、首先Android数据库操作(特别是写操作)是非常慢的,将所有操作打包成一个事务能大大提高处理速度。
2、在setTransactionSuccessful和endTransaction之间不进行任何数据库操作。
在这里插入图片描述

11、Adapter标准

在这里插入图片描述
在这里插入图片描述

12、广播接收

在这里插入图片描述
1、尽量能不用静态注册就不要静态注册
2、尽量在onResume()和onPause()中进行注册与注销
3、广播用完后一定要记得注销

13、回收对象

在这里插入图片描述
JVM的回收机制给开发人员带来很大的好处,不用时刻处理对象的分配与回收,可以更加专注于更加高级的代码实现。相比起Java,C与C++等语言具备更高的执行效率,他们需要开发人员自己关注对象的分配与回收。

虽然Java有自动回收的机制,这不意味着Java中不存在内存泄漏的问题,在一个庞大的系统当中,还是免不了经常发生部分对象忘记回收的情况,而内存泄漏会很容易导致严重的性能问题。

内存泄漏指的是那些程序不再使用的对象无法被GC识别,这样就导致这个对象一直留在内存当中,占用了宝贵的内存空间。显然,这还使得每级Generation的内存区域可用空间变小,GC就会更容易被触发,从而引起性能问题。

寻找内存泄漏并修复这个漏洞是件很棘手的事情,你需要对执行的代码很熟悉,清楚的知道在特定环境下是如何运行的,然后仔细排查。

原始JVM中的GC机制在Android中得到了很大程度上的优化。Android里面是一个三级Generation的内存模型,最近分配的对象会存放在Young Generation区域,当这个对象在这个区域停留的时间达到一定程度,它会被移动到Old Generation,最后到Permanent Generation区域。
在这里插入图片描述

大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能。从设计师的角度,他们希望App能够有更多的动画,图片等时尚元素来实现流畅的用户体验。但是Android系统很有可能无法及时完成那些复杂的界面渲染操作。Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数操作都必须在16ms内完成。

我们通常都会提到60fps与16ms,可是知道为何会是以程序是否达到60fps来作为App性能的衡量标准吗?这是因为人眼与大脑之间的协作无法感知超过60fps的画面更新。

12fps大概类似手动快速翻动书籍的帧率,这明显是可以感知到不够顺滑的。24fps使得人眼感知的是连续线性的运动,这其实是归功于运动模糊的效果。24fps是电影胶圈通常使用的帧率,因为这个帧率已经足够支撑大部分电影画面需要表达的内容,同时能够最大的减少费用支出。但是低于30fps是无法顺畅表现绚丽的画面内容的,此时就需要用到60fps来达到想要的效果,当然超过60fps是没有必要的。
16=1000/60

通常来说,单个的GC并不会占用太多时间,但是大量不停的GC操作则会显著占用帧间隔时间(16ms)。如果在帧间隔时间里面做了过多的GC操作,那么自然其他类似计算,渲染等操作的可用时间就变得少了。

Android对GC做了大量的优化操作,虽然执行GC操作的时候会暂停其他任务,可是大多数情况下,GC操作还是相对很安静并且高效的。但是如果我们对内存的使用不恰当,导致GC频繁执行,这样就会引起不小的性能问题

有些对象的回收不能依赖系统GC,比如:XmlPullParserFactory and BitmapFactory …

14、onDraw方法

在这里插入图片描述
自定义View中的onDraw方法也需要引起注意,每次屏幕发生绘制以及动画执行过程中,onDraw方法都会被调用到,避免在onDraw方法里面执行复杂的操作,避免创建对象。对于那些无法避免需要创建对象的情况,我们可以考虑对象池模型,通过对象池来解决频繁创建与销毁的问题,但是这里需要注意结束使用之后,需要手动释放对象池中的对象。

但是不幸的是,对于那些过于复杂的自定义的View(重写了onDraw方法),Android系统无法检测具体在onDraw里面会执行什么操作,系统无法监控并自动优化,也就无法避免Overdraw了。但是我们可以通过canvas.clipRect()来帮助系统识别那些可见的区域。这个方法可以指定一块矩形区域,只有在这个区域内才会被绘制,其他的区域会被忽视。这个API可以很好的帮助那些有多组重叠组件的自定义View来控制显示的区域。同时clipRect方法还可以帮助节约CPU与GPU资源,在clipRect区域之外的绘制指令都不会被执行,那些部分内容在矩形区域内的组件,仍然会得到绘制。
在这里插入图片描述

15、工具

在这里插入图片描述

15.1、hierarchyviewer

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.2、Lint(官方代码优化利器)

Android Lint是SDK Tools 16 (ADT 16)之后才引入的工具,通过它对Android工程源代码进行扫描和检查,可发现潜在的问题,以便程序员及早修正这个问题。Android Lint提供了命令行方式执行,还可与IDE(如Eclipse)集成,并提供了html形式的输出报告。
官网:http://tools.android.com/tips/lint
在这里插入图片描述

16、其他

在这里插入图片描述

1、动画
2、传感器
3、清理缓存和垃圾文件
.
.
.

觉得本文对您有用,麻烦点赞、关注、收藏,您的肯定是我创作的无限动力,谢谢!!!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文笔记:仅一个进程故障就无法达成共识

仅一个进程故障就无法达成共识 仅一个进程故障指的是在异步的分布式系统中 摘要 异步系统的共识问题(consensus)涉及一组进程,其中有的进程可能不可靠(unreliable)。共识问题要求可靠的进程一致地从两个侯选中决定&…

揭秘电子杂志制作流程,从零开始

​随着数字媒体的发展,电子杂志已经成为一种新型的传播媒介。今天,我将为你揭秘电子杂志的制作流程,带你从零开始,轻松入门。 第一步:确定主题和内容 在开始制作电子杂志之前,你需要确定一个主题&#xff…

实时追踪维修进度,报修管理小程序让你省心又省力!

随着生活、工作节奏的日益加快,日常的售后报修、故障报修处理流程给我们带来种种困扰。我们都知道大多数企业、个人用户还在使用传统报修方式,如电话报修、纸质报修单等方式,不仅效率低下,而且难以追踪维修进度,给我们…

思维导图怎么画?6个软件轻松教你自己画出思维导图

思维导图怎么画?6个软件轻松教你自己画出思维导图 思维导图是一种用来展示思维结构、组织信息和解决问题的图形化工具。它以中心主题为核心,通过分支节点展开相关子主题,形成树状结构,帮助用户更清晰地理解和表达思想。下面介绍的六款软件可…

RedisTemplate操作Redis详解之连接Redis及自定义序列化

连接到Redis 使用Redis和Spring时的首要任务之一是通过IoC容器连接到Redis。为此,需要java连接器(或绑定)。无论选择哪种库,你都只需要使用一组Spring Data Redis API(在所有连接器中行为一致):…

商务分析方法与工具(十):Python的趣味快捷-公司财务数据最炫酷可视化

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

无尘室手套的选定标准

无尘室手套的选定标准主要包括以下几个方面: 材料选择: 考虑与应用的相容性,例如某些化学品可能对某些材料产生反应。是否存在乳胶过敏也是一个重要的考虑因素。常见的选择包括丁腈手套,它们通常比乳胶手套更耐用且化学稳定性更…

01-02-5

1、单链表中按位置查找 a.原理 通过传递的位置,返回该位置对应的地址,放到主函数定义的指针变量中。 我们认为位置从:有数据的节点开始计数 即如下结构: 查找位置,就是返回该位置对应的空间地址。 b.代码说明 Ⅰ…

【送书福利第七期】你好!Java(文末送书)

文章目录 编辑推荐内容简介作者简介目录前言/序言 编辑推荐 适读人群 :程序员;相关院校师生 本书以轻松幽默的语言,从零开始介绍Java语言。书名来源于编程语言中最经典的Hello World程序,寓意带读者从入门到精通。 书中每章都设有总结与扩展…

triton之gemm

一 原理 如果不采用group gemm的话,采用单流执行,则具体的硬件执行调度如下所示: gemm0,gemm1,gemm2同时分配任务给sm做 第一轮:gemm0、gemm1和gemm2的0-4分给4个sm去做,都计算完成 第二轮:gemm0在上一轮已经计算完毕,gemm1和gemm2的45分给sm0,sm1去做,在这一轮…

react18【系列实用教程】JSX (2024最新版)

为什么要用 JSX? JSX 给 HTML 赋予了 JS 的编程能力 JSX 的本质 JSX 是 JavaScript 的语法扩展,浏览器本身不能识别,需要通过解析工具(如babel)解析之后才能在浏览器中运行。 bable 官网可以查看解析过程 JSX 的语法 …

NeurIPS‘24 截稿日期逼近 加拿大温哥华邀你共赴盛会

会议之眼 快讯 第38届NeurIPS24(Conference and Workshop on Neural Information Processing Systems)即神经信息处理系统研讨会将于 2024 年 12月9日-15日在加拿大温哥华会议中心举行! NeurIPS 每一年都是全球AI领域的一场盛宴,吸引着来自世界各地的顶…