2024年Android电量优化全解析 (2),阿里面试指南

总结

其实要轻松掌握很简单,要点就两个:

  1. 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
  2. 多练。 (视频优势是互动感强,容易集中注意力)

你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

以上就是总结的关于在面试的一些总结,希望对大家能有些帮助,除了这些面试中需要注意的问题,当然最重要的就是刷题了,这里放上我之前整理的一份超全的面试专题PDF

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

这里只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢在关注一下~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进入到$GOPATH/src/github.com/google/battery-historian目录下方

cd $GOPATH/src/github.com/google/battery-historian

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

运行 Battery Historian 1.执行命令:

go run setup.go

Compile Javascript files using the Closure compiler

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.接着在执行命令:

go run cmd/battery-historian/battery-historian.go [–port default:9999]

Run Historian on your machine (make sure 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传GOBIN) 3.登录网址http://localhost:9999查看battery-historian是否运行。

到此Battery-historian的环境就整好了。

电量数据收集

Android 5.0 及以上的设备, 允许我们通过 adb 命令 dump 出电量使用统计信息。 1.因为电量统计数据是持续的, 会非常大, 统计待测试的 App 之前需要连上设备,因此需要reset(重置)电池数据收集。命令行执行:

$ adb shell dumpsys batterystats --resetBattery stats reset

2.断开usb连接的测试设备, 操作要测试的App。

3.重新连接设备, 使用 adb 命令导出相关统计数据:

  • Android 7.0 及以上执行如下命令:

adb bugreport > [path/]bugreport.zip

  • Android 5.0/ 6.0执行如下命令:

adb bugreport > [path/]bugreport.txt

导出的统计数据存储到 bugreport.zip(bugreport.txt), 借助 battery-historian 工具来图形化 展示电池的消耗情况.

上传 bugreport.zip(bugreport.txt)文件至 http://localhost:9999

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

battery-historian电量分析结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分析指标

下图是使用 adb 命令将采集的电量数据上传至 Battery Historian 而得到电量的分析情况。(我们可以通过包名过滤具体应用的耗电情况)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

各指标的含义

  • 横坐标: 横坐标就是一个时间范围,咱们的例子中统计的数据是以重置为起点,获取 bugreport 内容时 刻为终点。我们一共采集了多长时间的数据;
  • 纵坐标: 关键数据点说明如下。
数据项说明
battery_level电量,可以看出电量的变化
plugged充电状态,这一栏显示是否进行了充电,以及充电的时间范围
screen屏幕是否点亮,这一点可以考虑到睡眠状态和点亮状态下电量的使用信息
top该栏显示当前时刻哪个 app 处于最上层,就是当前手机运行的 app,用来判断某个 app 对手机电量的影响,这样也能判断出该 app 的耗电量信息。该栏记录了应用在某 一个时刻启动,以及运行的时间,这对我们比对不同应用对性能的影响有很大的帮助
wake_lockwake_lock 该属性是记录 wake_lock 模块的工作时间。是否有停止的时候等
running界面的状态,主要判断是否处于 idle 的状态。用来判断无操作状态下电量的消耗
Job后台的工作,比如服务 service 的运行
data_conn数据连接方式的改变,上面的 edge 是说明采用的 gprs 的方式连接网络的。此数据可 以看出手机是使用 2g,3g,4g 还是 wifi 进行数据交换的。这一栏可以看出不同的连 接方式对电量使用的影响
status电池状态信息,有充电,放电,未充电,已充满,未知等不同状态
phone_signal_strength手机信号状态的改变。 这一栏记录手机信号的强弱变化图,依次来判断手机信号对电 量的影响
health电池健康状态的信息,这个信息一定程度上反映了这块电池使用了多长时间
plug充电方式,usb 或者插座,以及显示连接的时间
Sync是否跟后台同步
phone_in_call是否进行通话
gpsgps 是否开启

如何进行电量优化?

了解手机关键耗电的地方及分析耗电的工具后。接下来就是我们的核心,如何来进行电量的优 化?首先我们先简单总结汇总一下耗电的相关因素

  • 屏幕亮暗相关
  • 设备 awake,sleep 的切换,尤其是唤醒.
  • CPU 运行相关
  • 网络
  • 传感器

我们都知道屏幕的渲染及 CPU 的运行是耗电的主要因素之一。所以当我们在做内存优化、渲染优化、计算优化的时候,就已然在做电量优化。所以在平时的开发中,我们要注意点滴性能 的优化积累,实际上当我们来做电量分析的时候,也是在找自己挖的坑。所以尽量有意识在项 目的开发过程中尽量少挖坑,这一点是我们在分析其他优化项首先要提到的一个点。

监听手机充电状态

我们可以通过下面的代码来获取手机的当前充电状态:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

得到充电状态信息之后,我们可以有针对性的对部分代码做优化。比如我们可以判断只有当前 手机为 AC 充电状态时 才去执行一些非常耗电的操作。可以通过下面的方法判断手机当前的充 电状态。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里我们就需要思考,根据具体的业务,考虑将一些不需要及时地和用户交互的操作放到充电 的时候去做。比如:360 手机助手,当充上电的时候,才会自动清理手机垃圾,自动备份上传图片、联系人 等到云端,从而避免当用户手机低电量时,任然继续进行耗电操作。

屏幕唤醒

当 Android 设备空闲时,屏幕会变暗,然后关闭屏幕,最后会停止 CPU 的运行,这样可以防 止电池电量掉的快。但有些时候我们需要改变 Android 系统默认的这种状态:比如玩游戏时我 们需要保持屏幕常亮,比如一些下载操作不需要屏幕常亮但需要 CPU 一直运行直到任务完成。

保持屏幕常亮比较好的方式是在 Activity 中使用 FLAG_KEEP_SCREEN_ON 的 Flag。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个方法的好处是不像唤醒锁(wake locks),需要一些特定的权限(permission)。并且能 正确管理不同 app 之间的切换,不用担心无用资源的释放问题。

另一个方式是在布局文件中使用 android:keepScreenOn 属性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

android:keepScreenOn = “true”的作用和 FLAG_KEEP_SCREEN_ON 一样,使用代码的好 处是你允许你在需要的地方关闭屏幕。

注意:一般不需要人为的去掉 FLAG_KEEP_SCREEN_ON 的 flag,windowManager 会管理好程序进入 后台回到前台的的操作。如果确实需要手动清掉常亮的 flag,使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以这里我们需要根据自己的 APP 实际情况,根据业务来控制好是否保持屏幕常量。比如 APP 需要支持视频播放。那么在播放的界面需要控制好不熄屏,当退出播放时,当然就没有了 这个设置。

WakeLock

wake_lock 锁主要是相对系统的休眠而言的,意思就是程序给 CPU 加了这个锁那系统就不会 休眠了,这样做的目的是为了全力配合我们程序的运行。有的情况如果不这么做就会出现一些 问题。 需要使用 PowerManager 这个系统服务的唤醒锁(wake locks)特征来保持 CPU 处于唤醒状 态。唤醒锁允许程序控制宿主设备的电量状态,创建和持有唤醒锁对电池的续航有较大的影 响,所以,除非是真的需要唤醒锁完成尽可能短的时间在后台完成的任务时才使用它。比如在 Acitivity 中就没必要用了。如果需要关闭屏幕,使用上述的 FLAG_KEEP_SCREEN_ON。

只有一种合理的使用场景,使用后台服务在屏幕关闭情况下 hold 住 CPU 完成一些工作,需要 使用唤醒锁,如果不使用唤醒锁来执行后台服务,不能保证因 CPU 休眠未来的某个时刻任务 会停止,这不是我们想要的。

唤醒锁可划分并识别为四种用户唤醒锁:

标记值CPU屏幕键盘
PARTIAL_WAKE_LOCK开启关闭关闭
SCREEN_DIM_WAKE_LOCK开启变暗关闭
SCREEN_BRIGHT_WAKE_LOCK开启变亮关闭
FULL_WAKE_LOCK开启变亮变亮

注意:自 API 等级 17 开始,FULL_WAKE_LOCK 将被弃用。 应用应使用 FLAG_KEEP_SCREEN_ON。

1.添加唤醒锁权限:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.直接使用唤醒锁:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意:在使用该类的时候,必须保证 acquire 和 release 是成对出现的。不然当我们业务已经不需要时, 当 CPU 处于唤醒状态,这个时候就会损耗多余的电量。

JobScheduler

自 Android 5.0 发布以来,JobScheduler 已成为执行后台工作的很好的方式,其工作方式有 利于用户在适当的时机执行正确的事情。应用可以在安排作业的同时允许系统基于内存、电源 和连接情况进行优化。JobSchedule 的宗旨就是把一些不是特别紧急的任务放到更合适的时机 批量处理。这样做有两个好处:

  • 避免频繁的唤醒硬件模块,造成不必要的电量消耗。
  • 避免在不合适的时间(例如低电量情况下、弱网络或者移动网络情况下的)执行过多的 任务消耗电量。
GPS

选择合适的 Location Provider

Android 系统支持多个 Location Provider:

  • GPS_PROVIDER: GPS 定位,利用 GPS 芯片通过卫星获得自己的位置信息。定位精准度高,一般在 10 米左右, 耗电量大;但是在室内,GPS 定位基本没用。
  • NETWORK_PROVIDER: 网络定位,利用手机基站和 WIFI 节点的地址来大致定位位置,这种定位方式取决于服务器, 即取决于将基站或 WIF 节点信息翻译成位置信息的服务器的能力。
  • PASSIVE_PROVIDER: 被动定位,就是用现成的,当其他应用使用定位更新了定位信息,系统会保存下来,该应用接 收到消息后直接读取就可以了。

如果 App 只是需要一个粗略的定位那么就不需要使用 GPS 进行定位,既耗费电量,定位的耗 时也久。

及时注销定位监听

作者2013年从java开发,转做Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。

参与过不少面试,也当面试官 面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!

我整理了一份阿里P7级别的最系统的Android开发主流技术,特别适合有3-5年以上经验的小伙伴深入学习提升。

主要包括阿里,以及字节跳动,腾讯,华为,小米,等一线互联网公司主流架构技术。如果你想深入系统学习Android开发,成为一名合格的高级工程师,可以收藏一下这些Android进阶技术选型

我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。

Java语言与原理;
大厂,小厂。Android面试先看你熟不熟悉Java语言

高级UI与自定义view;
自定义view,Android开发的基本功。

性能调优;
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。

NDK开发;
未来的方向,高薪必会。

前沿技术;
组件化,热升级,热修复,框架设计

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多,CodeChina上可见;

当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。

不出半年,你就能看出变化!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

时用来学习。

不出半年,你就能看出变化!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值