内容简介:CPU 与网络等是属于 Background Process,若要优化,需要设法减少、延迟、合并 Background Process。从 API 23 开始, Android 提供了这两种模式以延长电池寿命,是 Android 系统的大方针。Doze 就是将一些 Wakelocks、网络、Jobs/Syncs、Alarms、GPS/Wifi 禁止/延迟,仅在需要唤醒这些东西时即到维护窗口时才唤醒。App Standby 是应用级别的,细分到每一个应用中的,应用未使用一段时间后(即没有 foreground
- CPU:wakelocks
- 网络、无线、蓝牙等
- 屏幕
CPU 与网络等是属于 Background Process,若要优化,需要设法减少、延迟、合并 Background Process。
Doze 与 App Standby
从 API 23 开始, Android 提供了这两种模式以延长电池寿命,是 Android 系统的大方针。Doze 就是将一些 Wakelocks、网络、Jobs/Syncs、Alarms、GPS/Wifi 禁止/延迟,仅在需要唤醒这些东西时即到维护窗口时才唤醒。App Standby 是应用级别的,细分到每一个应用中的,应用未使用一段时间后(即没有 foreground process 时)就会进入 App Standby,进入此状态后 App 就不能访问网络并且 Jobs/Syncs 都会受到延迟。
当然,启用 Foreground Service 就不会受到 Doze 和 App Standby 的影响。同时,在 AOSP 中这两个模式是关闭的,具体需要看看手机厂商有没有开启,提起这个只是给到大家一个官方的方案来引导我们做自己的方案。
developer.android.google.cn/training/mo…
常见优化方案
若要进行功耗优化,则需要设法减少、延迟、合并 Background Process。通过 Doze 则是对 Background Process 进行合并,即合并到维护窗口时;通过 App Standby 则是对 Backgroud Process 进行延迟,即延迟到"使用"状态下或充电状态下。这些是 系统级别的优化 ,而应用级别的优化则是在平时的积累中进行的,比如对耗电功能进行优化,原则上与上面一致,即 减少、延迟、合并 这些功耗大的功能:
- 屏幕:屏幕亮度对功耗影响是比较大的,在一些场景(如二维码展示、视频播放、游戏)中会对屏幕亮度进行调整或是保持屏幕常亮,在这种情况下是比较耗电的,注意对此方面的控制能够对功耗做到一定的优化。
- 充电状态下进行耗电操作:通过监听电量广播(Intent.ACTION_BATTERY_CHANGED)即可获取当前充电状态,在充电状态下进行耗电操作(比如自动备份等高网络请求的功能)。获取充电状态的代码如下:
/** * This method checks for power by comparing the current battery state against all possible * plugged in states. In this case, a device may be considered plugged in either by USB, AC, or * wireless charge. (Wireless charge was introduced in API Level 17.) */ private boolean checkForPower() { // It is very easy to subscribe to changes to the battery state, but you can get the current // state by simply passing null in as your receiver. Nifty, isn't that? IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = this.registerReceiver(null, filter); // There are currently three ways a device can be plugged in. We should check them all. int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_USB); boolean acCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_AC); boolean wirelessCharge = false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { wirelessCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_WIRELESS); } return (usbCharge || acCharge || wirelessCharge); } 复制代码
- 延迟、合并高功耗操作:在网络请求中,频繁请求会比集中请求功耗大,蜂窝数据请求会比无线网络请求功耗大。这种情况下可通过 JobScheduler 将一些操作延迟、合并在一些合适的情况下进行。
- 传感器、GPS:尽量复用、及时注销、选择正确的参数
- 及时释放 WakeLock
检测工具 Battery Historian
Battery Historian 是 Android 5.0 之后引入的一个获取设备电量消耗信息的图形化工具,能够直观展示手机电量消耗。
推荐使用 API
JobScheduler:系统利用这些触发的设置,合并相同的 background process,从而优化内存和电池性能。
内存优化
内存优化原因
- 内存泄漏 -> 内存占用高 -> OOM
ART GC 原因
- Concurrent: 并发GC,不会使App的线程暂停,该GC是在后台线程运行的,并不会阻止内存分配。
- Alloc:当堆内存已满时,App尝试分配内存而引起的GC,这个GC会发生在正在分配内存的线程。
- Explicit:App显示的请求垃圾收集,例如调用System.gc()。与DVM一样,最佳做法是应该信任GC并避免显示的请求GC,显示的请求GC会阻止分配线程并不必要的浪费 CPU 周期。如果显式的请求GC导致其他线程被抢占,那么有可能会导致 jank(App同一帧画了多次)。
- NativeAlloc:Native内存分配时,比如为Bitmaps或者RenderScript分配对象, 这会导致Native内存压力,从而触发GC。
- CollectorTransition:由堆转换引起的回收,这是运行时切换GC而引起的。收集器转换包括将所有对象从空闲列表空间复制到碰撞指针空间(反之亦然)。当前,收集器转换仅在以下情况下出现:在内存较小的设备上,App将进程状态从可察觉的暂停状态变更为可察觉的非暂停状态(反之亦然)。
- HomogeneousSpaceCompact:齐性空间压缩是指空闲列表到压缩的空闲列表空间,通常发生在当App已经移动到可察觉的暂停进程状态。这样做的主要原因是减少了内存使用并对堆内存进行碎片整理。
- DisableMovingGc:不是真正的触发GC原因,发生并发堆压缩时,由于使用了 GetPrimitiveArrayCritical,收集会被阻塞。一般情况下,强烈建议不要使用 GetPrimitiveArrayCritical,因为它在移动收集器方面具有限制。
- HeapTrim:不是触发GC原因,但是请注意,收集会一直被阻塞,直到堆内存整理完毕。
检测工具
- LeakCanary: github.com/square/leak…
- Memory Profiler:Android Studio 自带工具https://developer.android.com/studio/profile/memory-profiler.html?hl=zh-cn
以上所述就是小编给大家介绍的《Android 功耗与内存优化》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Android 功耗改进
- Android功耗改进
- iOS 性能监控(一)—— CPU功耗监控
- Intel 全新架构 Lakefield 曝光:兼顾功耗与性能
- Jeopardize:一款针对钓鱼域名的低功耗威胁情报&响应工具
- 职播间 | 面向低功耗 AI 芯片上视觉任务的神经网络设计
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入剖析Tomcat
Budi Kurniawan、Paul Deck / 曹旭东 / 机械工业出版社华章公司 / 2011-12-31 / 59.00元
本书深入剖析Tomcat 4和Tomcat 5中的每个组件,并揭示其内部工作原理。通过学习本书,你将可以自行开发Tomcat组件,或者扩展已有的组件。 Tomcat是目前比较流行的Web服务器之一。作为一个开源和小型的轻量级应用服务器,Tomcat 易于使用,便于部署,但Tomcat本身是一个非常复杂的系统,包含了很多功能模块。这些功能模块构成了Tomcat的核心结构。本书从最基本的HTTP请求开......一起来看看 《深入剖析Tomcat》 这本书的介绍吧!