绘制优化和内存优化:

绘制优化:

性能优化是一个很庞大的体系,它包括绘制优化,内存优化,电量优化,启动优化,存储优化,流量优化,图片优化和APK优化等等。

1.绘制性能分析:

Android应用需要将自己的界面展示给用户,用户会和界面进行交互,界面的流畅度至关重要。

1.1:绘制原理:

view的绘制流程有三个过程,分别是measure,layout,draw。它们主要运行在系统的应用框架层,而真正将数据渲染到屏幕上的则是系统的Native层的SurfaceFlinger服务来完成的。绘制过程主要是由CPU来进行measure,layout,record,execute的数据计算工作,而GPU则负责栅格化,渲染。CPU和GPU是通过图形驱动层来进行连接的,图形驱动层维护了一个队列,CPU将display list添加到该队列中,这样GPU就可以从这个队列取出数据来进行绘制。

帧数:帧数就是在1秒时间里传输的图片的量,也可以理解为图形处理器每秒钟能够刷新几次,通常使用FPS来表示。每一帧其实就是静止的图像,通过快速连续的显示帧形成了运动的假象。比如:要想画面保持在60fps,那么屏幕需要一秒钟内刷新60次,也就是每16.6667ms刷新一次,绘制时间在16ms以内。

Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次都渲染成功,那么就可以达到所需要的60fps。那什么是VSYNC呢?VSYNC是Vertical synchronization的缩写,是一种定时的中断,一旦收到VSYNC信号,CPU就开始处理各帧的数据。

产生卡顿的原因有很多,主要有以下几点:

  • 布局layout过于复杂,无法在16ms内完成渲染。
  • 同一时间内动画执行的次数过多,导致CPU或者GPU负载过重。
  • view过度绘制,导致某些像素在同一帧时间内被绘制多次。
  • 在UI线程中做了稍微耗时的操作。
  • GC回收时暂停时间过长或者频繁的GC产生了大量的暂停时间。

1.2:profile gpu rendering:

profile gpu rendering是GPU呈现模式分析,在开发者选项中打开。图中横轴代表时间,纵轴代表某一帧的耗时。绿色的横线代表警戒线,超过这条线代表绘制的时间超过了16ms,尽量要保证垂直的彩色柱状图保持在绿色的横线下面。而这些垂直的彩色柱状图代表着一帧,这些不同颜色的彩色柱状图代表着不同的含义。

1.2.1:颜色:

其中在Android6.0之后,有以下颜色:

  • 橙色(Swap Buffers):代表处理的时间,是CPU告诉GPU渲染一帧的地方,这是一个阻塞调用,因为CPU会一直等待GPU发出接到命令的回复,如果橙色柱状图很高,则表明GPU很繁忙。
  • 红色(Command Issue):代表执行的时间,这部分是Android进行2D渲染 Display List的时间。如果红色柱状图很高,可能是由重新提交了视图而导致的。还有复杂的自定义View也会导致红的柱状图变高。
  • 蓝色(Draw):代表测量绘制的时间,也就是需要多长时间去创建和更新DisplayList。如果蓝色柱状图很高,可能是需要重新绘制,或者View的onDraw方法处理事情太多。
  • 浅蓝色(Sync & Upload):表示的是准备当前界面上有待绘制的图片所耗费的时间,为了减少该段区域的执行时间,我们可以减少屏幕上的图片数量或者是缩小图片的大小。
  • Measure/Layout:表示布局的onMeasure与onLayout所花费的时间,一旦时间过长,就需要仔细检查自己的布局是不是存在严重的性能问题。
  • Animation:表示计算执行动画所需要花费的时间,包含的动画有ObjectAnimator,ViewPropertyAnimator, Transition等。一旦这里的执行时间过长,就需要检查是不是使用了非官方的动画工具或者是检查动画执行的过程中是不是触发了读写操作等等。
  • Input Handling:表示系统处理输入事件所耗费的时间,粗略等于对事件处理方法所执行的时间。一旦执行时间过长,意味着在处理用户的输入事件的地方执行了复杂的操作。
  • Misc Time/Vsync Delay:表示在主线程执行了太多的任务,导致UI渲染跟不上VSYNC的信号而出现掉帧的情况。

1.3:Systrace:

Systrace是Android4.1新增的性能数据采样和分析数据,它可以帮助开发者收集Android关键子系统的运行信息。

1.3.1:在DDMS在使用Systrace:
  1. 打开Android Device Monitor,并且连接手机。
  2. 点击systrace进入抓取设置界面。
  3. 设置完成之后,操作跟踪的过程,跟踪时间结束之后,生成trace.html文件。
  4. 用chrome打开trace.html文件进行分析。
1.3.2:命令行使用Systrace:

Android提供了一个python脚本文件systrace.py。

1.3.3:在代码中使用Systracce:

在Android4.3以上的版本中,可以使用Trace类对应用中的具体活动进行跟踪。其中TraceCompat类对Trace类进行了封装,而它的beginSection方法和endSection方法之间的代码会被跟踪。endSection方法只会结束最近的beginSection方法,因此要保证两个方法的调用次数要相同。

2.布局优化:

2.1:布局优化工具:

Hierarchy Viewer和Android Lint

2.2:布局优化方法:

  1. 合理利用布局控件。
  2. 使用Include标签来进行布局的复用。例如:多个布局需要复用一个相同的布局。
  3. 使用Merge标签去除多余层级。Merge标签最好用来替代FrameLayout或者布局方向一致的LinearLayout。
  4. 使用viewstub来提高加载速度。例如:在想要一个布局时,有时候不是所有的控件都需要显示出来,对于这种情况一般采用的是view的gone和invisible属性来达到隐藏效果,但是仍然在布局中系统也会想着解析它们,所以可以所以使用viewstub,它是轻量级的viewstub,不可见也不占布局的位置。
  5. 避免GPU过度绘制。过度绘制指的是在屏幕上某个像素在同一帧时间内被绘制多次,过度绘制是难以避免的,尽量少。在开发者选项中打开调式GPU过度绘制可以看到很多颜色。其中:白色(没有过度绘制),蓝色(一次过度绘制,也就是绘制了两次),绿色(两次),粉色(三次),红色(四次)。避免过度绘制可以移除不需要的background和在自定义view的onDraw方法中,用canvas.clipRect来指定绘制的区域,防止重叠。

内存优化:

1.避免可控的内存泄漏:

内存泄漏向来都是内存优化的重点,每个应用程序都需要内存来完成工作,为了确保Android系统的每个应用都有足够的内存,Android系统需要有效的管理内存的分配。当内存不足时,Android运行时就会触发GC。GC采用的垃圾标记算法是根搜索算法。而内存泄漏就是没有用的对象到GC Roots却是可达的(该没有用的对象就会发生内存泄漏),导致GC无法回收该对象。

内存泄漏产生的原因:

  • 由开发人员编码造成的(可控的)。
  • 由第三方框架造成的。
  • 由Android系统或者第三方ROM造成的。

2.内存泄漏的场景:

  1. 非静态内部类会持有外部类的实例引用,如果非静态内部类的实例是静态的,就会间接长期维护者外部类的引用,阻止被系统回收。
  2. 多线程相关的匿名内部类/非静态内部类。
  3. Handler内存的泄漏。解决方法:使用静态的Handler内部类,且Handler持有的对象要使用弱引用;或者在activity的onDestroy方法中移除MessageQueue中的消息。
  4. 没有正确的使用context。对于不是必须使用activity的context的情况,我们可以考虑使用application context来替代。
  5. 静态View。使用静态的view可以避免每次启动activity时都去读取并且渲染view,但是静态的view会持有activity的引用,导致activity无法被回收。解决的方法是在onDestory方法将静态的view设置为null。
  6. webView。webView有很大的兼容问题,可以给每个webView都单开一个进程,使用AIDL与应用程序进程进行通信。
  7. 资源对象在不使用的时候,要确保已经关闭。
  8. 集合中对象的引用在不需要的时候没有清理。
  9. Bitmap对象。临时创建的某个比较大的Bitmap对象,在变换之后得到新的Bitmap对象之后,应该尽快回收原始的Bitmap对象。
  10. 监听器没有关闭。

3.内存分析工具:

Memory Monitor:报告出应用程序的内存分配的情况,呈现出应用程序使用的内存。

Allocation Tracker:用于跟踪内存的分配。

Heap Dump:查看不同的数据类型在内存中的使用情况。

Memory Analysia Tool(MAT):更加深入的分析内存泄漏所产生的堆存储文件。

LeakCanary:更加快速排除内存泄漏的问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mo@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值