Android 性能处理

一般App主要的性能问题如下:
  • APP启动慢
  • 界面跳转慢
  • 事件相应慢
  • 滑动和动画卡顿
  • 展现内容慢
优化核心
  • GPU过渡绘制的优化
  • 不需要显示的布局及时隐藏
  • 去掉层叠布局中多余的背景设置
  • 图片控件有前景内容的时候不显示背景
  • 界面背景定义到Activity的主题中
  • 减少Drawable的复杂Shape使用
  • 自定义控件onDraw函数减少绘制层次
  • 自定义控件使用canvas.clipRect
  • 优化布局性能
  • 优化层级
  • 灵活使用布局
  • 减少View数量
  • 异步infalte或者提前infalte
  • 自己做控件的回收复用
  • 加快界面显示
  • 主线程不做耗时操作
  • 减少主线程GC停顿
  • 利用本地缓存
  • 减少数据传输和解析时间
  • 注意线程优先级
  • 利用局部刷新
主要的优化工具如下
  • GPU Profile:查看每一帧的绘制情况。除了查看帧率,我还会用这个工具检查各个界面在静默状态下的不必要的刷新问题。
  • Show GPU Overdraw:查看过渡绘制用的工具,因为手淘的很多界面效果也比较复杂,很容易出现过渡绘制。
  • Dump View Hierarchy:用于查看界面的布局、View和层级嵌套情况。特别是在没有源代码的情况下,查看非常方便。
  • TraceView:强大的性能跟踪工具,也是我们在优化中用的最多的工具。
  • SysTrace:主要用于查看UI的绘制问题,跟踪CPU执行情况等。
  • Trace OpenGL:可以录制每一帧的绘制过程,逐个绘制命令查看。
  • AlloCation Tracker:内存分配跟踪,也是个调试性能的强大工具。
  • Threads 工具可以显示所有线程信息及查看线程正在执行的代码。
  • Heap和Memory Monitor:查看内存的分配和变化情况。Memory Monitor还可以查看内存的抖动和GC情况。
优化过程中的一些经验
  • 写SharedPreferences的apply函数需要注意,因为Commit函数会阻塞IO,这个函数虽然执行很快,但是系统会有另外一个线程来负责写操作,当apply频率高的时候,该线程就会比较占用CPU资源。类似的还有统计埋点等,在主线程埋点但异步线程提交,频率高的情况也会出现这样的问题。优化过程就是删除不必要的io操作,有些做延后处理。例如统计数据,淘宝减少了采样的频率,并且增加缓存数量,以空间换时间,减少数据库和SharedPreference的读写。在做较多数据库操作的时候也会开启事务功能来减少IO的次数。

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

  • 关于复用问题,比如在listview滑动过一遍后,在对这部分区域做跟踪,如果getview中还有infalte布局,那就是复用还有可以优化的地方。

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

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

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

总结
  • 发现性能问题的时候首先要分析原因,是卡住还是卡顿,是网络慢的问题,还是是内存问题亦或是其他系统的问题。手淘遇到有时候手机厂商的一些特殊控件的bug也会导致问题。安卓系统本身的内存管理和一些监控软件有时候也会导致性能问题。

  • 通过多种工具额配合找出问题。

  • 有些问题,一个地方存在很可能其他地方也有,可以到类似的模块去查看,如圆形的图案,输入控件在输入法退出时引发的自动刷新问题。

  • 建立程序内的监控,以及代码层面的扫描等,添加性能监控的模块可以实时监控和统计程序中的性能问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容