「每日一面」聊一聊面试必问的Android性能优化

Android 性能优化,恐怕是Android面试中最常见的问题,也是开发过程中慢慢各方面不断积累的过程。

如果面试谈的这个问题,我们可以从以下几个方面去考虑:

  1. 内存性能优化
  2. UI流程度层面的性能优化
  3. APK包大小优化

一、 UI性能优化

Android一个页面流程绘制的时间是16.67ms(屏幕刷新频率是60hz,即在1000/60=16.67ms内更新一帧),如果没有完成任务,就会发生掉帧的现象,也就是我们所说的卡顿。同时如果布局有问题也会出现过度绘制(overdraw)占大量内存等问题。

下面列举一些布局中的技巧:

  1. 使用compound drawables - 一个包含了ImageView与TextView的LinearLayout可以被当作一个compound drawable来处理
「每日一面」聊一聊面试必问的Android性能优化

如图布局,可能通过一个RelativeLayout 里面再包裹TextView和ImageView实现,而最简单省内存的方式就是TextView,宽度为match_parent,然后最右侧这种形式

2.使用merge根框架 - 如果FramLayout仅仅是一个纯粹的(没有设置背景,间距等)布局根元素,我们可以使用merge标签来当作根标签

3.无用的分支 - 如果一个layout并没有任何子组件,那么可以被移除或者改成闭合状态,这样可以提高效率

中没有子View 的时候可以把改为这种形式。

4.无用的父控件 - 如果一个layout只有子控件,没有兄弟控件,并且不是一个ScrollView或者根节点,而且没有设置背景,那么我们可以移除这个父控件,直接把子控件提升为父控件

5.深层次的layout - 尽量减少内嵌的层级,考虑使用更多平级的组件 RelativeLayout or GridLayout来提升布局性能,默认最大的深度是10

6.使用include 公用布局

7.通过merge合并布局

8. ViewStub 合理使用

9.自定义View避免在onDraw 方法中做耗时操作

10.使用系统的新的View控件,如recyclerview,constraintlayout等谷歌推出的新控件,部分地方以及比同样效果的其他控件进行了优化

布局性能工具:

1.使用Hierarchy Viewer

Hierarchy Viewer工具位于 < SDK >\tools\目录下 ,该工具能分析出你的布局不合理和可以优化的地方。

2.直接通过手机的开发者模式,可以查看布局边界,UI是否存在过度绘制等,如里面的《调试GPU过度绘制》等选项

3.使用Lint — 查看你的view 层级哪些地方可以优化


二、 内存性能优化

1.避免减少内存溢出,前面文章有过关于内存溢出的介绍

「每日一面」Binder机制你了解吗?

2.慎用Service

Service执行完后台任务后要停止,注意:不要service任务已完成,而不去停止Service

使用IntentService

IntentService不同于普通的Service之处是:

提交的task系统会post到子线程运行,当后台运行的task完成时,系统会stop IntentService

onHandleIntent(Intent intent)

当一个Service不需要而还在后台运行时,这是最消耗内存的内存管理错误。因此要慎用服务,当服务完成后台任务时要记得关闭。如果不这样做,由于RAM的限制,你的app运行将变得非常卡,用户也将发现app错误的行为,最后卸载你的应用

3.谨慎使用多进程

使用多进程可以把应用中的部分组件运行在单独的进程当中,这样可以扩大应用的内存占用范围,但是这个技术必须谨慎使用,绝大多数应用都不应该贸然使用多进程,一方面是因为使用多进程会使得代码逻辑更加复杂,另外如果使用不当,它可能反而会导致显著增加内存。当你的应用需要运行一个常驻后台的任务,而且这个任务并不轻量,可以考虑使用这个技术。

一个典型的例子是创建一个可以长时间后台播放的Music Player。如果整个应用都运行在一个进程中,当后台播放的时候,前台的那些UI资源也没有办法得到释放。类似这样的应用可以切分成2个进程:一个用来操作UI,另外一个给后台的Service。

4.使用优化后的集合容器

例如:SparseArray、SparseBooleanArray、LongSpareArray ….. 不过这些存储的都是特定的数据结构。

5.尽量避免使用枚举

相比于静态常量,枚举会有超过其两倍以上的内存开销,在android中需严格避免使用枚举

6.避免使用依赖注入框架

7.使用zipalign优化和对齐你的apk

相关工具:

内存优化那么主要就是去消除应用中的内存泄露、避免内存抖动;常用工具就是AS自带的内存检测,可以很好的发现内存抖动;

leakcanary可以非常方便的帮助我们发现内存泄露;MAT可以做更多的内存分析。

LeakCanary github 地址:https://github.com/square/leakcanary


三、 APK瘦身优化

APP运行过程中除了网络请求数据,APK本身就有很多资源需要加载处理,如果APK大小以及内部资源减小,那么对应的运行内存和加载消耗内存也会对应的减少,性能也会得到提升。感觉同时用户更新,下载转化率也会提升,可以这样考虑,差不多的咨询类APP,一个包的大小10M,一个30M,那么用户同事看到这两个软件,大部分都是选择占内存小的,APK瘦身法则:

  1. 利用ProGuard压缩代码去除无用资源
  2. andresguard进一步压缩与混淆资源
  3. 第三方开源库的瘦身,仅保留自己需要的部分
  4. 极致的图片压缩与webp的使用,如果不能使用webp,也可以通过TinyPic 插件压缩,地址:https://tinypng.com/ 使用方式: 在File->Settings->Plugins里下载插件 TinyPic ———> 安装完后重启,在Tools目录下找到TinyPic ———> 输入在 https://tinypng.com/developers 申请的api key
  5. 合理配置去除不必要的配置,仅保留中文配置等...
  6. so的优化与配置,只保留一类so
  7. 动态下发一些资源:字库、so、换肤包等;
  8. 如果是Android游戏开发,会把游戏主要文件提取出来,只进行Unity相应加载初始化,其他内容都放到单独问价夹下通过网络请求进行下载

除了上面介绍的三种大的方面的优化,还可以考虑APP启动优化,APP 电量优化,APP网络请求优化,针对这三种情况就不重点介绍了,有兴趣的可以查一下。

如有解释不当请留言或私信,欢迎补充,转发

「每日一面」聊一聊面试必问的Android性能优化


分享到:


相關文章: