Android 功耗与内存优化

栏目: IOS · Android · 发布时间: 5年前

内容简介: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 之后引入的一个获取设备电量消耗信息的图形化工具,能够直观展示手机电量消耗。

Android 功耗与内存优化

Battery_Historian_Tool使用说明

推荐使用 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 功耗与内存优化》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入剖析Tomcat

深入剖析Tomcat

Budi Kurniawan、Paul Deck / 曹旭东 / 机械工业出版社华章公司 / 2011-12-31 / 59.00元

本书深入剖析Tomcat 4和Tomcat 5中的每个组件,并揭示其内部工作原理。通过学习本书,你将可以自行开发Tomcat组件,或者扩展已有的组件。 Tomcat是目前比较流行的Web服务器之一。作为一个开源和小型的轻量级应用服务器,Tomcat 易于使用,便于部署,但Tomcat本身是一个非常复杂的系统,包含了很多功能模块。这些功能模块构成了Tomcat的核心结构。本书从最基本的HTTP请求开......一起来看看 《深入剖析Tomcat》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换