稀有猿诉

十年磨一剑,历炼出锋芒,说话千百句,不如码二行。

玩转安卓运行速度优化

早在许多年以前写过一篇安卓性能优化文章,时过境迁,很多事情都有了变化,所以再专门针对程序运行速度和渲染的优化,这两方面非常直接的影响应用程序的操作流畅度,也可以称作流畅度优化方法,但更为专业的方式就是CPU优化,因为就是要提高代码的运行速度。

需要优化的地方

总的来说,就是应用程序运行要快,大体可以分为三块:

应用启动要快

从用户点击了桌面的图标到用户能完整见到页面,这个过程要快。其实也不是快,而是没有能从用户感知得到的卡,或者黑屏或者白屏。

渲染要快

也就是说View的渲染要快,无明显的Jank,也即卡顿和丢帧。

操作要流畅

主要是针对动画,滑动,转场的时候要流畅,也并不一定就是要真的快,而是说从用户感知的角度来看没有明显的卡顿和丢帧。

业务逻辑要快

也就是说要快速的完成你的业务逻辑,这个其实没有办法一概而论,取决 于具体的业务逻辑和实际的使用场景,比如网络不好的时候肯定啥都慢啊。

我们常说的性能优化,一般重点是在启动,渲染和操作流畅度上面下功夫,因为这些东西的优化方法更为通用一些,用户感知也更明显一些。也将是我们后面要讨论的重点内容。而至于像业务逻辑,每个具体的应用程序都不一样,所以没有办法一概而论,而常规的一些小的优化技巧也不会起决定性使用。比如说I/O优化方法,缓存的使用,以及像内存优化等等,确实能帮助你的业务逻辑。但如果业务逻辑就是特别复杂,或者代码写的很差劲,明明一个网络请求就能搞定的事儿,非要弄四五个请求,那你再怎么优化细节,比如把每个请求速度都优化到最好,I/O优化到最好,也是没有多大提升的。

运行速度分析方法

前面提到的启动优化,渲染优化和操作流畅度优化,其实都是针对CPU的优化,也即代码执行的优化,只不过重点分析那三个场景而已。

具体的分析方法主要就有两方面,一是用Profiler抓取trace,另外就是可以在代码中加入打点数据。

可以先行用代码代码打点的方式进行粗略的量化,比如说看onCreate执行了多久,看onResume执行了多久,这有两方面好处,一是可以粗略的定位问题,二是方便监控,比如你优化前与优化后的对比,能知道到底是否真的有提升。

精细化分析的方法就是抓trace,然后看具体哪里耗时了,具体使用方法可参后面的罗列的资源都相当详细,就不重复了。

需要注意的就是分析trace时除了用Profiler以外,还可以用Perfetto,这个功能更为强大。

优化方法

具体的优化方法,就没有银弹了,做的事情特别多,代码特别复杂,逻辑特别多特别复杂,优化起来难度自然很大。

核心的原则就是少,少即是多,少做事,特别是主线程,能lazy则lazy,能异步则异步,涉及I/O时,要多用BufferedStream,巧用缓存,buffer尽可能要是8k大小(8192),有重I/O的场景要用nio库。View tree要尽可能精简和扁平,某些特殊条件才会显示的页面就用ViewStub先占着等等。

参考资料

Comments