Deep Layout Hierarchy
ID |
java.android_layout_hierarchy |
Severity |
low |
Remediation Complexity |
trivial |
Remediation Risk |
low |
Remediation Effort |
low |
Resource |
Efficiency |
Language |
Java |
Tags |
android, best-practice, efficiency |
Description
Reports Android layout files whose view nesting depth exceeds a configurable threshold (default 10). Deep view hierarchies slow down the measure and layout passes, causing dropped frames and sluggish UI on lower-end devices.
Rationale
The Android rendering pipeline traverses the view tree twice (measure pass and layout pass) for every frame. Each additional nesting level multiplies the work, and deeply nested layouts can trigger exponential measurement in the worst case (e.g., nested RelativeLayout or LinearLayout with layout_weight). Keeping the hierarchy shallow ensures smooth 60 fps rendering.
<!-- Bad: 11+ levels of nesting -->
<LinearLayout ...>
<FrameLayout ...>
<FrameLayout ...>
<FrameLayout ...>
<FrameLayout ...>
<FrameLayout ...>
<FrameLayout ...>
<FrameLayout ...>
<FrameLayout ...>
<FrameLayout ...>
<FrameLayout ...>
<TextView android:text="Very deep" />
</FrameLayout>
</FrameLayout>
</FrameLayout>
</FrameLayout>
</FrameLayout>
</FrameLayout>
</FrameLayout>
</FrameLayout>
</FrameLayout>
</FrameLayout>
</LinearLayout>
Remediation
Flatten the hierarchy using ConstraintLayout, which can express complex arrangements in a single level, or merge redundant wrapper ViewGroups.
<!-- Good: flat hierarchy with ConstraintLayout -->
<androidx.constraintlayout.widget.ConstraintLayout ...>
<TextView
android:id="@+id/title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:text="Title" />
</androidx.constraintlayout.widget.ConstraintLayout>