功耗优化- https://blog.csdn.net/zhangbijun1230/article/category/7541658
android 功耗优化- https://blog.csdn.net/zhangbijun1230/article/category/7618452
MTK 驱动- https://blog.csdn.net/zhangbijun1230/article/category/7494418
高通驱动- https://blog.csdn.net/zhangbijun1230/article/category/7494419
手机modem开发- https://blog.csdn.net/zhangbijun1230/article/category/6500603
Android App耗电发热分析,adb shell dumpsys batterystats ;
这个命令可以打印出于电池消耗相关的信息,可以通过,adb shell dympsys batterystats > D:/batterystats.txt ;
Android功耗评测系列之——软件评测方案原理- https://www.cnblogs.com/Yanss/p/10146839.html
processAppUsage()方法中,一个应用的总功耗在这里体现出来了:
cpu;Wakelock(保持唤醒锁); 数据天线(2G/3G/4G);WIFI;蓝牙;传感器;相机;闪光灯;
量测电流波形需要采样精度高,而且能保存整个电流变化为文件形式的专业工具。
PowerMonitor- https://www.msoon.com/LabEquipment/PowerMonitor/
Android功耗值测量- https://www.jianshu.com/p/bf4cf01c4450
设备制造商必须提供组件功耗配置文件/frameworks/base/core/res/res/xml/power_profile.xml
要测定电源配置文件的值,请使用测量设备使用功耗的硬件,并执行所需信息的各种操作。测量这些操作期间的所用功耗并计算值(根据需要从其他基线所用功耗中获得差异)。
对于运行Android 7.0的设备,系统会收集低能耗(LE)扫描和蓝牙网络流量(如RFCOMM和L2CAP)的数据,并将这些活动与启动应用程序相关联。
android 功耗 android 功耗分析方法和优化- https://blog.csdn.net/zhangbijun1230/article/details/80164118
- 高通平台
一般情况下的底电流参考数据上限是:
512M RAM < 1.5mA; 1G RAM < 2mA; 2G RAM < 2.6mA
通过top命令,可以查询到cpu占用较高的应用。如果一个应用一直在占用cpu,而此时并没有打开该应用,那么该应用很可能会导致待机异常。adb shell
CPU/GPU的动态调频调压可以优化手机的功耗表现。该影响是整体性的,系统性的。
CPU降频主要通过两种方式实现,都可以达到降频的目标:
1、设置CPU工作在powersave模式。设置该模式后,CPU将一直工作在最低频率(300000hz)。此时手机最省电,但是有可能会出现手机运行变卡顿。
2、限制CPU最高频率,以限制CPU的运行频率上限。在超级省电模式下,CPU工作的宗旨是:CPU工作频率低+运行不卡,两项都要保障。
在android系统的耗电量排行里,cpu的耗电占 了比较大的一部分比例,也就是说,cpu的使用率和使用频率将直接或间接的影响电量的分配和使用,但很遗憾,android-sdk中没有为 android的开发者提供类似cpu管理的功能,但是当下很多省电类应用或专业的cpu管理软件都提供了cpu的降频甚至是超频的功能。
CPU进入WFI后,整个系统就依靠一颗SCP:SPM来控制睡眠/唤醒的流程,它会去关注各个子系统的状态,SPM =System Power Manager。
Android的定时任务有两种实现方式,Timer类和Alarm机制。Timer有一个明显的短板,不适合长期后台运行的定时任务。为了能让电池更加耐用,每种手机都会有自己的休眠策略,Android手机就会在长时间不操作的情况下自动让CPU进入到睡眠状态,这就有可能导致Timer中的定时任务无法正常运行。而Alarm机制则不存在这种情况,它具有唤醒CPU的功能,即可以保证每次需要执行定时任务的时候CPU能正常工作。重点来了:从Android 4.4之后,Alarm任务的触发时间将会变得不准确,有可能会延迟一段时间后任务才能得到执行。这不是bug,而是系统在耗电性方面进行的优化。系统会自动检测目前有多少Alarm任务存在,然后将触发时间将近的几个任务放在一起执行,这就可以大幅度的减少CPU被唤醒的次数,从而有效延长电池的使用时间。
除了常规的异步网络、多线程技术、本地缓存等等之外,Android省电开发还有一个重要的方面是:wifi比蜂窝数据,包括2G(GPRS)、3G更省电:a)尽量在Wi-Fi下传输数据,当然这是废话,不过可以考虑在有Wi-Fi的时候做预加载,比如应用中心的zip包、手Q web类应用的离线资源等;b)非Wi-Fi下,尽量减少网络访问,每一次后台交互都要考虑是否必须。虽然WiFi接入方式已经占到移动互联网用户的50%,但是是有些手机设置为待机关闭WiFi连接,即便有Wi-Fi信号也只能切换到蜂窝数据;
在Dalvik中,应用每次运行,字节码都需要通过即时编译器转换为机器码,这回拖慢应用的运行效率,而在ART环境中,应用在第一次安装时,字节码就会预先编译成机器码,使其成为了真正的本地应用。这个过程叫做预编译。这样的话,应用的启动和执行都会变得更加快速。但是ART的缺点是预编译完的机器人占用了更大的存储空间,应用的安装需要更长的时间。但是牺牲空间时间换取省电速度,在Android应用中还是可以接受的,毕竟性能的提升,运行速度的变快,体验更流畅,电池续航更久显得更重要。
经测试,谷歌最新的Android L系统与上一版本相比续航能力可以提升36%。
Project Volta省电模式、BatterySaver省电模式;
Android 5.0的省电模式是通过JobSchedulerAPI以及自动调节屏幕亮度、刷新率来达到省电的效果,而且还使用了Project Volta量化每个应用的耗电量,在手机快没电的情况下主动降低CPU的主频或者关闭通讯模块,以获得更长的待机时间。还配备了一个Battery Bistorian电池历史记录功能,可让详细显示设备的耗电情况。
<uses-permission android:name="android.permission.WAKE_LOCK"/>
PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK| PowerManager.ON_AFTER_RELEASE,TAG);
wl.acquire();//为了保证任务不被系统休眠打断,申请WakeLock
// 开始我们的任务
wl.release();//任务结束后释放,如果不写该句。则可以用wl.acquire(timeout)的方式把释放的工作交给系统。
Android battery historian功耗分析- https://github.com/google/battery-historian
google已经做了工具用于可视化的显示这个报告:battery-historian
Android battery historian功耗分析之环境搭建- https://www.jianshu.com/p/5abd53abcc1e
如何确定阻止进入suspend的原因;系统没有进入suspend,主要的原因是因为系统有锁导致.
锁一般分为:APP透过PowerManager拿锁,以及kernel wakelock.
Android系统为了进行电源管理,设计了PowerManagement框架,其中包含BatteryState服务。BatteryStats 会不断地收集信息,并存储这些信息以便在重新启动后继续使用。该服务不会直接跟踪电池中消耗的电流,而是通过收集计时信息来估算不同组件所消耗的电量。
BLE是蓝牙4.0标准的一部分,旨在解决传统蓝牙连接慢、能耗大的问题,Google在Android 4.3(API 18)中引入了对BLE的支持。BLE连接使用GAP(Generic Access Profile)协议,通信使用GATT(Generic Attribute Profile)协议。GATT又以ATT为基础,所有的LE服务都以ATT作为应用层协议。
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-feature
android:name="android.hardware.bluetooth_le"
android:required="false" />
<!-- Needed only if your app targets Android 5.0 (API level 21) or higher. -->
<uses-feature android:name="android.hardware.location.network" />
-- 所有便携式的Android设备都会对设备的功耗提出要求,尽量在最快的运行速度的情况下,降低电池的消耗,降低设备温度。
根据行业内部默认水准,我列出如下几条功耗要求:(Android智能手表/智能手机,四个方向调节设备功耗)
1 设备整机(插SIM卡,拔除USB线)待机功耗的最小电流调节之3mA左右
2 设备连接后台数据的情况下待机每小时平均功耗 < 10mA(严格的说是 7mA)
3 依据设备电池容量限制设备充电功耗
4 设备通话10分钟~20分钟后的温度一般限制在45度以下
-- 手机功耗,总结的两个方向:
1 硬件方向:逐步拔出外设,比如 TP LCD Camera等基本外设,这种方式简单粗暴,很容易定位功耗消耗源所在,比如我遇到的问题就是TP在待机的时候消耗电池,是某个引脚漏电。
2 软件方向:
第一部分:抓取Android电池消耗记录,查看CPU唤醒源。此处要介绍一个工具Battery Historian,这是一款由Google提供的Android系统电量分析工具. 在网页中展示手机的电量消耗过程, 输入电量分析文件, 显示消耗情况. 最后提供一些电量优化的方法,关于此工具的安装方式,网上或者我在另一个博客中有详细说明,需要的话请挪步查看。此处会介绍此工具的使用方式以及功能。
第二部分:关核降频
-- Android App功耗浅析- https://blog.csdn.net/happy_develop_/article/details/70154172
App功耗浅析,主要原因:
(1)http请求(GZIP压缩)
(2)json数据解析(json解析效率主要是解析耗时),大量的数据解析
(3)数据库读写操作
(4)SD卡读写操作
(5)程序的执行的timer定时器(例如IM中的心跳包,用系统的Alarm优化)
(6)网络切换(wifi会比手机的数据移动网络更加省电)