手机淘宝性能优化全记录

手机淘宝做为一个航母级的应用,承载了100多个业务方,部分是H5的形式接入,还有超过50个Native的业务方。为了规避安卓DEX65535的方法数限制以及各业务独立开发等须要,淘宝工程师门也是采用了多DEX(多Bundle)的开发形式,并且手淘做为一个以图片显示为重点的APP,在性能上不可避免的遇到了比较多的问题。android


手机淘宝遇到了那些性能问题?淘宝技术专家使用那些优化分析工具找出各类性能瓶颈的?在应用界面到中间件的优化过程当中,淘宝又有那些经验与咱们分享?你不在现场?不要紧,王曜东演讲的技术要点就在这里。web



手机淘宝遭遇的5大性能问题数据库



一、APP启动慢json

二、界面跳转慢canvas

三、事件相应慢数组

四、滑动和动画卡顿缓存

五、展示内容慢性能优化



手机淘宝的目前使用的主要优化工具网络



开发者选项中和Android提供了多个分析工具。并发

  • GPU Profile:查看每一帧的绘制状况。除了查看帧率,我还会用这个工具检查各个界面在静默状态下的没必要要的刷新问题。

  • Show GPU Overdraw:查看过渡绘制用的工具,由于手淘的不少界面效果也比较复杂,很容易出现过渡绘制。

  • Dump View Hierarchy:用于查看界面的布局、View和层级嵌套状况。特别是在没有源代码的状况下,查看很是方便。

  • TraceView:强大的性能跟踪工具,也是咱们在优化中用的最多的工具。

  • SysTrace:主要用于查看UI的绘制问题,跟踪CPU执行状况等。

  • Trace OpenGL:能够录制每一帧的绘制过程,逐个绘制命令查看。

  • AlloCation Tracker:内存分配跟踪,也是个调试性能的强大工具。

  • Threads 工具能够显示全部线程信息及查看线程正在执行的代码。

  • Heap和Memory Monitor:查看内存的分配和变化状况。Memory Monitor还能够查看内存的抖动和GC状况。

  

TraceView做为最主要的工具,王曜东特别强调了手淘在优化过程当中的一些经验。好比找出高频率调用函数有时候会比较特殊,要结合实际代码,好比写SharedPreferences的apply函数须要注意,由于Commit函数会阻塞IO,这个函数虽然执行很快,可是系统会有另一个线程来负责写操做,当apply频率高的时候,该线程就会比较占用CPU资源。相似的还有统计埋点等,在主线程埋点但异步线程提交,频率高的状况也会出现这样的问题。


其次查看布局性能,一种是直接查看,如onMeasure,OnLayout函数占用的百分比和平均执行时间太高致使的性能问题,很直观就能够看出来。还有就是例如getview中的布局性能,总体的查看inflate的个数和耗时问题的跟踪。还有一种是经过View的draw函数或者buildeDisplayList函数的调用和递归调用次数来判断布局的复杂度。


关于复用问题,好比在listview滑动过一遍后,在对这部分区域作跟踪,若是getview中还有infalte布局,那就是复用还有能够优化的地方。


类的初始化耗时,像构造函数,静态初始化等这些问题很容易忽视,可是在性能优化的后期,这些小的细节点,也是优化的方向,特别是在主线程中调用的时候。



手淘启动过程优化详解


启动过程优化是全部大型APP都会遇到的问题,启动慢,加载多。手淘也不例外,手淘的模块很是多,各业务方都但愿在启动的时候都能把本身先初始化起来,加上手淘也是分了不少了dex文件的,这样在首次启动的时候不只要dexpot这些模块的dex,还有主dex中的很多模块有初始化动做。


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1
▲手机淘宝启动过程优化
640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1
▲启动变慢案例分析

一、分析各个模块的线程数量,检查线程池的合理性。经过去掉没必要要的线程和线程池,再控制线程池的并发数。减小启动阶段的线程以及控制线程的启动时机。


二、经过MAT等工具,找出那些分配过多的对象和数量特别多的对象,咱们前面看到不少的容器,其实大部分都用不到,不须要在启动时就建立。淘宝工程师也发现首页缓存的布局太多,浪费较多的资源,因此须要减小缓存的数量。经过Systrace,能够发如今网络线程,统计,主线程等GC不少,因此对频繁建立的对象如网络库的Byte数组,Buffer等作复用。


三、当有较多的主线程耗时,须要将主线程中的耗时操做都异步处理或者移除。


四、IO:经过TraceView能够发现SharedPreference有2个线程常常占用不少的CPU时间,还有几个下载文件的线程如update等以及数据库操做这些都是IO操做。优化过程就是删除没必要要的io操做,有些作延后处理。例如统计数据,淘宝减小了采样的频率,而且增长缓存数量,以空间换时间,减小数据库和SharedPreference的读写。在作较多数据库操做的时候也会开启事务功能来减小IO的次数。


五、之前在启动阶段会安装主要模块的bundle,首页再启动后过3秒也会发送通知来唤起更多的模块,像淘宝的webview框架,在初始化的时候会把线上活动资源都缓存到本地,这个过程设计到json的解析,下载和解压缩等,很是耗资源等等,这些模块叠加在一块儿就致使了首页就会直接卡主及白屏很长一段时间,因此对这一种模块改成懒加载,而且要限制拉取活动的数量。还有像购物车,微淘,店铺,旺信等之前是首次启动会安装,也是改成懒加载。由于首次Dexopt会比较费时,特别是安卓5.0之后,因此不少模块都改成懒加载,这样首次使用该模块的时候变慢一点,可是总体启动速度一下就提高了。


六、降级摇一摇功能的检测频率,减小地理信息的数量


七、首页在欢迎页的时候开始初始化布局等,加快展现。退出的时候之前都是销毁Activity的,为了加快下次启动,释放到图片等主要资源,Activity不作销毁。



手机淘宝各界面的优化

  GPU过渡绘制的优化

  不须要显示的布局及时隐藏

  去掉层叠布局中多余的背景设置

  图片控件有前景内容的时候不显示背景

  界面背景定义到Activity的主题中

  减小Drawable的复杂Shape使用

  自定义控件onDraw函数减小绘制层次

  自定义控件使用canvas.clipRect

  优化布局性能

  优化层级

  灵活使用布局

  减小View数量

  异步infalte或者提早infalte

  本身作控件的回收复用

  加快界面显示

  主线程不作耗时操做

  减小主线程GC停顿

  利用本地缓存

  减小数据传输和解析时间

  注意线程优先级

  利用局部刷新


总结:

  一、发现性能问题的时候首先要分析缘由,是卡住仍是卡顿,是网络慢的问题,仍是是内存问题亦或是其余系统的问题。手淘遇到有时候手机厂商的一些特殊控件的bug也会致使问题。安卓系统自己的内存管理和一些监控软件有时候也会致使性能问题。


  二、经过多种工具额配合找出问题。


  三、有些问题,一个地方存在极可能其余地方也有,能够到相似的模块去查看,如圆形的图案,输入控件在输入法退出时引起的自动刷新问题。


  四、创建程序内的监控,以及代码层面的扫描等,手淘本身的代码平台有一些性能的扫描,但还不够完善,手淘APP内部也有性能监控的模块能够实时监控和统计程序中的性能问题。


  五、冰冻三尺非一日之寒。代码扫描和监控等自己都有必定的局限性,并且监控自己就会致使必定的性能损耗。因此一个性能好的APP应该防患于未然,从源头抓起,只有开发人员都对Java和android相关的性能至关熟悉,在开发的时候到处考虑到性能和内存问题,追求卓越,才能防微杜渐,这也是手机淘宝接下来努力的方向之一。

  

优化是没有止境的,虽然经过这几个月的优化,手淘在内存使用上降低了接近50%,平均帧率提升了近20%,首页的GC减小了90%。可是在低内存,低性能的手机上,手淘仍是面临不少的挑战,须要不断的去优化,也须要从源头上就把性能这块提高。

相关文章
相关标签/搜索