레이아웃 계층 구조 최적화

기본 레이아웃 구조를 사용하면 가장 효율적인 레이아웃이 생성된다는 것이 가장 일반적인 오해입니다. 그러나 애플리케이션에 추가하는 위젯과 레이아웃마다 초기화, 레이아웃 및 그림이 필요합니다. 예를 들어 중첩된 LinearLayout 인스턴스를 사용하면 뷰 계층 구조가 지나치게 깊어질 수 있습니다. 또한 layout_weight 매개변수를 사용하는 여러 LinearLayout 인스턴스를 중첩하면 각 하위 요소를 두 번 측정해야 하므로 특히 리소스를 많이 사용할 수 있습니다. 따라서 최적화는 ListView 또는 GridView에서 사용할 때와 같이 레이아웃을 반복적으로 확장할 때 특히 중요합니다.

이 과정에서는 Hierarchy Viewer린트를 사용하여 레이아웃을 조사하고 최적화하는 방법을 알아봅니다.

레이아웃 검사

Android SDK 도구에는 애플리케이션을 실행하는 동안 레이아웃을 분석할 수 있는 Hierarchy Viewer라는 도구가 포함되어 있습니다. 이 도구를 사용하면 레이아웃 성능의 병목현상을 발견할 수 있습니다.

계층 뷰어는 연결된 기기나 에뮬레이터에서 실행 중인 프로세스를 선택한 다음 레이아웃 트리를 표시하도록 허용하는 방식으로 작동합니다. 각 블록의 트래픽 표시등은 측정, 레이아웃 및 그리기 성능을 나타내며, 잠재적 문제점을 파악하는 데 유용합니다.

예를 들어 그림 1에서는 ListView의 항목으로 사용되는 레이아웃을 보여줍니다. 이 레이아웃에서는 왼쪽에 작은 비트맵 이미지를 표시하고 오른쪽에 두 개의 누적된 텍스트 항목을 표시합니다. 성능 이점이 배가 되므로 이 레이아웃처럼 여러 번 확장될 레이아웃은 최적화하는 것이 특히 중요합니다.

그림 1. ListView에 있는 항목의 개념적 레이아웃

Hierarchy Viewer에서는 사용 가능한 기기와 실행 중인 구성요소 목록을 보여줍니다. Windows 탭에서 구성요소를 선택하고 Hierarchy View를 클릭하여 선택한 구성요소의 레이아웃 계층 구조를 봅니다. 예를 들어 그림 2에서는 그림 1에 설명된 목록 항목의 레이아웃을 보여줍니다.

그림 2. 그림 1에 있는 레이아웃의 레이아웃 계층 구조, 중첩된 LinearLayout 인스턴스 사용

레이아웃 수정

위 레이아웃 성능이 중첩된 LinearLayout으로 저하되므로 레이아웃을 평평하게 하여(좁고 깊지 않고 얕고 넓게 만듬) 성능을 개선할 수 있습니다. 루트 노드로 RelativeLayout을 사용하면 이러한 레이아웃을 만들 수 있습니다. 따라서 RelativeLayout을 사용하도록 이 디자인을 변환하면 레이아웃이 2단계 계층 구조가 되는 것을 확인할 수 있습니다. 새 레이아웃은 다음과 같이 검사합니다.

그림 4. 그림 1에 있는 레이아웃의 레이아웃 계층 구조, RelativeLayout 사용

목록에 있는 항목마다 이 레이아웃을 사용하므로 이점은 작아 보여도 수배가 됩니다.

차이점은 대부분 LinearLayout 디자인에서 layout_weight를 사용하기 때문에 발생합니다. 이로 인해 측정 속도가 느려질 수 있습니다. 이것은 각 레이아웃을 적절하게 사용하는 방법의 한 예에 지나지 않으므로 레이아웃 가중치를 사용해야 하는지는 신중하게 고려해야 합니다.

복잡한 레이아웃에서는 시스템에서 동일한 UI 요소를 두 번 이상 측정하느라 자원을 낭비할 수 있습니다. 이 현상은 이중 과세라고 합니다. 이중 과세와 이를 방지하는 방법에 관한 자세한 내용은 성능 및 뷰 계층 구조를 참조하세요.

린트 사용

레이아웃 파일에서 언제나 린트 도구를 실행하여 가능한 뷰 계층 구조 최적화를 검색하는 것이 좋습니다. 린트는 Layoutopt 도구를 대체하며 훨씬 향상된 기능이 있습니다. 린트 규칙의 예는 다음과 같습니다.

  • 복합 드로어블 사용 - ImageViewTextView가 포함된 LinearLayout은 복합 드로어블로 더 효율적으로 처리할 수 있습니다.
  • 루트 프레임 병합 - FrameLayout이 레이아웃의 루트이고 백그라운드나 패딩 등을 제공하지 않는다면 좀 더 효율적인 병합 태그로 바꿀 수 있습니다.
  • 쓸모없는 리프 - 하위 요소나 백그라운드가 없는 레이아웃은 더 평평하고 효율적인 레이아웃 계층 구조를 위해 종종 삭제될 수 있습니다(표시되지 않기 때문).
  • 쓸모없는 상위 요소 - 동위 요소가 없고 ScrollView 또는 루트 레이아웃이 아니며 백그라운드도 없는 하위 요소가 있는 레이아웃은 더 평평하고 효율적인 레이아웃 계층 구조를 위해 삭제하고 하위 요소를 상위 요소로 직접 이동할 수 있습니다.
  • 깊은 레이아웃 - 너무 많이 중첩된 레이아웃은 성능에 좋지 않습니다. RelativeLayout 또는 GridLayout과 같이 더 평평한 레이아웃을 사용하여 성능을 개선해보세요. 기본 최대 깊이는 10입니다.

린트의 또 다른 이점은 Android Studio로 통합된다는 것입니다. 프로그램을 컴파일링할 때마다 린트가 자동으로 실행됩니다. Android Studio에서는 특정 빌드 변형이나 모든 빌드 변형을 대상으로 린트 검사도 실행할 수 있습니다.

검사 프로필을 관리하고 File>Settings>Project Settings 옵션을 사용하여 Android Studio에서 검사를 구성할 수 있습니다. Inspection Configuration 페이지에 지원되는 검사가 표시됩니다.

그림 5. Inspection Configuration

린트에는 문제를 자동으로 수정하고 다른 문제에 관해 제안하며 검토를 위해 문제의 코드로 바로 이동하는 기능이 있습니다.

이 과정과 관련된 추가 정보는 XML 레이아웃레이아웃 리소스를 참조하세요.