Android性能优化之布局优化

Android性能优化(安卓性能优化)内存泄露 | 内存优化 | UI绘制优化 | 布局优化 | 图片加载 | 多线程优化 | 列表优化 | apk优化 在Android开发中,性能优化是软件开发中最难且也是知识面涉及最深、最广、最难的一个领域,更是开发一款优秀软件的必要条件。更快:App流畅,响应速度快更稳:App运行稳定,程序不崩溃(Crash)也不会无响应(ANR)更省:节省资源,包括电量,内存,存储,流量等。 阅读详情

参考《Android性能优化之布局优化》 侵删

绘制的原理
  1. Android需要把XML布局文件转换成GPU能够识别并绘制的对象。这个操作是在DisplayList的帮助下完成的。DisplayList持有所有将要交给GPU绘制到屏幕上的数据信息。
  2. CPU负责把UI组件计算成Polygons,Texture纹理,然后交给GPU进行栅格化渲染。
  3. GPU进行栅格化渲染。
  4. 硬件展示在屏幕上。

为了能够使得APP流畅,我们需要在每一帧16ms以内完成所有的CPU与GPU计算,绘制,渲染等等操作。也就是帧率为60fps,为什么帧率要为60fps呢,因为人眼与大脑之间的协作无法感知超过60fps的画面更新。这个流程的表现性能取决于View的复杂程度,View的状态变化以及渲染管道的执行性能。

Overdraw(过度绘制):描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,就会导致某些像素区域被绘制了多次,浪费大量的CPU以及GPU资源。(可以通过开发者选项,打开Show GPU Overdraw的选项,观察UI上的Overdraw情况)。

所以我们需要尽量减少Overdraw。

Android布局优化常用方法

综上,布局的优化其实说白了就是减少层级,越简单越好,减少overdraw,就能更好的突出性能。
1. 首先是善用相对布局RelativeLayout。布局里面有多个LinearLayout,如果可以使用RelativeLayout进行改变布局,则用RelativeLayout,减少不必要的层级,减少overdraw。这个可以使用Android IDE自带的工具Hierarchy View去看看布局层级关系。
2. 使用抽象布局标签include、merge、ViewStub
include标签常用于将布局中的公共部分提取出来,比如我们要在activity_main.xml中需要上述LinearLayout的数据,那么就可以直接include进去了。

共用的一个comm_layout.xml

<?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:orientation="horizontal">

    <ImageView
        android:id="@+id/iv_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="16dp"
        android:text="这个是MergeLayout"
        android:textSize="16sp" />

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include layout="@layout/comm_layout" />

</RelativeLayout>

merge标签是作为include标签的一种辅助扩展来使用,它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套。如上述include标签引入了之前的LinearLayout之后导致了界面多了一个层级,我们可以通过merge来减少层级,但是布局也没法正常排布,所以要视布局情况而定。

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="horizontal">

    <ImageView
        android:id="@+id/iv_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:src="@mipmap/ic_launcher"/>

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="16dp"
        android:text="这个是MergeLayout"
        android:textSize="16sp"/>

</merge>

viewstub我们过去在布局里暂时不显示的布局,都会用Visible.GONE来先隐藏,然后在业务代码里将其显示,这样做的优点是比较灵活,但是缺点是耗费资源,即它仍会被Inflate,被实例化,设置属性。而viewstub是view的子类,他是一个轻量级View, 隐藏的,没有尺寸的View。他可以用来在程序运行时简单的填充布局文件,去电是ViewStub指定的布局被Inflate后,就不能再通过ViewStude来控制它了。如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        android:id="@+id/layout_merge"
        layout="@layout/item_merge_layout" />

    <Button
        android:id="@+id/btn_view_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="显示ViewStub"
        android:textAllCaps="false"
        android:layout_below="@+id/tv_content"/>

    <Button
        android:id="@+id/btn_view_hide"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="50dp"
        android:layout_toRightOf="@+id/btn_view_show"
        android:text="隐藏ViewStub"
        android:textAllCaps="false"
        android:layout_below="@+id/tv_content"/>

    <ViewStub
        android:id="@+id/vs_test"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout="@layout/item_test_linear_layout"
        android:layout_below="@+id/btn_view_show"
        android:layout_marginTop="10dp" />

</RelativeLayout>

使用ViewStub没那么灵活,限制比较多:
1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。
2. 某些布局属性要加在ViewStub而不是实际的布局上面,才会起作用,比如上面用的android:layout_margin*系列属性,如果加在TextView上面,则不会起作用,需要放在它的ViewStub上面才会起作用。而ViewStub的属性在inflate()后会都传给相应的布局。

ConstraintLayout允许你在不适用任何嵌套的情况下创建大型而又复杂的布局。它与RelativeLayout非常相似,所有的view都依赖于兄弟控件和父控件的相对关系。但是,ConstraintLayout比RelativeLayout更加灵活,目前在AndroidStudio中使用也十分方便,就和以前的拖拉控件十分相似。

一些Lint规则如下:
1. 使用组合控件: 包含了一个ImageView以及一个TextView控件的LinearLayout如果能够作为一个组合控件将会被更有效的处理。
2. 合并作为根节点的帧布局(Framelayout) :如果一个帧布局时布局文件中的根节点,而且它没有背景图片或者padding等,更有效的方式是使用merge标签替换该Framelayout标签 。
3. 无用的叶子节点:通常来说如果一个布局控件没有子视图或者背景图片,那么该布局控件时可以被移除(由于它处于 invisible状态)。
4. 无用的父节点 :如果一个父视图即有子视图,但没有兄弟视图节点,该视图不是ScrollView控件或者根节点,并且它没有背景图片,也是可以被移除的,移除之后,该父视图的所有子视图都直接迁移至之前父视图的布局层次。同样能够使解析布局以及布局层次更有效。
5. 过深的布局层次:内嵌过多的布局总是低效率地。考虑使用一些扁平的布局控件,例如 RelativeLayout、GridLayout ,来改善布局过程。默认最大的布局深度为10 。

Android性能优化-布局优化 在上一篇博客中,我和大家一起探讨了在Android中对SQLite数据库的操作优化细节。还没有看的点击这里:Android性能优化-SQLite数据库 今天,我们继续Android性能优化系列 - 布局优化。在Android中,UI布局作为展示性的标志,显示的速度直接体现了一个App对于客户直观的影响。一个好的App,在布局和UI上肯定有比较好的性能优化,所以布局优化成为了Android性能优化 阅读详情

相关推荐

2.数字芯片时序正确的前提—Max-transition

芯片物理设计中最基本的Max-transition检查

weixin_43868998的博客 5418

Android性能优化:布局优化

本文详细阐述了Android性能优化中布局优化的各个方面。通过减少布局层级、优化布局渲染、布局复用与缓存等方法,可以有效提升应用的性能和用户体验。布局优化是Android性能优化的重要组成部分,开发者应当重视布局优化,以提高应用的整体性能。在未来的研究中,可以进一步探讨布局优化与其它性能优化技术的结合,如内存优化、网络优化等,以实现更全面的性能提升。同时,开发者也应不断学习新的技术和工具,以应对日益增长的性能优化需求。

2501_92489105的博客 393

硬件测试入门--环路响应(Bode)测试

环路分析的一个重要作用就是分析开关电源的稳定性。扫频测试原理主要是给开关电源电路注入一个频率变化的正弦信号,测量开关电源在频域上的特性,通过分析穿越频率、增益裕度和相位裕度来判断环路是否稳定,可以为电子工程师设计稳定的控制电路提供直观的数据。开关电源的稳定性关系到整个应用系统的可靠性,利用伯德图可以看出在不同频率下系统增益的大小和相位。通过伯德图来对开关电源的环路稳定性进行判断和分析已经成为评估开关电源可靠性必不可少的方法。

songninging的博客 1万+

android中加载复杂布局慢,Android性能优化——布局优化篇

写在开头Android设备作为一种移动设备,在内存和CPU的性能让都受到了一定的限制,无法做到像PC端那样具有超大内存和高性能的CPU。如果不加节制的使用内存和CPU资源,通常会导致如下情况:过多的使用内存会导致内存溢出,即OOM过多的使用CPU资源,一般是指做大量的耗时任务,会导致手机变得卡顿,甚至出现程序无法响应的情况,即ANR由此可见,Android开发中性能优化,对每一个开发者至关重要。布...

weixin_42571476的博客 1015

【sap2000】部分模型通过.s2k文件合并模型generating a global model through partial models by .s2k text file

现在需要通过选项File → Import → SAP2000 .s2k Text File → Add to existing model(如果使用其中一个部分模型作为基础)或New model(如果使用新文件)添加部分模型,并使用以下导入选项。模型A(阶段1/5) Model A (Phase 1/5)模型B(阶段2/5) Model B (Phase 2/5)模型C(阶段3/5) Model C (Phase 3/5)模型E(阶段5/5) Model E (Phase 5/5)

hmywillstronger的博客 1748

AI虚拟人物 数字人直播,不用出镜,不用露脸的直播方式(附教程 软件)

我们先来看一组数据,这是我通过蝉妈妈查到的某位虚拟主播的一个带货数据,粉丝还不到 3000 人,每次直播 1 到 4 个小时,30天的总销量达到了1200单,15天,总销售额 2 万,可能相对来说客单价还是比较低,最关键的是才直播了 6 场,如果说他能够一个月直播 20 天,每天花 4个小时去直播,当个副业来做,就可以达到最起码月入 3 万的一个收入水平,我个人觉得是非常的不错的。大家把商品图片放在背景,只要场景设置的不错,场景和产品的关联度高,直播的时候挂上购买链接也会有一定的成交。

. 7万+

Android性能优化 - 卡顿和布局优化

下图,普通的APP都基本能达到60fps,相机就不是了,相机拍照稳定在30fps,而自拍时,开启美颜,降到24fps了,看来相机加AI美颜是比较吃性能的。小知识,电影或者是网上看的视频一般是24帧/秒的速度播放的,即可以省性能,效果也不错,索尼A7M3相机可以录制120帧的慢动作,可以做4倍或者5倍升格。

2501_90359193的博客 908

Python3.8下MvCameraControl.dll加载失败?3种方法彻底解决FileNotFoundError

本文针对Python3.8及以上版本在Windows平台调用MvCameraControl.dll时出现的FileNotFoundError问题,深入剖析了其根源在于Python 3.8引入的DLL加载安全机制变更。文章提供了三种核心解决方案:显式指定DLL完整路径、使用os.add_dll_directory()添加可信目录,以及利用ctypes的winmode参数进行精细控制,并给出了工程化封装建议,帮助开发者彻底解决此兼容性问题。

weixin_29093017的博客 189

Android 性能优化 一 布局优化工具Hierarchy Viewer的使用

网上已经有很多关于Hierarchy Viewer如何使用的文章,这里就不一步步的演示具体怎样使用了,ddna兄的《【Android工具】被忽略的UI检视利器:Hierarchy Viewer》与张兴业的《Android UI 优化——使用HierarchyViewer工具》都写的很棒。     Hierarchy Viewer有两个用途,一个是用于分析当前页面视图层级,再者也能分析

Android 7688

苏宁易购手机行情比价系统:构建一个完整的Python爬虫实战指南

在当今数字化时代,智能手机已成为人们生活中不可或缺的一部分。随着各大手机品牌每年推出多款新品,消费者面临着越来越多的选择。然而,不同电商平台、不同时间段的价格波动使得消费者很难把握最佳购买时机。苏宁易购作为国内领先的电商平台之一,拥有丰富的手机商品信息和价格数据。本文将带领读者构建一个完整的苏宁易购手机行情比价系统,帮助消费者实时掌握手机价格动态。

2201_76125261的博客 207

【二】MADDPG多智能体算法实现(parl)【追逐游戏复现】

论文全称:Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments 论文原文:https://download.youkuaiyun.com/download/sinat_39620217/16203960 论文翻译:https://blog.youkuaiyun.com/qiusuoxiaozi/article/details/79066612 ...

丨汀、的博客 2万+

安卓应用性能优化的深度探索:从内存管理到布局优化

内存泄漏是指应用中已经不再使用的对象,由于某些原因仍然被其他对象持有引用,导致这些对象无法被垃圾回收器回收,从而占用内存空间。随着内存泄漏的积累,应用的可用内存逐渐减少,最终可能导致应用崩溃或性能严重下降。例如,一个 Activity 持有一个静态变量的引用,而该静态变量的生命周期比 Activity 长,当 Activity 销毁时,由于静态变量仍然引用着 Activity 中的对象,这些对象无法被回收,就造成了内存泄漏。在自定义 View 的开发过程中,应尽量简化绘制逻辑。

数字魔方操控师的博客 1826

QGis二次开发 —— 1、win10/win11搭建Vs2017-QGis3.40.12环境(附Vs2017环境效果,附全部问题解决方法)(附:Qt助手加入QGis接口说明文档)

QGis二次开发 —— 1、Windows10搭建Vs2017-QGis环境(附Vs2017环境效果)(附:Qt助手加入QGisA接口说明文档)

1362

安卓性能优化之布局优化

从布局的性能、布局层级、布局复用性、测量和绘制时间方向讨论。* 选择耗费性能少的布局耗费性能低的布局有FrameLayout、LinearLayout高的有RelativeLayout;布局过程消耗更多的CPU资源和时间嵌套消耗的性能 &gt; 单个布局本身的性能* 减少布局的嵌套布局层级越少绘制的工作量越少,绘制速度越快,可以选择merge标签,减少布局层级。&lt;merge&gt;作为布局的...

菜鸟闯天下的专栏 1159

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android性能优化整理——布局、内存、网络优化等

Android性能优化 由于手机硬件的限制,内存和CPU都无法像pc一样具有超大的内存,Android手机上,过多的使用内存,会容易导致oom,过多的使用CPU资源,会导致手机卡顿,甚至导致anr。主要是从一下几部分进行优化: 布局优化,绘制优化,内存泄漏优化,响应速度优化,listview优化,bitmap优化,线程优化 布局优化 工具 hierarchyviewer,解决方式: 1、删除无用的空间和层级。 2、选择性能较低的viewgroup,如Relativelayout,如果可以选择Re

QLHepburn的博客 352

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【安卓开发系列 -- APP】APP 性能优化 -- 布局优化

【安卓开发系列 -- APP】APP 性能优化 -- 布局优化 【1】Android 绘制原理 渲染操作通常依赖 CPU 与 GPU,CPU 负责包括 Measure,Layout,Record,Execute 的计算操作,GPU 负责 Rasterization(栅格化)操作; VSYNC 信号 Android 系统每隔 16ms 发出 VSYNC 信号,触发对 UI 的渲染操作;Refresh Rate 表示屏幕在一秒内刷新屏幕的次数,取决于硬件的固定参数;Frame Rate 表示 GPU

CopperSun 技术博客 458

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android性能优化篇(一)——布局优化

                                                 Android性能优化篇 题记: 不知道别人是怎么学习的,我总是觉得我学习的效率很低,昨天发生了不愉快的事情后,我痛定思痛,反思了一下自己,还是总结不够,也是工作中接触的东西太少的缘故,但是缺乏思考和总结,是我自己的问题,怪不了别人,也不怨天尤人。这段时间我把自己叫做废物,什么时候觉醒了,什么时候...

大喵爱吃鱼的博客 3165

布局性能优化:安卓开发者不可错过的性能优化技巧_手机厂商的布局加载优化(2)

1.减少布局层次布局层次越深,绘制所需的时间就越长,因此应该尽可能减少布局层次。可以通过使用 ConstraintLayout 或者自定义 View 来减少布局层次。2.使用合适的布局容器应该选择最适合当前布局需求的布局容器,避免使用过于复杂的布局容器,比如 LinearLayout 嵌套多层、RelativeLayout 的多重嵌套等。3.使用 ViewStub 来延迟加载视图如果布局中包含复杂的视图,可以考虑使用 ViewStub 来延迟加载这些视图,以减少布局的加载时间。

2401_83739821的博客 1055

布局性能优化:安卓开发者不可错过的性能优化技巧

1.减少布局层次布局层次越深,绘制所需的时间就越长,因此应该尽可能减少布局层次。可以通过使用 ConstraintLayout 或者自定义 View 来减少布局层次。2.使用合适的布局容器应该选择最适合当前布局需求的布局容器,避免使用过于复杂的布局容器,比如 LinearLayout 嵌套多层、RelativeLayout 的多重嵌套等。3.使用 ViewStub 来延迟加载视图如果布局中包含复杂的视图,可以考虑使用 ViewStub 来延迟加载这些视图,以减少布局的加载时间。

maniuT的博客 305

Android 性能优化之布局优化

绘制原理 双缓冲机制 布局加载原理 检测耗时 常规方式 AOP方式 获取控件加载耗时 布局优化 AsyncLayoutInflater方案 Compose方案 减少布局层级和复杂度 避免过度绘制

xiangxiongfly 1551

Android 性能优化(内存优化和布局优化)

布局优化   我们可以通过手机开发者选项中的调试GPU过度来查看布局绘制的复杂情况。 避免overdraw,使用RelativeLayout来替换掉多层LineraLayout嵌套 减少View树的层数,Google Api文档中建议View树的高度不大于10 使用&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;include&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;a

Seven丶Echo的博客 6450

Android性能优化:布局优化技巧

布局优化是Android性能优化的关键环节。通过简化布局层级、使用布局复用技术、利用布局优化工具以及实践有效的布局方法,可以有效提高应用的性能和用户体验。本文旨在提供一些布局优化的技巧和方法,希望对开发者有所帮助。在未来,随着Android技术的不断发展和进步,布局优化方法也将不断更新。开发者需要持续学习和实践,以提高自己的布局优化能力,为用户提供更流畅、更高效的应用体验。

emilio15979289的博客 569
上一篇: HashMap的实现原理
下一篇: Android性能优化之内存优化
A_xun_A
博客等级 码龄17年 10粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值