오늘날의 모바일 애플리케이션 환경에서 원활한 사용자 환경은 단순한 기능이 아니라 필수 요소입니다. 느린 로드 시간, 응답하지 않는 인터페이스, 불안정성은 사용자 참여와 유지에 큰 장애물이 될 수 있습니다. Android 개발자 협력팀과 협력하는 동안 Reddit의 엔지니어링팀은 앱 성능 점수를 사용하여 앱을 평가했습니다. 성능을 평가한 후 개선의 여지가 크다는 것을 확인하고 Android 앱 최적화 도구인 R8의 모든 기능을 사용 설정하기로 결정했습니다. 이 집중적인 이니셔티브를 통해 시작 시간이 크게 개선되고, 느리거나 고정된 프레임과 ANR이 감소했으며, 전반적으로 Play 스토어 평점이 높아졌습니다. 이 우수사례에서는 Reddit이 이러한 놀라운 결과를 달성한 방법을 자세히 설명합니다.
R8 옵티마이저가 Reddit에 도움을 준 방법
R8 최적화 도구는 Android에서 성능 최적화를 위한 기본 도구입니다. 앱 성능을 개선하려면 다양한 단계를 거쳐야 합니다.가장 큰 영향을 미치는 단계를 간단히 살펴보겠습니다.
- 트리 셰이킹은 앱 크기를 줄이는 데 가장 중요한 단계입니다. 여기서는 앱 종속 항목과 앱 자체에서 사용하지 않는 코드가 삭제됩니다.
- 메서드 인라이닝은 메서드 호출을 실제 코드로 대체하여 앱의 성능을 향상합니다.
- 클래스 병합 및 기타 전략이 적용되어 코드가 더 간결해집니다. 이 시점에서는 소스 코드의 가독성이 아니라 컴파일된 코드가 빠르게 작동하도록 하는 것이 중요합니다. 따라서 인터페이스나 클래스 계층 구조와 같은 추상화는 여기서 중요하지 않으며 삭제됩니다.
- 식별자 축소는 클래스, 필드, 메서드의 이름을 더 짧고 의미 없는 이름으로 변경합니다. 따라서
MyDataModel대신 a라는 클래스가 생성될 수 있습니다. - 리소스 축소 는 xml 파일 및 드로어블과 같은 사용하지 않는 리소스를 삭제하여 앱 크기를 더 줄입니다.
R8 최적화의 주요 단계
하드 데이터부터 사용자 만족도까지: 프로덕션에서 성공 확인하기
Reddit은 새로운 버전의 앱이 사용자에게 출시된 직후 성능이 개선되었습니다. Reddit은 Android Vitals와 Crashlytics를 사용하여 실제 사용자가 사용하는 실제 기기에서 성능 측정항목을 캡처하여 새 버전과 이전 버전을 비교할 수 있었습니다.
R8로 Reddit 앱 성능을 개선한 방법
팀은 콜드 스타트 속도 40% 향상, '애플리케이션 응답 없음' (ANR) 오류 30% 감소, 프레임 렌더링 25% 개선, 앱 크기 14% 감소를 확인했습니다.
이러한 개선사항은 사용자 만족도에 매우 중요합니다. 시작 속도가 빠르면 기다리는 시간이 줄어들고 콘텐츠에 더 빠르게 액세스할 수 있습니다. ANR이 적을수록 앱이 더 안정적이고 신뢰할 수 있어 사용자의 불만이 줄어듭니다. 프레임 렌더링이 더 부드러워져 UI 버벅거림이 사라지므로 스크롤과 애니메이션이 유연하고 반응성이 좋습니다. 이러한 긍정적인 기술적 영향은 사용자 감정에서도 명확하게 드러났습니다.
최적화의 성공 여부를 나타내는 사용자 만족도 지표가 Google Play 스토어에 직접 표시되었습니다. R8로 최적화된 버전을 출시한 후 사용자 감정과 참여도에 극적이고 긍정적인 변화가 있었습니다.
드루 헤브너: '2주 이내에 R8의 잠재력을 최대한 활용하는 도구 사용 설정'
가장 인상적인 점은 이러한 성과가 집중적인 노력으로 달성되었다는 것입니다. 이 이니셔티브에 참여한 Reddit의 스태프 소프트웨어 엔지니어인 드루 헤브너는 R8의 잠재력을 최대한 활용하기 위한 변경사항을 구현하는 데 2주 미만이 걸렸다고 말했습니다.
이점 확인: Macrobenchmark를 사용한 심층 분석
실제 환경에서 상당한 개선이 이루어진 것을 확인한 후 Reddit의 엔지니어링팀과 Google의 Android 개발자 관계팀은 과학적으로 이점을 확인하고 추가 최적화를 실험하기 위해 자세한 벤치마크를 실시했습니다. 이 분석을 위해 Reddit 엔지니어링팀은 최적화가 적용되지 않은 버전과 R8 및 두 가지 기본 성능 최적화 도구인 기준 프로필, 시작 프로필이 적용된 버전 등 두 가지 버전의 앱을 제공했습니다.
기준 프로필은 JIT (Just in Time) 컴파일 단계를 사용자 기기에서 개발자 머신으로 효과적으로 이동합니다. 생성된 사전 (AOT) 컴파일 코드는 시작 시간과 렌더링 문제를 모두 줄이는 것으로 입증되었습니다.
앱이 패키징되면 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) 컴파일 발생이 2/3 감소하고 JIT 컴파일 시간이 1/3 감소했습니다. 프레임 렌더링이 개선되어 벤치마킹된 사용자 여정에서 렌더링되는 프레임이 19% 더 많아졌습니다. 마지막으로 앱 크기가 3분의 1 이상 줄었습니다.
Reddit의 전반적인 성능 개선
다음과 같은 맞춤 Macrobenchmark 트레이스 섹션 측정항목으로 JIT 컴파일 시간을 측정할 수 있습니다.
val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")변환을 지원하는 기술: R8
전체 모드에서 R8을 사용 설정하려면 출시 빌드 유형에서 minifyEnabled 및 shrinkResources을 true로 설정하여 app/build.gradle.kts 파일을 구성합니다.
android {
...
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"keep-rules.pro",
)
}
}
}이 단계 후에는 전체 엔드 투 엔드 테스트를 수행해야 합니다. 성능 최적화로 인해 원치 않는 동작이 발생할 수 있으므로 사용자가 발견하기 전에 이를 포착하는 것이 좋습니다.
이 도움말의 앞부분에서 설명한 것처럼 R8은 성능 혜택을 극대화하기 위해 광범위한 최적화를 실행합니다. R8은 클래스, 필드, 메서드의 이름 바꾸기, 이동, 삭제를 비롯해 코드에 상당한 수정을 가합니다. 이러한 수정으로 인해 오류가 발생하는 경우 keep 규칙에서 선언하여 R8이 수정하지 않아야 하는 코드 부분을 지정해야 합니다.
앱에서 Reddit의 예시 따르기
R8을 통해 성공을 거둔 Reddit의 사례는 앱 성능에 큰 영향을 미치면서도 노력을 많이 들이지 않으려는 모든 개발팀에게 강력한 사례 연구가 됩니다. 기술 개선과 그에 따른 사용자 만족도 상승 간의 직접적인 상관관계는 성능 최적화의 가치를 강조합니다.
이 사례 연구에 제시된 청사진(앱 성능 점수와 같은 도구를 사용하여 기회 파악, R8의 전체 최적화 잠재력 사용 설정, 실제 데이터 모니터링, 벤치마크를 사용하여 이해 확인 및 심화)을 따르면 다른 개발자도 비슷한 이점을 얻을 수 있습니다.
자체 앱에서 R8을 시작하려면 R8 옵티마이저를 사용 설정하고 구성하고 문제를 해결하는 방법에 관한 최신 공식 문서 및 가이드를 참고하세요.
-
우수사례Monzo는 1,500만 명의 고객을 보유한 영국의 디지털 은행으로, 고객 수가 계속 증가하고 있습니다. 앱이 확장되면서 엔지니어링팀은 앱 시작 시간이 개선이 필요한 중요한 영역이라고 판단했지만 코드베이스를 크게 변경해야 할까 봐 걱정했습니다.
Ben Weiss, Tracy Agyemang • 전문 길이: 2분 -
우수사례성능 회귀는 재현하기가 매우 어려워 모바일 개발자에게 큰 병목 현상이 됩니다.
-
우수사례FotMob은 최근 5년 동안 설치된 잠재고객 중 Wear OS에서 일일 평균의 2~3배에 달하는 가장 큰 일일 증가를 경험했습니다. 비결은 무엇일까요? 사용자가 휴대전화에서 직접 Wear OS 앱을 검색할 수 있도록 지원하는 간단한 교차 기기 설치 흐름
Garan Jenkin • 전문 길이: 3분
Android 개발 관련 최신 정보를 이메일로 받아 보세요.