Android性能优化工具的使用

作者:jcmp      发布时间:2021-04-12      浏览量:0
因为众所周知的原因,Android AP

因为众所周知的原因,Android APP总是需要调优,今天笔者就介绍一下Google工程师提供给我们的优化工具以及如何使用他们查找解决性能问题的方法。 一般来说,APP主要的就是往以下四个方面优化,各种调优,优化,都是奔着这四个方面去。

一、1 ANDROID优化工具的使用

1.1 Profile

Android Stduio3.1之后就取消了DeviceMonitor,开始全面使用Profile,而Profile又细分了三个方面,慢慢来介绍。

1.1.1 CPU Profile 让你的APP更快

AS为我们自动创建了两个CPU Profile的默认配置,一个是Sample Java Method,另一个是Trace Java Method,而这两者之间有什么区别呢? 最主要的区别就是:Sample 会频繁的捕捉调用堆栈以获取具体信息。而Trace则是在 每个函数 开始之前跟结束之后记录时间戳,然后分析数据。 举个例子,

fun add(int a ,int b):int = a+b。

函数A仅仅执行一个加法运行,运行时间非常短暂,那么如果Sample恰好在进入此函数之前捕捉了一次堆栈信息且在此函数退出后,又捕捉了一次堆栈信息,那么A函数则不会被分析器记录。而Trace则不同,Trace是在每个函数开始之前与结束之后记录时间戳,所以不会错失任何一次函数调用,但是Trace的问题就在于,频繁记录很可能会超出记录文件限定的大小(默认为8M) 所以如何取舍,还是要看自己。

其又分四个具体标签,分别是Call Chart,Flame Chart,Top Down,Bottom Up Call Chart跟Flame Chart都是图标形式的体现,一个是顺序调用,一个是逆序。

Top Down,Bottom Up也与其类似,不过都是函数具体调用,一个是从上至下,一个是自低向上。

最简单区分方法就是:TopDown 与 Call Chart都是从main函数开始,往下记录被调用函数,而Flame Chart跟Bottom Up则是从底层函数开始回溯。

总结 :CPU Profile可帮助我们分析程序具体哪个函数耗时最多,最影响性能,右键跳转源码,可直接定位到具体代码。

1.1.2 Memory Profile 让你的APP更稳

性能优化的重中之中,内存分析器,自从有了APP显示Bitmap, OOM就是最让人蛋疼的异常错误,因为不仅要修改大小,还要优化代码,压缩bitmap。 而如今,我们可以借助Memory Profile来分析。大名鼎鼎的leakCanary也是根据hprof文件来对比分析定位是否有内存泄漏。

内存计数中的类别如下所示:

将堆转储另存为 HPROF

用来查看具体分配的对象以及占据的内存大小,不过heapDump文件不是永久的,如果想要保存下来还使用 Export heap dump as HPROF file ! ,将堆转储导出到一个 HPROF 文件中。下次再打开就可以直接使用了。

检测内存泄漏

以前有Device Monitor咱们是先存储一次hprof文件,然后频繁操作再频繁gc,再来保存一次hprof文件,然后用Mat工具对比查看两个文件是否有大的区别,而如今Google又介绍了一个简单的,查看是否有内存泄漏的方法:

1.1.3 NetWork Profile

分析应用网络使用情况,由于现在一般不太在乎网络的使用情况,毕竟5G时代马上来临,所以这部分暂时搁置,各位同学有兴趣的可以自己研究如何使用。

1.2 Lint

Analyzer->Inspect Code 即可启用Lint。

1.2.1 辅助功能 Accessibility

重要指数: 一般 一般指的是控件该有的标签没有,比如ImageView的android:contentDescription 属性,这个标签主要是给盲人用的,Google Assistant会根据这个属性的值来帮助盲人理解。如果有兴趣的同学可以自己继续研究。

1.2.2 健壮性 Correctness 让你的APP更稳。

重要指数: 重要 一般会提示四大组件 比如Activity跟Service等没有注册,影响APK被PKMS解析 代码使用方面的问题,如果使用了Private API则会提示将来不支持,会引起异常崩溃,想必大家都体验过在XX机型上莫名其妙的Crash问题,所以这个标签下的内容大家一定要注意检查,务必使其消失。

1.2.3 国际化 Internationalzation

重要指数: 一般 顾名思义,这个是为了以后国际化使用的,例如项目内如果写了settext("hello"),则会提示此警告,如果不用国际化,则不须考虑此提示,否则必须使用Res string.xml 进行plachholder。

1.2.4 表现力 Performance

重要指数: 极其重要

OverDraw:Painting regions more than once 众所周知,Android APP里面最重要的优化方面之一就是UI绘制方面优化,避免嵌套层级过多,导致多次onDraw,浪费性能从而造成APP卡顿 Lint此条目即可帮我们扫描到哪些XML有OverDraw的可能性。 开发的同学务必注意此条,按照提示的内容逐一检查,必须使Overdraw提示消失。

Unused resource 检测无用资源,减小apk体积,便于渠道商推广。

1.2.5 安全性 Security

重要指数: 一般 主要是提示高版本SDK下,app的兼容性可能会出问题。

1.2.6 可用性 Usability

重要指数: 一般 主要是提示能不能被Google搜索到,跟一些统计用量,如果专注于国内开发可不用考虑这个。

1.2.7 资源可用性 Android Resource Validation。

一般

个人建议如果时间比较赶,来不及做很多优化,其他暂时都可以放放,直接把Performance里面的建议执行完即可。Lint的局限性在于其只能检测是否Overdraw,而类似数据大量加载导致的卡顿则需各位同学自己注意,利用CPU Profile去检测。

另外此处是Google给出的减少过度绘制的方法 : There are several strategies you can pursue to reduce or eliminate overdraw:

检测是否真的减少绘制:

启用开发者选项, 然后,执行以下操作:

粉色: 过度绘制 3 次

InspectCode的结果还有其他很多种,因此篇主要讲Android的优化,其他的结果是项目代码方面的问题就不研究了,有兴趣的读者可以自己深入研究。

1.3 LayoutInspector 布局检查器

LayoutInspector 是另外一个检测布局的便利工具,可以检测出布局是否有嵌套,使用方式如下:

这个工具主要是便于直接查看app的实际布局是否过度嵌套。

1.4 ProGuard - 压缩代码以及资源 让你的APP更小。

ProGuard 众所周知 是开启混淆的利器,但是他还有另外一种作用,就是减轻APK的体积,去掉无用代码,让我们来看看Google官方对此的介绍。

启用代码压缩,直接在build.gradle文件内相应的构建类型中添加 minifyEnabled true。

启用资源压缩 ,在 build.gradle 文件中将 shrinkResources 属性设置为 true。

android { ... buildTypes { release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}

排查资源压缩问题 Gradle 还会在 /build/outputs/mapping/release/(ProGuard 输出文件所在的文件夹)中创建一个名为 resources.txt 的诊断文件。该文件包括诸如哪些资源引用了其他资源以及使用或移除了哪些资源等详情。

GPU Rendering 渲染解析图,可根据此图分析判断性能消耗在何处。

总结:本文主要介绍了Android性能优化的工具,其重点在于让APP 更稳: Memory Profile 检测内存泄漏问题,内存优化问题 更快:CPU Profile 检测函数耗时过长 更省:Lint跟LayoutInspector 对应 检测布局重绘问题,减少无用资源问题 更小: Progurad 减少无用代码,压缩资源。

1 Render UI

2 减轻CPU负载

3 内存处理思路

二、后续分析工具