오늘날의 모바일 애플리케이션 세계에서 원활한 사용자 환경은 단순한 기능이 아니라 필수사항입니다. 로드 시간이 느리고, 응답하지 않는 인터페이스, 불안정성은 사용자 참여 및 유지에 상당한 장벽이 될 수 있습니다. Reddit의 엔지니어링팀은 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 최적화 버전이 출시된 후 팀은 사용자 감정과 참여가 극적으로 긍정적으로 변화하는 것을 확인했습니다.
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 이상 감소했습니다.
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은 클래스, 필드, 메서드의 이름 바꾸기, 이동, 삭제를 비롯하여 코드에 상당한 수정을 가합니다. 이러한 수정으로 인해 오류가 발생하는 경우 유지 규칙에서 선언하여 R8이 수정하지 않아야 하는 코드 부분을 지정해야 합니다.
앱에서 Reddit의 예 따르기
R8을 사용한 Reddit의 성공은 앱 성능에 상당한 영향을 미치면서도 노력을 적게 들이려는 모든 개발팀에게 강력한 우수사례가 됩니다. 기술적 개선사항과 그에 따른 사용자 만족도 상승 간의 직접적인 상관관계는 성능 최적화의 가치를 강조합니다.
이 우수사례에 설명된 청사진(앱 성능 점수와 같은 도구를 사용하여 기회를 파악하고, R8의 모든 최적화 잠재력을 사용 설정하고, 실제 데이터를 모니터링하고, 벤치마크를 사용하여 이해를 확인하고 심화)을 따르면 다른 개발자도 비슷한 이점을 얻을 수 있습니다.
자체 앱에서 R8을 시작하려면 R8 최적화 도구 사용 설정, 구성, 문제 해결에 관한 최신 공식 문서 및 안내를 참고하세요.
계속 읽기
-
우수사례
Monzo는 1,500만 명의 고객을 보유하고 있으며 계속 성장하고 있는 영국의 디지털 은행입니다. 앱이 확장됨에 따라 엔지니어링팀은 앱 시작 시간을 개선이 필요한 중요한 영역으로 파악했지만 코드베이스를 크게 변경해야 할까 봐 걱정했습니다.
Ben Weiss • 전문 길이: 2분
-
우수사례
TikTok은 방대한 사용자층과 혁신적인 기능으로 유명한 글로벌 쇼트 동영상 플랫폼입니다.
Ben Trengrove, Ajesh Pai • 전문 길이: 2분
-
우수사례
소셜 미디어의 역동적인 세계에서 사용자 관심은 빠르게 얻거나 잃습니다. Meta 앱 (Facebook 및 Instagram)은 세계 최대 규모의 소셜 플랫폼 중 하나이며 전 세계 수십억 명의 사용자에게 서비스를 제공합니다.
Mayuri Khinvasara Khabya • 전문 길이: 4분
소식 받아 보기
Android 개발 관련 최신 정보를 이메일로 받아 보세요. 매주