From 448bb5762abd59bf3ac78b1f8259f6a7243d460a Mon Sep 17 00:00:00 2001 From: David Friedman Date: Mon, 20 Jun 2016 16:13:56 -0700 Subject: [PATCH] Docs: New doc on optimizing view hierarchies for upcoming Performance section Bug: 29514404 This is part of the new Performance section to be launched on DAC soon. Change-Id: Ib590a97f9b7696251edbdecb28305933014483b7 --- .../topic/performance/images/lint-display.png | Bin 0 -> 59952 bytes .../performance/images/lint-inspect-code.png | Bin 0 -> 23018 bytes .../optimizing-view-hierarchies.jd | 388 ++++++++++++++++++ 3 files changed, 388 insertions(+) create mode 100644 docs/html/topic/performance/images/lint-display.png create mode 100644 docs/html/topic/performance/images/lint-inspect-code.png create mode 100644 docs/html/topic/performance/optimizing-view-hierarchies.jd diff --git a/docs/html/topic/performance/images/lint-display.png b/docs/html/topic/performance/images/lint-display.png new file mode 100644 index 0000000000000000000000000000000000000000..e3609381a4c45798df203b8b926cf15920105ebf GIT binary patch literal 59952 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 AegFUf literal 0 HcmV?d00001 diff --git a/docs/html/topic/performance/images/lint-inspect-code.png b/docs/html/topic/performance/images/lint-inspect-code.png new file mode 100644 index 0000000000000000000000000000000000000000..41604a18252138ee68d387bb2bbafe011c2fd06c GIT binary patch literal 23018 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 M6}1$q +

+ + + +

+The way you manage the hierarchy of your {@link android.view.View} objects can +have a substantial impact on your app’s performance. This page describes how to +assess whether your view hierarchy is slowing your app down, and offers some +strategies for addressing issues that may arise. +

+ +

Layout and Measure Performance

+

+The rendering pipeline includes a layout-and-measure +stage, during which the system appropriately positions the relevant items in +your view hierarchy. The measure part of this stage determines the sizes and +boundaries of {@link android.view.View} objects. The layout part determines where on the screen to +position the {@link android.view.View} objects. +

+ +

+Both of these pipeline stages incur some small cost per view or layout that they +process. Most of the time, this cost is minimal and doesn’t noticeably affect +performance. However, it can be greater when an app adds or removes View +objects, such as when a {@link android.support.v7.widget.RecyclerView} +object recycles them or reuses them. The +cost can also be higher if a {@link android.view.View} object needs to consider +resizing to main its constraints: For example, if your app calls +{@link android.widget.TextView#setText(char[], int, int) SetText()} on a +{@link android.view.View} object that wraps text, the +{@link android.view.View} may need to resize. +

+ +

+If cases like these take too long, they can prevent a frame from rendering +within the allowed 16ms, so that frames are dropped, and animation becomes +janky. +

+ +

+Because you cannot move these operations to a worker thread—your app must +process them on the main thread—your best bet is to optimize them so that +they can take as little time as possible. +

+ +

Managing complexity: layouts matter

+ +

+Android Layouts +allow you to nest UI objects in the view hierarchy. This nesting can also impose +a layout cost. When your app processes an object for layout, the app performs +the same process on all children of the layout as well. For a complicated +layout, sometimes a cost only arises the first time the system computes the +layout. For instance, when your app recycles a complex list item in a +{@link android.support.v7.widget.RecyclerView} object, the +system needs to lay out all of the objects. In another example, trivial changes +can propagate up the chain toward the parent +until they reach an object that doesn’t affect the size of the parent. +

+ +

+The most common case in which layout takes an especially long time is when +hierarchies of {@link android.view.View} objects are nested within one another. Each nested layout +object adds cost to the layout stage. The flatter your hierarchy, the less +time that it takes for the layout stage to complete. +

+ +

+If you are using the {@link android.widget.RelativeLayout} class, you may be able to achieve the same +effect, at lower cost, by using nested, unweighted +{@link android.widget.LinearLayout} views instead. Additionally, if your app +targets Android N (API level 24), it is likely that +you can use a special layout editor to create a {@code ConstraintLayout} +object instead of {@link android.widget.RelativeLayout}. Doing so allows you +to avoid many of the issues this section +describes. The {@code ConstraintLayout} +class offers similar layout control, but +with much-improved performance. This class uses its own constraint-solving +system to resolve relationships between views in a very different way from +standard layouts. +

+ +

Double Taxation

+ +

+Typically, the framework executes the layout +or measure stage in a single pass and quite quickly. However, with some more +complicated layout cases, the framework may have to iterate multiple times on +the layout or measure stage before ultimately positioning the elements. Having +to perform more than one layout-and-measure iteration is referred to as +double taxation. +

+ +

+For example, when you use the {@link android.widget.RelativeLayout} container, which allows you to +position {@link android.view.View} objects with respect to the positions of other {@link android.view.View} objects, the +framework performs the following actions: +

+ +
    +
  1. Executes a layout-and-measure pass, during which the framework calculates +each child object’s position and size, based on each child’s request. +
  2. Uses this data, also taking object weights into account, to figure out the +proper position of correlated views. +
  3. Performs a second layout pass to finalize the objects’ positions. +
  4. Goes on to the next stage of the rendering process.
+ +

+The more levels your view hierarchy has, the greater the potential performance +penalty. +

+ +

+Containers other than {@link android.widget.RelativeLayout} may also give rise to double taxation. For +example: +

+ +
    +
  • A {@link android.widget.LinearLayout} view +could result in a double layout-and-measure pass if you make it horizontal. +A double layout-and-measure pass may also occur in a vertical orientation if you +add measureWithLargestChild, +in which case the framework may need to do a second pass to resolve the proper +sizes of objects. +
  • The {@link android.widget.GridLayout} +has a similar issue. While this container also allows relative positioning, it +normally avoids double taxation by pre-processing the positional relationships +among child views. However, if the layout uses weights or fill with the +{@link android.view.Gravity} class, the +benefit of that preprocessing is lost, and the framework may have to perform +multiple passes if it the container were a {@link android.widget.RelativeLayout}.
  • +
+

+Multiple layout-and-measure passes are not, in themselves, a performance burden. +But they can become so if they’re in the wrong spot. You should be wary of +situations where one of the following conditions applies to your container: +

+ +
    +
  • It is a root element in your view hierarchy. +
  • It has a deep view hierarchy beneath it. +
  • It is nested. +
  • There are many instances of it populating the screen, similar to children + in a {@link android.widget.ListView} object.
  • +
+ +

Diagnosing View Hierarchy Issues

+ +

+Layout performance is a complex problem with many facets. There are a couple of +tools that can give you solid indications about where performance bottlenecks +are occurring. A few other tools provide less definitive information, but can +also provide helpful hints. +

+ +

+

Systrace

+

+ +

+One tool that provides excellent data about performance is Systrace, +which is built into Android Studio. The Systrace tool allows you to collect and +inspect timing information across an entire Android device, allowing you to see +specifically where performance bottlenecks arise. For more information about +Systrace, see +Analyze UI Performance with Systrace. +

+ +

Profile GPU rendering

+ +

+The other tool most likely to provide you with concrete information about +performance bottlenecks is the on-device +Profile GPU rendering tool, available on devices powered by Android 6.0 (API +level 23) and later. This tool allows you to see how long the layout-and-measurestage is + taking for each frame +of rendering. This data can help you diagnose runtime performance issues, +and help you determine what, if any layout-and-measure issues you need to +address. +

+ +

+In its graphical representation of the data it captures, Profile +GPU rendering uses the color blue to represent layout time. For more +information about how to use this tool, see Profile +GPU Rendering Walkthrough. +

+ +

Lint

+ +

+AndroidStudio’s Lint tool can +help you gain a sense of inefficiencies in the view hierarchy. To use this tool, +select Analyze > Inspect Code, as shown in Figure 1. +

+ + +

+ Figure 1. Locating Inspect Code in the +Android Studio. +

+ +

+Information about various layout items appears under +Android > Lint > Performance. To see more detail, +you can click on each item to expand it, and see more +information in the pane on the right side of the screen. +Figure 2 shows an example of such a display. +

+ + +

+ Figure 2. Viewing information about specific +issues that the lint tool has identified. +

+ + +

+Clicking on one of these items reveals, in the pane to the right, the problem +associated with that item. +

+ +

+To understand more about specific topics and issues in this area, see the Lint +documentation. +

+ +

Hierarchy Viewer

+ +

+Android Studio’s Hierarchy +Viewer tool provides a visual representation of your app’s view hierarchy. +It is a good way to navigate the hierarchy of your app, providing a clear visual +representation of a particular view’s parent chain, and allowing you to inspect +the layouts that your app constructs. +

+ +

+The views that Hierarchy Viewer presents can also help identify performance +problems arising from double taxation. It can also provide an easy way for you +to identify deep chains of nested layouts, or layout areas with a large amount +of nested children, another potential source of performance costs. In these +scenarios, the layout-and-measure stages can be particularly costly, +resulting in performance issues. +

+ +

+You can also can get a sense of relative time taken by layout-and-measure +operations by clicking the “profile node” button. +

+ +

+For more information about Hierarchy Viewer, see Optimizing +Your UI. +

+ +

Solving View Hierarchy Issues

+ +

+The fundamental concept behind solving performance problems that arise from view +hierarchies is simple in concept, but more difficult in practice. Preventing +view hierarchies from imposing performance penalties encompasses the dual goals +of flattening your view hierarchy and reducing double taxation. This section +discusses some strategies for pursuing these goals. +

+ +

Removing redundant nested layouts

+ +

+Developers often use more nested layouts than necessary. For example, a +{@link android.widget.RelativeLayout} container might contain a single child that is also a +{@link android.widget.RelativeLayout} container. This nesting amounts to redundancy, and adds +unnecessary cost to the view hierarchy. +

+ +

+Lint can often flag this problem for you, reducing debugging time. +

+ +

Adopting Merge/Include

+

+One frequent cause of redundant nested layouts is the +<include> +tag. For example, you may define a re-usable layout as follows: +

+ +
+<LinearLayout>
+    <!-- some stuff here -->
+</LinearLayout>
+</pre>
+
+ +

+And then an include tag to add this item to the parent container: +

+ +
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/app_bg"
+    android:gravity="center_horizontal">
+
+    <include layout="@layout/titlebar"/>
+
+    <TextView android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:text="@string/hello"
+              android:padding="10dp" />
+
+    ...
+
+</LinearLayout>
+
+ +

+The include unnecessarily nests the first layout within the second layout. +

+ +

+The merge +tag can help prevent this issue. For information about this tag, see Re-using +Layouts with <include>. +

+ +

Adopting a cheaper layout

+ +

+You may not be able to adjust your existing layout scheme so that it doesn’t +contain redundant layouts. In certain cases, the only solution may be to flatten +your hierarchy by switching over to an entirely different layout type. +

+ +

+For example, you may find that a {@link android.widget.TableLayout} +provides the same functionality as a more complex layout with many +positional dependencies. In the N release of Android, the +{@code ConstraintLayout} class provides similar functionality to +{@link android.widget.RelativeLayout}, but at a significantly lower cost. +