우수사례

Reddit에서 R8 최적화 도구를 사용하여 성능을 크게 개선한 방법

4분 읽기
Ben Weiss
개발자 관계팀 엔지니어

오늘날의 모바일 애플리케이션 세계에서 원활한 사용자 환경은 단순한 기능이 아니라 필수사항입니다. 로드 시간이 느리고, 응답하지 않는 인터페이스, 불안정성은 사용자 참여 및 유지에 상당한 장벽이 될 수 있습니다. Reddit의 엔지니어링팀은 Android 개발자 관계팀과 협력하는 동안 앱 성능 점수를 사용하여 앱을 평가했습니다. 성능을 평가한 후 상당한 개선 가능성을 확인하고 Android 앱 최적화 도구인 R8의 모든 기능을 사용 설정하기로 했습니다. 이 집중적인 이니셔티브를 통해 시작 시간이 크게 개선되고, 느리거나 정지된 프레임과 ANR이 줄어들었으며, 전반적으로 Play 스토어 평점이 높아졌습니다. 이 우수사례에서는 Reddit이 이러한 놀라운 결과를 달성한 방법을 분석합니다.

R8 최적화 도구가 Reddit에 도움이 된 방법

R8 최적화 도구는 Android의 성능 최적화를 위한 기본 도구입니다. 앱 성능을 개선하기 위해 다양한 단계를 거칩니다.가장 영향력 있는 단계를 간단히 살펴보겠습니다.

  • 트리 셰이킹 은 앱 크기를 줄이는 가장 중요한 단계입니다. 여기에서 앱 종속 항목과 앱 자체의 사용하지 않는 코드가 삭제됩니다.
  • 메서드 인라이닝 은 메서드 호출을 실제 코드로 대체하여 앱의 성능을 높입니다.
  • 클래스 병합 및 기타 전략이 적용되어 코드를 더 간결하게 만듭니다. 이 시점에서는 더 이상 소스 코드의 사람이 읽을 수 있는 코드가 아니라 컴파일된 코드가 빠르게 작동하도록 하는 것이 중요합니다. 따라서 인터페이스나 클래스 계층 구조와 같은 추상화는 여기서 중요하지 않으며 삭제됩니다.
  • 식별자 최소화 는 클래스, 필드, 메서드의 이름을 더 짧고 의미 없는 이름으로 변경합니다. 따라서 MyDataModel 대신 a라는 클래스가 생성될 수 있습니다.
  • 리소스 축소 는 xml 파일 및 드로어블과 같은 사용하지 않는 리소스를 삭제하여 앱 크기를 더욱 줄입니다.
image.png

R8 최적화의 주요 단계

하드 데이터에서 사용자 만족도까지: 프로덕션에서 성공 확인

Reddit은 새 버전의 앱이 사용자에게 출시된 직후 성능 결과가 개선되었습니다.Reddit은 Android VitalsCrashlytics를 사용하여 실제 사용자가 있는 실제 기기에서 실적 측정항목을 캡처하여 새 출시 버전을 이전 버전과 비교할 수 있었습니다.

image.png

R8이 Reddit의 앱 성능을 개선한 방법

팀은 콜드 스타트가 40% 더 빨라지고, '애플리케이션 응답 없음'(ANR) 오류가 30% 감소하고, 프레임 렌더링이 25% 개선되고, 앱 크기가 14% 감소하는 것을 확인했습니다.

이러한 개선사항은 사용자 만족도에 매우 중요합니다. 시작 시간이 빠르면 대기 시간이 줄어들고 콘텐츠에 더 빠르게 액세스할 수 있습니다. ANR이 줄어들면 앱이 더 안정적이고 신뢰할 수 있게 되어 사용자 불만이 줄어듭니다. 더 원활한 프레임 렌더링은 UI 버벅거림을 없애 스크롤과 애니메이션을 유연하고 반응성이 좋게 만듭니다. 이러한 긍정적인 기술적 영향은 사용자 감정에서도 분명히 확인할 수 있었습니다.

최적화 성공의 사용자 만족도 지표는 Google Play 스토어에서 직접 확인할 수 있었습니다. R8 최적화 버전이 출시된 후 팀은 사용자 의견과 참여도가 극적으로 긍정적으로 변화하는 것을 확인했습니다.

image.png

Drew Heavner: 'R8의 모든 기능을 2주 이내에 사용 설정'

가장 인상적인 점은 이러한 성과가 집중적인 노력으로 달성되었다는 것입니다. 이 이니셔티브를 진행한 Reddit의 스태프 소프트웨어 엔지니어인 Drew Heavner는 R8의 모든 기능을 사용 설정하기 위한 변경사항을 구현하는 데 2주 미만 이 걸렸다고 말했습니다.

이점 확인: 매크로벤치마크를 통한 심층 분석

Reddit의 엔지니어링팀과 Google의 Android 개발자 관계팀은 상당한 실제 개선사항을 확인한 후 이점을 과학적으로 확인하고 추가 최적화를 실험하기 위해 상세한 벤치마크를 실시했습니다. 이 분석을 위해 Reddit 엔지니어링은 최적화가 없는 버전과 R8 및 두 가지 기본 성능 최적화 도구인 기준 프로필시작 프로필을 적용한 버전의 앱을 제공했습니다.

기준 프로필은 JIT (Just in Time) 컴파일 단계를 사용자 기기에서 개발자 머신으로 효과적으로 이동합니다. 생성된 AOT (Ahead Of Time) 컴파일 코드는 시작 시간과 렌더링 문제를 모두 줄이는 것으로 입증되었습니다.

앱이 패키징되면 d8 dexer는 클래스와 메서드를 가져와 앱의 classes.dex 파일을 구성합니다. 사용자가 앱을 열면 앱이 시작될 때까지 이러한 dex 파일이 차례로 로드됩니다. 시작 프로필 을 제공하면 d8에 첫 번째 classes.dex 파일에 패킹할 클래스와 메서드를 알릴 수 있습니다. 이 구조를 사용하면 앱이 더 적은 파일을 로드할 수 있으므로 시작 속도가 개선됩니다.

Jetpack Macrobenchmark 는 이 단계의 핵심 도구로, 제어된 환경에서 사용자 상호작용을 정확하게 측정할 수 있습니다. 일반적인 사용자 여정을 시뮬레이션하기 위해 UIAutomator API를 사용하여 앱을 열고 세 번 아래로 스크롤한 다음 다시 위로 스크롤하는 테스트를 만들었습니다.

결국 벤치마크를 작성하는 데 필요한 것은 다음과 같습니다.

uiAutomator {

  startApp(REDDIT)

  repeat(3) {

    onView { isScrollable }.fling(Direction.DOWN) }

  repeat(3) {

    onView {isScrollable }.fling(Direction.UP)

  }

}

벤치마크 데이터는 현장 관찰을 확인하고 더 심층적인 통계를 제공했습니다. 완전히 최적화된 앱이 55% 더 빠르게 시작되었고 사용자는 18% 더 빨리 탐색을 시작할 수 있었습니다. 최적화된 앱은 JIT (Just in Time) 컴파일 발생이 3분의 2 감소 하고 JIT 컴파일 시간이 3분의 1 감소 했습니다. 프레임 렌더링이 개선되어 벤치마크된 사용자 여정에서 19% 더 많은 프레임 이 렌더링되었습니다. 마지막으로 앱 크기가 3분의 1 이상 줄었습니다.

image.png

Reddit의 전반적인 성능 개선사항

다음과 같은 맞춤 Macrobenchmark 트레이스 섹션 측정항목으로 JIT 컴파일 시간을 측정할 수 있습니다.

val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")

대전환의 발판이 되는 기술: R8

전체 모드에서 R8을 사용 설정하려면 출시 빌드 유형에서 minifyEnabledshrinkResourcestrue로 설정하여 app/build.gradle.kts 파일을 구성합니다.

android {

    ...

    buildTypes {

        release {

            isMinifyEnabled = true

            isShrinkResources = true

            proguardFiles(

                getDefaultProguardFile("proguard-android-optimize.txt"),

                "keep-rules.pro",

            )

        }

    }

}

성능 최적화로 인해 원치 않는 동작이 발생할 수 있으므로 이 단계는 전체 엔드 투 엔드 테스트를 따라야 합니다. 사용자가 발견하기 전에 이러한 동작을 포착하는 것이 좋습니다.

이 문서의 앞부분에서 설명한 것처럼 R8은 성능 혜택을 극대화하기 위해 광범위한 최적화를 실행합니다. R8은 클래스, 필드, 메서드의 이름 바꾸기, 이동, 삭제를 비롯하여 코드를 크게 수정합니다. 이러한 수정으로 인해 오류가 발생하는 경우 유지 규칙에서 선언하여 R8이 수정하지 않아야 하는 코드 부분을 지정해야 합니다.

앱에서 Reddit의 예시 따르기

R8을 사용한 Reddit의 성공은 앱 성능에 상당한 영향을 미치면서도 노력을 적게 들이려는 모든 개발팀에게 강력한 우수사례가 됩니다. 기술적 개선사항과 그에 따른 사용자 만족도 상승 간의 직접적인 상관관계는 성능 최적화의 가치를 강조합니다.

이 우수사례에 제시된 청사진(앱 성능 점수과 같은 도구를 사용하여 기회를 파악하고, R8의 모든 최적화 잠재력을 사용 설정하고, 실제 데이터를 모니터링하고, 벤치마크를 사용하여 이해를 확인하고 심화)을 따르면 다른 개발자도 비슷한 이점을 얻을 수 있습니다.

자체 앱에서 R8을 시작하려면 R8 최적화 도구 사용 설정, 구성, 문제 해결에 관한 새로 업데이트된 공식 문서 및 가이드를 참고하세요.

작성자:

계속 읽기