이제 두 번째 Android 11 개발자 프리뷰를 사용할 수 있습니다. 테스트해 보고 의견을 공유하세요.

레이아웃 계층구조 최적화

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

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

레이아웃 검사

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

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

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

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

계층 뷰어에서는 사용 가능한 기기와 실행 중인 구성요소 목록을 보여줍니다. Windows 탭에서 구성요소를 선택하고 계층 보기를 클릭하여 선택한 구성요소의 레이아웃 계층을 봅니다. 예를 들어 그림 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 레이아웃레이아웃 리소스를 참조하세요.