针对Android的电量优化,应该是很多开发者最关心的几大问题之一。
最近我正在看相关的资料,希望跟大家一起探讨学习。
关于电量,我们最需要处理的问题就是两个方向:
(1)第三方APP和系统本身是如何获取电量值并展示的?我们能否针对他们的算法做适度优化?或者规避部分统计?
(2)其他代码级别优化。从业务逻辑出手,架构上适度调整的手段有哪些?
就上面2个问题,我们开始展开讨论:
(1)APP获取电量算法。
经过查看源码,以及各种资料。最后我们看到app计算电量的算法如下:
在主Activity里面 info.getBatteryStats() 就搞定了。 首先 load(),如果load失败,走CPU时间计算,通过getAppListCpuTime这样函数。 1
CPU的时间计算,有3个核心步骤:
1 ActivityManager遍历runningApp进程,获取对应pid
2 getAppProcessTime(pid)通过读取/proc/pid/stat文件,拿取APP在CPU的运行时间。
3 重新为BatterySipper附值:+time;
2
获取APP消耗 processAppUsage();也分三步走:
1 通过PowerProfile 获取cpu的速度层次(speedsteps),方便后面使用
2 根据不同CPU的速度等级,计算cpu在某个速度下的电量,mA毫安
3
mPowerProfile.getAveragePower(PowerProfile.POWERCPUACTIVE,p)
很多地方都用刀这个API获取power。
那它究竟做了些什么呢?
查看系统源码可以知道:
实际上这句话是获取1个叫PowerMap的数据结果,获得电量。而PoweMap的赋值,是来源于com.android.internal.R.xml.powerprofile 的文件。
关于该文件的获取 android-版本号/core/res/res/xml/powerprofile.xml
计算各种耗电量的详细算法是:
(1)计算CPU
BatteryStateImpl.getUidStats()获取数据源
遍历数据源,得到ProcessState
通过ProcessState拿到以下几个指标
userTime
systemTime
foregroundTime
CpuFgTime(cpuFgTime+= foregroundTime10;)
cpuTime (cpuTime+=tmpCpuTime)
tmpCpuTime=(userTime + systemTime)10
power +=processPower
4
(2)计算wake lock
wakelock,只关心partial的类型
同样地,通过uid获取wakelock的信息 u.getWakelockStats()
遍历这个map,获取wakeTime次数
wakelock.getWakeTime(BatteryStats.WAKE_TYPE_PARTIAL);
计算总耗时 wakelockTime += timer.getTotalTimeLocked(uSecTime,which);
计算总电量 poewer+=
6
(3)数据通信的消耗
7
(4)wifi运行消耗
8
(5)传感器等等
processMiscUsage()
9
以wifi为例,是所以wifi的电量(wifi使用电量+appwifi使用电量)
addwifiusage()为例子:
long onTimeMs = mStats.getWifiOnTime(uSecNow, mStatsType) / 1000; //获取wifi总时间
long runningTimeMs = mStats.getGlobalWifiRunningTime(uSecNow, mStatsType) / 1000; //获取wifi运行时间
runningTimeMs -= mAppWifiRunning;//这里计算的是非app使用wifi的量(时间)
double wifiPower = (onTimeMs * 0 * mPowerProfile.getAveragePower(PowerProfile.POWERWIFION) + runningTimeMs
* mPowerProfile.getAveragePower(PowerProfile.POWERWIFION)) / 1000;//时间*电量==毫安时
为了方便各位学习,我把Demo也上传上来,希望对大家阅读有所帮助。
分享到:
相关推荐
Android系统的IntentService或JobScheduler可以用于实现后台计步功能,同时需要注意电量和性能优化,避免过度消耗资源。 六、文档与视频教程 压缩包中的".doc"文件可能包含了项目的设计文档和开发指南,详细描述了...
5. **电量消耗**:优化电池使用是移动App不可或缺的一部分,通过限制后台活动、优化网络请求和减少传感器使用等方法可以降低电量消耗。 6. **数据流量**:对于依赖网络的App,控制数据流量对用户非常重要。优化网络...
移动App性能评测与优化是移动应用开发领域中的关键环节,特别是在Android平台上,因为用户体验往往取决于应用的响应速度、稳定性及资源消耗。这份PDF文件详细探讨了如何评估和改进移动App的性能,确保其在Android...
Android手机管家是一款针对Android平台设计的系统优化与安全管理应用,它集合了清理垃圾、内存加速、病毒查杀、电池管理等多种功能,旨在为用户提供一个安全、高效的手机环境。本文将从源码角度出发,深入探讨其背后...
9. **性能优化**:为了确保APP运行流畅,开发者需要关注内存管理、UI性能优化、电量消耗等。 10. **数学建模**:在算法设计和问题解决过程中,数学建模起到了关键作用,比如利用概率论分析避障策略,或者应用图论...
通过分析CPU使用情况,找出导致高负载的代码段,进行算法优化或任务异步处理,可以显著降低CPU使用率。 3. **电量消耗**:现代用户关心App对设备电池的影响。优化网络连接、后台任务和传感器使用,可以减少电量消耗...
【标题】"仿QQ聊天安卓APP"是一款基于Android平台开发的聊天应用,旨在模拟QQ聊天的功能和用户体验。这款应用展示了如何在Android环境下构建一个类似QQ的即时通讯软件,让用户能够体验到与QQ类似的聊天功能。 ...
在用户至上的时代,在体验经济的时代,一个好的新闻APP可以在内容满足用户的同时,还给用户带来最便利的生活服务、最智能的算法推荐、最完美的用户体验。 二、校园新闻APP的需求分析 从目前获得消息的各种渠道来...
此外,还涉及了App的性能优化,如启动速度优化、绘制优化和电量优化。对于网络安全、WebView加载性能优化以及自定义View的优化也是考察面试者深度理解和实践能力的重要方面。 这部分内容还提到了如何使用注解框架,...
7. 性能优化:包括Android性能优化总结、电量优化等。 8. Android特定功能:如Bitmap压缩策略、Context详解、全局异常处理、虚拟机及编译过程、Apk安装过程、PopupWindow与Dialog的区别等。 9. 开源框架解析:如...
10. **性能优化**:对于Android App,性能优化是必不可少的,包括内存管理、CPU使用率优化、电量消耗控制等,以提供流畅的用户体验。 综上所述,构建一个像Wire这样的Android客户端需要全面的Android开发技能,包括...
这可能涉及地图数据的本地缓存和算法优化。 10. **隐私保护**:处理位置信息必须遵循隐私法规,确保用户知情并允许数据的收集和使用。应用可能需要提供隐私设置,让用户控制自己的位置数据。 11. **测试与调试**:...
综上所述,《360°全方面性能调优.pdf》这份文档是一份针对Android性能优化的综合指南,它不仅涵盖了代码编写中的基本设计原则和数据结构、算法,也详细讲述了程序性能和开发效率的优化方法,为Android开发人员提供...
8. **性能优化**:考虑到Android设备的多样性,开发者需要关注内存管理、启动速度优化、电量消耗控制等方面,以确保APP在各种设备上运行流畅。 9. **测试与发布**:在完成开发后,需要进行单元测试、集成测试和压力...
- **应用商店优化**:通过优化ASO(App Store Optimization)策略提高曝光率; - **渠道统计**:利用第三方统计工具追踪不同渠道下载量,以便更精准地进行市场投放; - **用户反馈收集**:建立有效机制收集用户反馈...
- 电量优化:合理设置定位间隔和定位精度,减少电池消耗。 7. **事件处理与异步编程** - 使用`LocationCallback`:异步接收位置更新,避免阻塞主线程。 - `Handler`或`LiveData`:用于在定位服务和UI之间传递...
- **电池消耗**:评估App运行时的电量消耗,优化能源效率。 - **稳定性**:测试在长时间运行或极端条件下,App是否能够保持稳定,不出现崩溃或异常。 2. **性能测试工具**: - **模拟器/真机测试**:使用Android...