App 性能优化-启动优化-术篇

image.png 工欲善其事必先利其器,最近在启动优化上踩了不少坑,写篇文章记录下,也给大伙避避坑,节省些时间。

启动优化是什么,完全可以顾名思义,本文就不赘述了。至于为什么要做性能优化--QAQ,大家dddd

问题场景

主要分为如下两种场景,笔者主要在第一种场景下进行实操哈

1、项目中已有性能启动相关埋点以及启动时间要求,在做需求的过程中导致启动性能达不到合并主干标准

2、项目代码一直从头撸到尾,没做过性能优化,突然需要进行专项优化

第一个场景的关键就在与一个字-比,比啥呢?当然是比启动时间。那么该怎么比呢?

想必大多数的项目都是在Applicaiton的attachBaseContext方法开始计时,然后在MainActivity的onWindowFocusChanged方法结束计时,这之间的时间差就作为启动时间的数据依据。

现在时间差是有了,但是光知道启动慢了解决不了问题呀。所以就需要下面的工具来帮忙啦。

检测工具

1、Android Studio的Profiler

2、Perfetto

3、TraceView-官方已不推荐使用,改用perfetto吧

Android Studio的Profiler 使用方法-手把手教学录制Trace

As内置的工具,个人感觉这个是最好使的,虽然说在新版本的As上会有些bug,不过瑕不掩瑜哈,大多数情况都是靠这个工具解决的问题。 Profile有几种使用的姿势,我都一一讲解下

1、直接点击工具栏的profiler按钮

image.png

该操作会让as重新build,然后给你装包之后自动启动profiler,不过也仅仅是启动了profiler,as没帮你开启trace,我们需要比对的就是trace。还需要一个进行一项设置才能在启动profiler的时候也开启trace。

1656750835285.png

1656750943077.png

按照上图设置好之后,ok让设置生效,然后点profiler的图标,as就会在启动profiler的时候也开启trace,你只需要在界面可见的时候点击stop record即可。

如此操作在基线包和功能最新包上跑出两个trace即可进行Trace对比了。

2、直接点击工具栏的profiler按钮-省去编包时间版

还是点profiler按钮,不过使用姿势不一样哈,跟第一个方法不一样的地方在于,该方法不需要跑一个Trace就编一个包,大项目编个包十分钟是很稀松平常的事情,按第一个方法的话,一早上跑三五个trace就顶天了。区别如下:

1656751493767.png

这次我们需要先编译出基线包跟分支包,然后用上图的方式分别打开两个apk,然后按照第一个方法的步骤edit configuration,设置启动app的同时开启trace record。

在提前备好基线包的情况下,随时都能跑个trace出来,不用重新编包了。美滋滋。不过最好还是按照下图的操作,留下trace文件,这样基线的trace就能重复使用了。

image.png

3、代码打点录制trace-究极推荐

上面的方法1,2临时用用也还行,不过问题在于结束的时间点会由于手动的缘故,trace文件的录制时长波动较大,后续trace比对的时候,还需要手动拖动范围进行校准。在明确是进行启动性能优化的目的情况下,极其推荐使用该方法进行trace的录制。

Applicaiton的attachBaseContext方法开始计时的位置执行1,然后在MainActivity的onWindowFocusChanged方法结束计时执行2

1
Debug.startMethodTracingSampling(path, 5 * 16 * 1024 * 1024, 200)

2
Debug.stopMethodTracing()

方法一的参数path是trace的文件名,建议用时间命名,第二个参数是trace的文件大小,第三个参数是采样时间,这里为什么使用startMethodTracingSampling而不是startMethodTracing呢? 详细介绍看这里

image.png

代码里面埋好代码之后,还是原来的配方-编出带有trace埋点的基线包以及分支包,运行,这次在运行后就能在指定目录拿到录制好的trace,接下来导入到as即可

image.png

经过上面的一顿操作,想必你已经学会如何用AS录制trace了吧。接下来就是开两个as,拿着两个trace对比来挤牙膏了,后面的这一步不属于工具篇的部分了,如果有小伙伴需要的话,再开新坑讲解下吧。

Perfetto 使用方法

这是谷歌新推出的工具,此工具的使用场景比较特殊,一般情况下用不到,不过要用到的时候是真的香(涉及锁,binder,cpu,io瓶颈方面的问题)。就是在使用的时候有挺多坑的。。不踩一踩坑压根就用不上。。

在Trace类型上,Perfetto适用于SystemTrace,不适用与methodTrace,虽然As也能进行SystemTrace的录制跟解析,不过功能没有Perfetto这么强大哈。

1、网页ui进行录制

image.png 该方法虽然看起来方便,而且有一堆设置可以选择,不过不知道是因为手机设备的问题,还是有bug,笔者愣是没成功,一点录制就报错。。遂放弃该方法。

2、命令行录制

直接参考官方文档吧 这个方法也是一堆奇奇怪怪的报错,录制个SystemTrace得踩一堆坑。属实太麻烦了,遂笔者在尝试了一波能成功录制了之后,还是放弃了使用该方法。

3、系统开发者选项的录制入口-究极推荐

官方文档

image.png 虽然说类别选择上没有网页ui上多,不过妥妥的够用了好嘛。重点是简单方便。配置好一次类别之后,再给添加上控制中心的快捷入口,以后尽管点快捷入口录制即可。

总结下

不管是As的Profiler还是Perfetto,都选第三个推荐方法即可,简单粗暴还省时间,这么多录制Trace的姿势大家学废了吗。 还有些细节,由于篇幅有限,后面再开新坑写吧,写太长大家会看不下去的吧。哈哈

有啥不懂的,可以私聊下,问得多的部分再开新坑

猜你喜欢

转载自juejin.im/post/7115710746876444703