问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Android布局优化:使用布局检查器和Lint工具提升应用性能

创作时间:
作者:
@小白创作中心

Android布局优化:使用布局检查器和Lint工具提升应用性能

引用
1
来源
1.
https://android-docs.cn/develop/ui/views/layout/improving-layouts/optimizing-layouts?hl=zh-cn

在Android应用开发中,布局优化是一个重要的环节。本文将介绍如何使用布局检查器和lint工具来检查和优化布局,以提高应用的性能。

普遍存在一种误解,即使用基本布局结构会导致最有效的布局。但是,您添加到应用中的每个小部件和布局都需要初始化、布局和绘制。例如,使用嵌套的
LinearLayout
实例会导致视图层次结构过深。此外,嵌套几个使用
layout_weight
参数的
LinearLayout
实例可能尤其昂贵,因为每个子项都需要测量两次。当布局反复膨胀时,这一点尤其重要,例如在
RecyclerView
中使用时。

检查您的布局

Android SDK 工具包含布局检查器工具,该工具允许您在应用运行时分析您的布局。使用此工具可以帮助您发现布局性能中的低效之处。

布局检查器允许您选择连接的设备或模拟器上的正在运行的进程,然后显示布局树。每个块上的交通灯代表其测量、布局和绘制性能,帮助您识别潜在的问题。

例如,图 1 显示了一个用作
RecyclerView
中项目的布局。此布局在左侧显示了一个小的位图图像,在右侧显示了两个堆叠的文本项。像这样多次膨胀的布局尤其需要优化,因为性能优势会成倍增加。

图 1.
RecyclerView
中项目的概念布局。

布局检查器显示可用设备及其正在运行的组件的列表。从窗口选项卡中选择您的组件,然后单击布局检查器以查看所选组件的布局层次结构。例如,图 2 显示了图 1 所示列表项的布局。

图 2.使用嵌套的
LinearLayout
实例,图 1 中布局的布局层次结构。

修改您的布局

由于前面的布局性能由于嵌套的
LinearLayout
而变慢,因此您可以通过展平布局来提高性能——换句话说,使布局变浅变宽,而不是变窄变深。

ConstraintLayout
作为根节点允许此类布局。当您将此设计转换为使用
ConstraintLayout
时,布局将成为两级层次结构

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="52dp"
    android:background="#e4e6e4"
    android:padding="4dp">
    <ImageView
        android:id="@+id/image"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:background="#5c5c74"
        android:contentDescription="An example box"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <TextView
        android:id="@+id/title"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="4dp"
        android:background="#745c74"
        app:layout_constraintBottom_toTopOf="@+id/subtitle"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/image"
        app:layout_constraintTop_toTopOf="parent" />
    <TextView
        android:id="@+id/subtitle"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#7e8d6e"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="@id/title"
        app:layout_constraintTop_toBottomOf="@+id/title" />
</androidx.constraintlayout.widget.ConstraintLayout>

新布局的检查如下所示

图 3.布局检查器 3D 模式。

这样做的好处是成倍增加的,因为此布局用于列表中的每个项目。

大多数差异是由于在
LinearLayout
设计中使用了
layout_weight
,这可能会减慢测量速度。这只是一个例子,说明每个布局都有其适当的用途。仔细考虑是否需要使用布局权重。

在一些复杂的布局中,系统可能会浪费精力多次测量相同的 UI 元素。这种现象称为双重征税。有关双重征税以及如何防止双重征税的更多信息,请参阅性能和视图层次结构。

使用 lint

最佳实践是在您的布局文件上运行lint工具以搜索可能的视图层次结构优化。Lint 替换了 layoutopt 工具并具有更强大的功能。以下是 lint规则的示例

  • 使用复合可绘制对象。您可以更有效地处理包含
    ImageView

    TextView

    LinearLayout
    作为复合可绘制对象。
  • 合并根框架。如果布局的根是
    FrameLayout
    且不提供背景或填充,则可以使用合并标记替换它,这稍微有效率一些。
  • 删除无用的叶子。您可以删除没有子项或没有背景的布局(因为它不可见),以获得更平坦、更高效的布局层次结构。
  • 删除无用的父项。您可以删除具有一个子项且没有同级元素、不是
    ScrollView
    或根布局且没有背景的布局。您还可以将子视图直接移动到父视图中,以获得更平坦、更高效的布局层次结构。
  • 避免深层布局。嵌套过多的布局不利于性能。考虑使用更平坦的布局,例如
    ConstraintLayout
    ,以提高性能。lint 检查的默认最大深度为 10。

lint 工具的另一个好处是它与 Android Studio 集成。每当您编译程序时,lint 都会自动运行。使用 Android Studio,您还可以为特定构建变体或所有构建变体运行 lint 检查。

您还可以使用文件 > 设置 > 项目设置选项在 Android Studio 中管理检查配置文件和配置检查。将出现“检查配置”页面,其中包含受支持的检查

图 4.检查配置页面。

lint 可以自动修复某些问题,为其他问题提供建议,并直接跳转到有问题的代码以供审查。

有关更多信息,请参阅布局和布局资源。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号