Android 优化之路(一)布局优化

3.5.1使用 标签

ViewStub继承了View,它非常轻量级且宽和高都为0,因此它本身不参与任何的绘制过程,避免资源的浪费,减少渲染时间,在需要的时候才加载View。因此ViewStub的意义在于按需求加载所需的布局,在实际开发中,很多布局在正常情况下不会显示,比如加载数据暂无数据,网络异常等界面,这个时候就没必要在整个界面初始化的时候将其加载进来,通过ViewStub就可以做到在使用时在加载,提高了程序初始化时的性能。如下一个ViewStub的示例:

<?xml version="1.0" encoding="utf-8"?>

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:gravity=“center”
android:orientation=“vertical”>

//view_stub是ViewStub的id,empty是empty_data.xml这个布局根元素的id

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
//加载ViewStub中的布局的两种方式setVisibility或inflate
mViewStub.setVisibility(View.VISIBLE);
mViewStub.inflate();

}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用ViewStub需注意:当ViewStub通过setVisibility或inflate方法加载后,ViewStub就会被它内部的布局替换掉,这个时候ViewStub就不再是布局结构中的的一部分。目前ViewStub中的layout还不支持使用 标签。

3.5.2尽可能少用布局属性 wrap_content

布局属性 wrap_content 会增加布局测量时计算成本,应尽可能少用

3.6 减少控件的使用(善用控件属性)

在绘制布局中,某些情况下我们可以省去部分控件的使用。下文介绍几种常见的情况:

3.6.1 TextView文字加图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图布局,通常想到的是一个相对布局里包含一个TextView和两个ImageView。事实上我们只需要一个TextView就可以实现

<TextView
android:layout_width=“match_parent”
android:layout_height=“50dp”
android:layout_marginTop=“20dp”
android:paddingLeft=“16dp”
android:paddingRight=“16dp”
android:gravity=“center_vertical”
android:drawableLeft=“@mipmap/icon_my_unlock” // 设置左边显示的icon
android:drawablePadding=“10dp” // 设置icon和文本的间距
android:drawableRight=“@mipmap/icon_right” // 设置右边显示的icon
android:text=“@string/account_unlock”
/>

3.6.2 LinearLayout分割线

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图布局,通常是用高为1dp的View来显示,实际上LinearLayout本身就能实现

<?xml version="1.0" encoding="utf-8"?>


<?xml version="1.0" encoding="utf-8"?>

核心代码就是对LinearLayout设置divider

  • divider 设置分割线样式,需注意不能简单只给个颜色值,比如#f00或者@color/xxx这样,drawable一定要是个有长、宽概念的drawable,当然你也可以直接一张图片当divider。
  • dividerPadding 设置分割线两边的间距
  • showDividers 设置分割线显示位置。其中middle控件之间显示;beginning第一个控件上面显示分割线;end最后一个控件下面显示分割线,none不显示分割线
3.6.3 TextView的行间距和占位符的使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图布局,通常想到的是一个线性布局里包含3个TextView。事实上我们只需要一个TextView就可以实现

通过lineSpacingExtra设置行间隔,test_text内容为:

标题:%1KaTeX parse error: Undefined control sequence: \n at position 2: s\̲n̲时间:%2s\n内容:%3$s

在MainActivity中的使用

mText.setText(String.format(getResources().getString(R.string.test_text), “测试”, “2018-8-9”,“测试测试”));

占位符的使用方法:%n表示第n位要被替换的, s ∗ ∗ 表示字符串类型占位符, ∗ ∗ s**表示字符串类型占位符,** s表示字符串类型占位符,d表示整型占位符,$f表示浮点型占位符


4. 布局调优工具

在实际开发中哪怕注意了上述的优化方案,难免还是会出现布局性能的问题。这时我们可使用布局调优工具来分析问题。本文将介绍常用的几种工具。

4.1 Lint

Lint 是Android Studio 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量问题,同时提供一些解决方案,而且这个过程不需要我们手写测试用例。 Lint 的使用路径: 工具栏 -> Analyze -> Inspect Code

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

默认是检查整个项目,我们可以点击 Custom scope 自定义检查范围

  • Project Files:所有项目文件
  • Project Production Files:项目的代码文件
  • Project Test Files:项目的测试文件
  • OpenFiles:当前打开的文件
  • Module ‘app’:主要的 app 模块
  • Current File:当前文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当然你也可以选择特定的类进行检查点击下图红色箭头标识的地方

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点击“+”号新增一个检查范围:

  • Local:只能当前项目使用
  • Shared:其他 Android Studio 项目也可以使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选择Shared,默认按项目显示,检查的文件数为 0 。下图红色框中4个按钮表示要操作的类型

  • Include:包括当前文件夹内的文件,但不包括他的子文件夹
  • Include Recursively:包括当前文件夹以及它的子文件夹内所有的文件夹,递归添加
  • Exclude:移除当前文件夹,不包括子文件夹
  • Exclude Recursively:移除当前文件夹及所有子文件夹

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们左击想扫描的文件,点击右边对应的按钮。可以看到文件边色了,红框显示需扫描24个文件,点击OK→OK

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

稍等一会儿,会弹出 Inspection 对话框,显示检查结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Lint 的警告严重程度有以下几种:

  • Unused Entry:没有使用的属性,灰色,很不起眼
  • Typo:拼写错误,绿色波浪下划线,也不太起眼
  • Server Problem:服务器错误?好像不是
  • Info:注释文档,绿色,比较显眼
  • Weak Warning:比较弱的警告,提示比较弱
  • Warning:警告,略微显眼一点
  • Error:错误,最显眼的一个

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文对Lint的介绍就到此如果对Lint想了解更多的小伙伴可以点击Lint

4.2 Hierarchy Viewer

Hierarchy Viewer 是Android Studio 提供的UI性能检测工具。可获得UI布局设计结构 & 各种属性信息,帮助我们优化布局设计 。

使用Hierarchy Viewer ,您的设备必须运行Android 4.1或更高版本。如果您是使用真机的话需注意以下两点:

  • 在您的设备上启用开发者选项
  • 在开发计算机上设置环境变量 ANDROID_HVPROTO=ddm
    此变量告诉Hierarchy Viewer使用ddm 协议连接到设备,该协议与DDMS协议相同。需要注意的是,主机上只能有一个连接到设备的进程,因此您必须终止任何其他DDMS会话才能运行Hierarchy Viewer。

Hierarchy Viewer 的使用路径: 工具栏 ->Tools->Android->Android Device Monitor(默认是显示DDMS窗口,更改可点击Open Perspective->Hierarchy Viewer,也可以直接点击 Hierarchy Viewer Button),如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

更改后显示Hierarchy Viewer的窗口如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果您看的的视图排列不一样,可选择 Window->Reset Perspective 返回默认布局。下面介绍下基本窗口:

  • Window(左上角)显示设备信息,app以包名显示,双击选中。
  • View Properties(左上角)显示视图的属性
  • Tree View(中心):显示视图层次结构的树视图。您可以使用鼠标拖动树和缩放树,并在底部使用缩放控件。每个节点都指示它的View类名和ID名称。
  • Tree Overview(右上角):使您可以鸟瞰应用程序的完整视图层次结构。移动灰色矩形以更改树视图中可见的视口。
  • Layout View(右下角):显示布局的线框视图。当前所选视图的轮廓为红色,其父视图为浅红色。单击此处的视图也会在树视图中选择它,反之亦然。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图图标的使用左到右介绍:

  • 重新加载视图层次结构
  • 该视图弹窗
  • 使布局无效
  • 请求布局
  • 重新加载视图层次结构
  • 分析视图,显示视图的耗时

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所选的节点上方会有个小窗口显示子View数和MeasureLayoutDraw绘制所需时间。
所选节点的每个子视图都有三个点,可以是绿色,黄色或红色。

  • 左点表示渲染管道的绘制过程。
  • 中间点代表布局阶段。
  • 右点表示执行阶段。

这些点大致对应于处理管道的度量,布局和绘制阶段。点的颜色表示该节点相对于本地系列中所有其他配置节点的相对性能。

  • 绿色 表示视图渲染速度比其他视图中的至少一半快。
  • 黄色 表示视图呈现的速度比其他视图的下半部分快。
  • 红色 表示视图是最慢的一半视图之一。

所测量的是每个节点相对于兄弟视图的性能,因此配置文件中始终存在红色节点,除非所有视图执行相同,并且它并不一定意味着红色节点执行得很差(仅限于它是最慢的视图)在本地视图组中)。

本文对Hierarchy Viewer的介绍就到此了,想了解更多的小伙伴可以点击Hierarchy Viewer

4.3 开发者选项(调试GPU过度绘制)

开发者选项是Android 系统为开发者提供的一个APP验证、调试、优化等各种功能的入口(需Android 4.1以上)。本文主要对GPU过度绘制菜单介绍,对其他菜单功能有兴趣的小伙伴可以参考探索Android手机开发者选项

GPU过度绘制是指在屏幕上某个像素在同一帧的时间内被绘制多次,产生的主要原因有两个:

  • 在XML布局中,控件有重叠却都设置背景
  • View的OnDraw中同一区域绘制多次
4.3.1 开启开发者选项

不同手机开发商都对手机界面做了定制化处理,打开手机开发者选项的方式各不相同,但基本的功能菜单都是类似的。由于笔者现在用的是小米5s Plus,因此打开方式是设置->我的设备->全部参数->连续点击MIUI版本,提示开发者模式开启即可(不同MIUI版本开启路径也不一样)。然后设置->更多设置,高级设置或者其他设置等等菜单中即可看到开发者选项的菜单了。

4.3.2 开启GPU过度绘制

在开发者选项中点击调试GPU过度绘制,如下图所示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这时屏幕会出现各种颜色,每种颜色的定义为:

  • 原色: 没有过度绘制 – 每个像素在屏幕上绘制了一次。
  • 蓝色: 一次过度绘制 – 每个像素点在屏幕上绘制了两次。
  • 绿色: 两次过度绘制 – 每个像素点在屏幕上绘制了三次。
  • 粉色: 三次过度绘制 – 每个像素点在屏幕上绘制了四次。
  • 红色: 四次或四次以上过度绘制 – 每个像素点在屏幕上绘制了五次或者五次以上。
    以上就是本文对布局调优工具的介绍,当然还有其他布局调优工具如Systrace本文就不一一介绍了。

结尾

本文主要讲解Android 性能优化中的 布局优化。如对小伙伴们有帮助,麻烦给个喜欢,不足之处请留言私聊点出谢谢!
对Flutter有兴趣的可参考Flutter学习之路(一)Flutter简介及Window下开发环境搭建
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
img
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结:

面试是一个不断学习、不断自我提升的过程,有机会还是出去面面,至少能想到查漏补缺效果,而且有些知识点,可能你自以为知道,但让你说,并不一定能说得很好。

有些东西有压力才有动力,而学到的知识点,都是钱(因为技术人员大部分情况是根据你的能力来定级、来发薪水的),技多不压身。

附上我的面试各大专题整理: 面试指南,满满的都是干货,希望对大家有帮助!
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
3111)]

总结:

面试是一个不断学习、不断自我提升的过程,有机会还是出去面面,至少能想到查漏补缺效果,而且有些知识点,可能你自以为知道,但让你说,并不一定能说得很好。

有些东西有压力才有动力,而学到的知识点,都是钱(因为技术人员大部分情况是根据你的能力来定级、来发薪水的),技多不压身。

附上我的面试各大专题整理: 面试指南,满满的都是干货,希望对大家有帮助!
[外链图片转存中…(img-ZxLmGA6X-1712822313111)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-d5tfIuQl-1712822313111)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值