0
点赞
收藏
分享

微信扫一扫

Android群英传笔记-性能优化

秦瑟读书 2022-03-14 阅读 25

性能优化

布局优化

Android Ui渲染机制

人眼觉得流程的画面,需要达到40帧/s 到 60帧/s 。安卓中,系统通过 VSYNC信号触发对UI的渲染,重绘,间隔时间是16ms(1s显示60帧的时间)。所以,我们需要保证16ms内完成ui的绘制,否则会造成丢帧,下次信号才开始开始绘制该帧,导致连续两个16ms都显示同一帧画面,从而造成卡顿。
Android系统提供ui渲染时间检测工具,在手机上,打开开发者选项,选择Profile GPU Rending ,并选中on screen as bars ,就显示条形图,展示渲染ui时的一些数据。具体内容见书中。

布局优化

避免 Overdraw

Overdraw,过渡绘制,会造成GPU和CPU资源的浪费。例如系统默认会绘制Activity的背景,如果再给布局绘制了重叠的背景,那么系统默认绘制的背景就是默认的过渡绘制。Android系统开发者选项中,有一个过渡绘制的检测工具-“Enable GPU Overdraw”,激活后,可以通过界面上的颜色判断Overdraw的次数。

这里是 具体介绍 overdraw的文章

优化布局层级

系统通过对view进行测量,绘制,布局时,都会遍历view树。所以我们view嵌套太多,会导致树太高,严重影响效率。文档建议树的高度一般不超过10层。
在选择layout组件时,应该考虑该组件的特点来进行选择使用,否则会嵌套无用布局,增加view树的高度。这种嵌套无用布局问题在初学时,经常出现,应该尽早避免。

使用< include>标签重用布局

在实习的时候,有的项目就使用include来重用 topbar,当时只是简单的使用,而没有进行思考为什么这样使用。
在一个应用中,为了保持风格统一,有很多共通的ui,例如
topbar,bottombar,比起简单的粘贴复制代码到每一个布局,include是不错的选择。
使用include注意:

  1. 布局的heigth和 width都设为 0dp,让调用者自己设置大小
  2. 最好不要在共通的ui中使用某个特定layout组件才有的属性,因为我们的共通布局,不止服务于某个特定layout。
  3. < include>标签中可以覆盖原布局的属性,如果覆盖类似 layout_xx这样的属性,就必须同时指定layout_heigth和layout_width。

使用< ViewStub>实现延时加载

对于一些view的延时加载,之前使用的是 visivility属性,让view不可见或者可见,这样的做法对于简单view还可以接受,但对于复杂的view,是必须避免的。这样会把复杂的绘制都一次交给系统处理,导致资源紧张。所以采用 viewStub(不可见,大小为0),可以在不影响用户体验的情况下,让页面的绘制分批次进行。具体使用可以自行查阅资料。

布局优化工具

布局优化工具,Hierarchy VIewer,自己了解使用。

内存优化

App内存的使用,也是评价一个应用性能的重要指标

内存简介

由于安卓的沙箱机制,每个应用分配的内存大小,是有限度的。内存太低,就出发LMK-Low Memory Killer机制。
一般说的内存,就是手机的RAW,包含以下几部分

  • 寄存器
  • 静态储存区

获取Android系统内存信息

两个系统提供的工具,具体使用自行搜索

  • Process Stats
  • Meminfo

内存回收

java不需要手动管理系统资源,它创建了垃圾收集器线程来自动进行资源管理。这样可以降低开发人员对于内存管理的繁琐工作,但是也有问题。例如java的GC是开发者无法控制的,即使调用System.gc(),也只是建议系统gc,不一定被采纳。无法控制过程,就会导致一些对象无法被回收,导致内存泄露

Bitmap优化

Bitmap是内存占用过高甚至OOM的最大威胁,一些使用技巧

  • 使用适当分辨率的图片:这就是资源分辨率文件夹对应不同分辨率图片的重要性,如果二者分辨率不匹配或者图片分辨率过高,可能会导致内存资源消耗更多。同时,注意缩略图的使用,例如列表中使用缩略图,具体查看再使用原图。
  • 即时回收内存:一般使用完bitmap后,要进行bitmap.recycle方法释放内存,但Android 3.0之后,bitmap被放置到堆中,就不用自行释放了。
  • 使用图片缓存:使用内存缓存和硬盘缓存,可以更好的使用bitmap(不太了解意思)

代码优化

  • 减少成员变量
  • 减少不必要的对象
  • 尽量不要使用枚举和迭代器
  • 对于 Cursor,Receiver,SensormFile的使用,注意创建,回收,注册,注销操作,即使用后需要及时关闭
  • 使用surfaceView来进行大量,频繁的画图
  • 尽量使用视图缓存,而不是,每次都使用inflate()方法解析视图
  • 非常复杂的绘图操作,使用RenderScript,OpenGL

工具推荐

  • Lint:Android Studio 代码,布局提示工具
  • Memory Monitor:Android Studio 实时内存监视工具,
  • TraceView:可视化性能调查工具
  • Android Device Monitor:分析内存的强力助手
举报

相关推荐

0 条评论