우수사례

Tinder, 새로운 R8 구성 분석기로 앱 콜드 스타트 47% 단축

읽는 데 4분 소요

Tinder는 새로운 세대의 싱글들이 쉽고 재미있게 만나고 진정한 관계를 맺을 수 있도록 지원하고 영감을 주는 것을 목표로 합니다. 하지만 Android 애플리케이션 코드베이스의 크기가 커지면서 복잡성도 증가했습니다. 최근 최적화 작업을 진행하기 전에는 애플리케이션의 약 70% 가 최적화되지 않았으며, 시작 전용 파일 3개를 포함하여 17개의 dex 파일이 있었습니다. R8을 사용 설정했지만 유지 규칙으로 인해 최적화 잠재력의 상당 부분이 차단되었으며, 팀은 어떤 특정 규칙이 최적화를 방해하는지 식별할 수 없었습니다. Tinder는 시작 시간을 줄이고 사용자 인식 애플리케이션 응답 없음 (ANR) 오류를 줄이기 위해 새로운 R8 구성 분석기를 사용하여 이러한 문제를 해결했습니다.

Tinder는 R8 구성 분석기를 활용하여 의도하지 않은 최적화 차단 요소를 식별하고 삭제했습니다. 그 결과 Tinder는 앱 콜드 스타트를 47% 줄이고, 앱 다운로드 크기를 28.98% (61.5MB로) 줄였으며, 사용자 인식 ANR을 28% 줄이는 등 즉각적이고 효과적인 성과를 거두었습니다.

구성 분석기 

R8 구성 분석기는 축소, 최적화, 난독화 점수를 추적하여 개선 가능한 영역을 보여주는 방식으로 R8 최적화를 표시합니다. 외부 라이브러리의 유지 규칙을 포함하여 광범위하거나 중복되거나 오래된 유지 규칙을 표시하므로 유지 규칙의 영향을 분석하고 유지 규칙을 미세 조정할 수 있습니다.

구성 분석기에 표시되는 주요 측정항목은 다음과 같습니다.

  • 축소 점수: R8 축소에 사용할 수 있는 코드 비율입니다.
  • 최적화 점수: 최적화에 열려 있는 코드 비율입니다 (예: 메서드 인라인, 수평 클래스 병합).
  • 난독화 점수: 크기를 줄이기 위해 R8에서 이름을 바꿀 수 있는 클래스, 메서드, 필드의 비율입니다.

분석기를 사용하여 보관 규칙과 그 영향을 감사합니다.

  • 광범위한 규칙 찾기: R8 최적화를 제한하는 패키지 전체 규칙의 범위를 좁히고 축소, 최적화, 난독화에서 제외된 특정 클래스, 메서드, 필드를 식별합니다.
  • 규칙 미세 조정: 리플렉션이 필요한 특정 클래스/메서드만 타겟팅하여 최적화 활용
  • 중복 규칙 삭제: 현재 빌드에서 클래스, 메서드 또는 필드와 일치하지 않는 규칙을 삭제합니다.
  • 동일한 규칙: 동일한 유지 규칙은 동일한 클래스, 필드, 메서드를 타겟팅하는 규칙 또는 동일한 유지 규칙 파일이나 여러 유지 규칙 파일에 걸쳐 있는 유지 규칙의 중복 선언을 의미합니다.
  • 포함된 규칙 찾기: 더 광범위한 구성에 이미 포함된 특정 규칙을 정리합니다.
  • 문제가 있는 라이브러리 식별: 모든 라이브러리에서 병합된 소비자 유지 규칙의 결합된 최적화 영향을 확인합니다.
R8-Configuration-Analyzer-Screenshot.png
샘플 애플리케이션의 R8 구성 분석기 보고서

에이전트 도구와 함께 R8 구성 분석기를 사용하는 데 도움이 되도록 R8 분석기 스킬을 게시했습니다. 이 기술은 R8 구성 분석기 보고서를 요약하여 최적화, 난독화, 축소 점수와 같은 주요 측정항목을 표시함으로써 자동화된 개발 워크플로를 최적화합니다. 또한 가장 영향력 있는 5가지 유지 규칙을 강조 표시하여 코드 최적화를 차단하는 요소를 명확하게 파악할 수 있습니다.

숨겨진 최적화 방해 요인 파악

image.png

R8 구성 분석기를 통합하기 전 Tinder의 Android 앱은 최적화되지 않은 코드베이스로 인해 상당한 기술 부채를 안고 있었습니다. 이러한 최적화 부족은 사용자 경험을 직접적으로 저하시켜 사용자가 느린 콜드 스타트를 경험하게 했습니다. 

이러한 문제를 해결하기 위해 Tinder팀은 R8 구성 분석기를 활용하여 R8 구성을 종합적으로 감사했습니다. 분석 결과, R8 전체 모드를 사용해도 코드베이스의 R8 최적화가 약 28% 에 불과한 것으로 나타났습니다. Tinder는 R8 Configuration Analyzer를 사용하여 사내 라이브러리가 범위가 지정되지 않은 광범위한 유지 규칙을 도입하고 있음을 확인했습니다. 

# Prevents optimization in all public classes along with all of their public and protected members

-keep public class * {
    public protected *;
}

이 '광범위한' 규칙은 의도치 않게 앱 전체의 다양한 종속 항목을 포함하여 많은 클래스에서 최적화를 방해했습니다. 과도하게 포함된 규칙으로 인해 런타임 비정상 종료가 방지되었기 때문에 개발자는 리플렉션을 사용하는 새로운 기능에 대한 새로운 규칙을 추가하지 못하는 경우가 많았으며, 이로 인해 숨겨진 문제가 시간이 지남에 따라 누적되었습니다.

R8 구성 분석기에서 제공하는 유용한 정보를 활용하여 팀은 라이브러리의 광범위한 유지 규칙의 영향을 받는 특정 클래스를 추적하고 분석할 수 있었습니다. 팀은 R8이 최적화를 수행할 수 있는 더 크고 동적으로 호출되지 않는 클래스에서 최적화가 차단되고 있음을 즉시 발견했습니다. 이 특정 보존 규칙을 미세 조정함으로써 Tinder는 상당한 최적화 기능을 활용하고, 기존 구성을 정리하고, 전반적인 최적화 수치를 대폭 개선할 수 있었습니다. R8 점수가 28% 에서 50%로 증가하여 애플리케이션 전반에서 즉각적인 성능 향상을 이끌어냈으며, Tinder팀은 이 수치를 더욱 개선하기 위해 적극적으로 노력하고 있습니다.

  • 더 빠른 로드: 앱의 느린 콜드 스타트를 경험하는 사용자가 47% 감소했습니다.
  • 더 작은 공간: 앱 다운로드 크기가 86.6MB에서 61.5MB로 감소했습니다 (28.98% 감소).
  • 안정성 개선: 사용자 인식 애플리케이션 응답 없음 (ANR) 오류가 0.35% 에서 0.28%로 감소하여 동종 앱 중앙값에 훨씬 더 가까워졌습니다.
  • 복잡성 감소: DEX 파일의 총 개수가 17개에서 11개로 줄었으며, 여기에는 시작 파일이 2개만 포함됩니다.

이러한 기술적 성능 향상 외에도 애플리케이션 최적화가 향상되면서 특히 리소스가 제한된 시장에서 실질적인 비즈니스 성장과 사용자 참여도 증가로 직접 이어졌습니다.

  • 지역별 참여도: RAM이 적은 기기가 시장에서 큰 비중을 차지하는 국가에서 참여도가 가장 크게 증가했으며, 이 거대한 시장에서 참여도를 개선하려면 ANR 발생률을 줄이는 것이 핵심이었습니다.
  • 참여도 증가: 앱 최적화가 증가한 이후 참여도가 3% 증가했습니다.
image.png

지속적 통합으로 미래 성능 보호

코드 압축을 해결하는 것은 일회성 수정이 아니며 지속적인 주의가 필요합니다. R8 구성 분석기를 통해 얻은 엄청난 성과에 힘입어 Tinder의 Android팀은 회귀를 방지하기 위해 일상적인 워크플로에 최적화 모니터링을 선제적으로 통합했습니다.

Tinder팀은 CI/CD 파이프라인에 새로운 작업을 추가하여 최적화 통계의 변경사항을 보고함으로써 모든 사용자가 자신의 기여가 최적화에 어떤 영향을 미치는지 확인할 수 있도록 했습니다.  R8 구성 통합을 고려하는 다른 개발자에게 조언할 때 이 팀은 내부 종속 항목을 감사하는 것이 중요하다고 강조합니다. 대부분의 인기 있는 서드 파티 라이브러리에는 잘 정의된 규칙이 포함되어 있지만, '안정적'이라고 간주되는 내부 회사 프로젝트는 실제로 전반적인 최적화에 부정적인 영향을 미치는 광범위한 규칙을 도입할 수 있습니다.

핵심 내용

최적화되지 않은 코드베이스와 대량의 DEX 파일로 인해 Tinder는 앱의 압축 규칙을 깔끔하게 감사할 방법이 필요했습니다. R8 구성 분석기는 지나치게 광범위한 내부 라이브러리 규칙과 유지 규칙의 영향을 받는 클래스를 식별하는 데 필요한 이상적인 도구를 제공하여 팀이 코드베이스를 자신 있게 최적화할 수 있도록 했습니다. 그 결과 Tinder는 콜드 스타트를 거의 절반으로 줄이고 APK 크기를 28% 이상 줄였으며 사용자를 위해 더 안정적이고 성능이 우수한 기반을 구축했습니다. 팀은 이러한 수치를 더욱 개선하기 위해 적극적으로 노력하고 있습니다.

R8 구성 분석기 사용 방법

R8 구성 분석기 및 독립형 기능은 현재 Android Gradle 플러그인 (AGP) 버전에 따라 활용할 수 있습니다.

1. AGP 9.3 출시: R8 구성 분석기가 AGP 9.3과 완전히 통합되어 출시되었습니다. R8 출시 빌드를 실행하면 `build/outputs/mapping/release/configanalyzer.html` 폴더에 보고서가 생성됩니다.

2. 독립형 Gradle 작업: AGP 9.3에는 전체 출시 빌드를 실행하지 않고도 분석기 보고서를 생성할 수 있는 독립형 Gradle 작업이 도입되어 로컬에서 유지 규칙을 미세 조정할 때 훨씬 더 빠른 피드백 루프를 제공합니다.

./gradlew :app:analyzeReleaseR8Config

보고서는 build/reports/r8/r8-config-analyzer-release.html.에 생성됩니다.

3. 이전 AGP 버전에서의 사용: AGP 9.3 미만 버전을 사용하는 경우 구성을 분석하기 위해 전체 AGP 버전을 이전할 필요가 없습니다. AGP에서 R8 교체 안내에 따라 R8 버전을 9.3.7-dev 이상으로 독립적으로 업데이트할 수 있습니다. 로컬에서 보고서를 생성하려면 지정된 속성으로 빌드를 실행합니다.

./gradlew assembleRelease  -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>

자세한 내용은 R8 구성 분석기 문서를 참고하세요.

작성자:
계속 읽기