기본 레이아웃 구조를 사용하면 가장 효율적인 레이아웃이 생성된다는 것이 가장 일반적인 오해입니다. 그러나 앱에 추가하는 위젯과 레이아웃마다 초기화, 레이아웃 및 그림이 필요합니다. 예를 들어 중첩된 LinearLayout 인스턴스를 사용하면 뷰 계층 구조가 지나치게 깊어질 수 있습니다. 또한 layout_weight 매개변수를 사용하는 여러 LinearLayout 인스턴스를 중첩하면 각 하위 요소를 두 번 측정해야 하므로 특히 리소스를 많이 사용할 수 있습니다.
따라서 최적화는 RecyclerView에서 사용할 때와 같이 레이아웃을 반복적으로 확장할 때 특히 중요합니다.
이 문서에서는 Layout Inspector 및 린트를 사용하여 레이아웃을 조사하고 최적화하는 방법을 보여줍니다.
레이아웃 검사
Android SDK 도구에는 앱이 실행되는 동안 레이아웃을 분석할 수 있는 Layout Inspector 도구가 포함되어 있습니다. 이 도구를 사용하면 레이아웃 성능의 비효율성을 발견할 수 있습니다.
Layout Inspector를 사용하면 연결된 기기나 에뮬레이터에서 실행 중인 프로세스를 선택한 다음 레이아웃 트리를 표시할 수 있습니다. 각 블록의 트래픽 표시등은 측정, 레이아웃 및 그리기 성능을 나타내며, 잠재적 문제점을 파악하는 데 유용합니다.
예를 들어 그림 1에서는 RecyclerView의 항목으로 사용되는 레이아웃을 보여줍니다. 이 레이아웃에서는 왼쪽에 작은 비트맵 이미지를 표시하고 오른쪽에 두 개의 누적된 텍스트 항목을 표시합니다. 성능 이점이 배가 되므로 이 레이아웃처럼 여러 번 확장될 레이아웃은 최적화하는 것이 특히 중요합니다.
RecyclerView.
Layout Inspector에서는 사용 가능한 기기와 실행 중인 구성요소 목록을 보여줍니다. Windows 탭에서 구성요소를 선택하고 Layout Inspector 를 클릭하여 선택한 구성요소의 레이아웃 계층 구조를 봅니다. 예를 들어 그림 2에서는 그림 1에 설명된 목록 항목의 레이아웃을 보여줍니다.
LinearLayout 인스턴스 사용
레이아웃 수정
위의 레이아웃 성능이 중첩된 LinearLayout으로 저하되므로 레이아웃을 평평하게 하여(좁고 깊지 않고 얕고 넓게 만듬) 성능을 개선할 수 있습니다. 루트 노드로 ConstraintLayout을 사용하면 이러한 레이아웃을 만들 수 있습니다. ConstraintLayout을 사용하도록 이 디자인을 변환하면 레이아웃이 2단계 계층 구조가 됩니다.
<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>
새 레이아웃은 다음과 같이 검사합니다.
목록에 있는 항목마다 이 레이아웃을 사용하므로 이점은 배가됩니다.
차이점은 대부분 LinearLayout 디자인에서 layout_weight를 사용하기 때문에 발생합니다. 이로 인해 측정이 느려질 수 있습니다. 이것은 각 레이아웃을 적절하게 사용하는 방법의 한 예에 지나지 않으므로 레이아웃 가중치를 사용해야 하는지는 신중하게 고려해야 합니다.
복잡한 레이아웃에서는 시스템에서 동일한 UI 요소를 두 번 이상 측정하느라 자원을 낭비할 수 있습니다. 이 현상은 이중 과세 라고 합니다. 이중 과세와 이를 방지하는 방법에 관한 자세한 내용은 성능 및 뷰 계층 구조를 참고하세요.
린트 사용
레이아웃 파일에서 린트 도구 를 실행하여 가능한 뷰 계층 구조 최적화를 검색하는 것이 좋습니다. 린트는 layoutopt 도구를 대체하며 훨씬 향상된 기능이 있습니다. 다음은 린트 규칙의 예입니다.
-
복합 드로어블을 사용합니다.
LinearLayout은ImageView과TextView가 포함된 복합 드로어블로 더 효율적으로 처리할 수 있습니다. -
루트 프레임을 병합합니다. 레이아웃의 루트가
FrameLayout백그라운드나 패딩을 제공하지 않는 경우 약간 더 효율적인 병합 태그로 바꿀 수 있습니다. - 쓸모없는 리프를 삭제합니다. 하위 요소나 백그라운드가 없는 레이아웃은 더 평평하고 효율적인 레이아웃 계층 구조를 위해 종종 삭제될 수 있습니다(표시되지 않기 때문).
-
쓸모없는 상위 요소를 삭제합니다. 동위 요소가 없고
ScrollView또는 루트 레이아웃이 아니며 백그라운드도 없는 하위 요소가 있는 레이아웃은 삭제할 수 있습니다. 또한 더 평평하고 효율적인 레이아웃 계층 구조를 위해 하위 뷰를 상위 요소로 직접 이동할 수 있습니다. -
깊은 레이아웃을 피합니다. 너무 많이 중첩된 레이아웃은
성능에 좋지 않습니다. 더 평평한 레이아웃을 사용하여 성능을 개선해보세요.
ConstraintLayout, 린트 검사의 기본 최대 깊이는 10입니다.
린트 도구의 또 다른 이점은 Android 스튜디오로 통합된다는 것입니다. 프로그램을 컴파일링할 때마다 린트가 자동으로 실행됩니다. Android 스튜디오에서는 특정 빌드 변형이나 모든 빌드 변형을 대상으로 린트 검사도 실행할 수 있습니다.
검사 프로필을 관리하고 File > Settings > Project Settings 옵션을 사용하여 Android 스튜디오에서 검사를 구성할 수 있습니다. Inspection Configuration 페이지에 지원되는 검사가 표시됩니다.
린트에는 문제를 자동으로 수정하고 다른 문제에 관해 제안하며 검토를 위해 문제의 코드로 바로 이동하는 기능이 있습니다.
자세한 내용은 레이아웃 및 레이아웃 리소스를 참고하세요.