前言
大部分的时间都在做业务开发,优化方面的工作其实相对占比较少,但也总会出现一些莫名其妙的问题,比如卡顿丢帧,必要的优化方法和工具还是要了解的。此处只做一下备忘和记录,至于具体深层次的使用网上有大佬写的已经很详细了,推荐极客时间张绍文的Android开发高手课程,里面对性能优化做了很明确的引导,但有些难度,追求深度的话可以研究,但文字叙述学习起来困难很大。
一、优化方向
老生常谈的话题,就Android端的APP而言优化的方向有以下:
- 布局
- 卡顿
- 线程
- 网络
- 耗电
- 内存
- 等等
虽然每一项都只有两个字,但每一个处理起来都不是一下两下就能搞定的,目前的情况是要保持做到对于明显级别的性能问题要有思路,至于细致入微的优化可能需要更多精力去研究。
二、常用工具
Systrace Layout Inspector Cloneographer Profile StrictMode 手机系统自带的一些辅助开发工具等 以上的工具都可以在开发文档中找到使用的方。 ## Systrace 使用 Python 生成html文件,轻量级开销小,监控API 线程调用情况。
这里记录一下Android Device Monitor启动的问题,缺少jre文件
Layout Inspector
AS自带的布局检测工具,对于布局深度过大层次嵌套太深有帮助,使用也很简单,可以在编译器内部直接预览查看。
Cloneographer
主要关注的是帧率。
StrictMode
检测主线程中本地磁盘和网络读写等耗时的操作,源码中也做了相关的介绍和使用说明。
if (DEVELOPER_MODE) {
* StrictMode.setThreadPolicy(new {@link ThreadPolicy.Builder StrictMode.ThreadPolicy.Builder}()
* .detectDiskReads()
* .detectDiskWrites()
* .detectNetwork()
* .penaltyLog()
* .build());
* StrictMode.setVmPolicy(new {@link VmPolicy.Builder StrictMode.VmPolicy.Builder}()
* .detectLeakedSqlLiteObjects()
* .detectLeakedClosableObjects()
* .penaltyLog()
* .penaltyDeath()
* .build());
* }
Profile
也是AS自带的分析工具,异常好用,可以清晰的看到时间段内的内存、CPU、网络的使用情况,对于内存的优化很有帮助,可以查看堆栈的情况,对于卡顿问题也可以查看场景内的调用栈,分析耗时时间从而找到导致主线程卡顿的原因。
TraceView
TraceView 是 Android SDK 中内置的一个工具,它可以加载 trace 文件,用图形的形式展示代码的执行时间、次数及调用栈,便于我们分析。 Debug.startMethodTracing(“path”); 可以生成文件
卡顿
关于卡顿多说一句,对于Android而言,由于UI线程及主线程的机制,界面控件的刷新渲染只能在主线程进行,16ms发送一次Vsync信号触发UI渲染,每一帧都要在16ms之内完成,大多数的Android设备的刷新率是60HZ,及一秒钟显示60帧,超过这个刷新率其实人眼是无感知的,相反如果一帧的渲染时间过长就会出现丢帧。而所谓的卡顿其实就是主线程被阻塞来不及刷新界面的现象,或者说在主线程handler的dispatchMessage中执行了耗时的操作。
总结
工具的使用是为了找到问题,业务开发之外的能力,对于各种优化方向,还要持续总结方法。
|