이벤트 및 프로그램

R8을 사용하여 앱 축소, 최적화, 신속 처리

전문 길이: 5분
Ben Weiss
개발자 관계팀 엔지니어

R8을 사용하여 앱 축소, 최적화, 신속한 추적

Android 성능 Spotlight Week 첫째 날에 오신 것을 환영합니다.

앱 성능을 개선하기 위해 가장 큰 영향을 미치면서도 노력이 적게 드는 변경사항인 전체 모드에서 R8 최적화 도구를 사용 설정하는 것부터 시작해 보겠습니다.

앱 크기를 줄이는 도구인 R8을 이미 알고 계실 것입니다. 사용하지 않는 코드와 리소스를 삭제하여 앱 크기를 줄이는 데 매우 효과적입니다. 하지만 R8의 진정한 강점은 g-R8이기도 한 최적화 프로그램입니다.

전체 모드를 사용 설정하고 최적화를 허용하면 R8이 전체 프로그램에 대한 심층 최적화를 실행하여 코드를 근본적으로 더 효율적으로 다시 작성합니다. 단순한 미세 조정이 아닙니다.

이 도움말을 읽은 후 YouTube에서 성능 스포트라이트 주간 소개를 통해 R8 최적화 도구를 확인하세요.

R8로 앱 성능을 개선하는 방법

image.png

R8 최적화 도구가 앱 성능을 개선하기 위해 취하는 가장 큰 단계를 집중적으로 살펴보겠습니다.

트리 셰이킹은 앱 크기를 줄이는 데 가장 중요한 단계입니다. 이 단계에서 R8 최적화 프로그램은 앱이 종속된 라이브러리에서 사용되지 않는 코드와 자체 코드베이스에서 사용되지 않는 코드를 삭제합니다.

메서드 인라이닝은 메서드 호출을 실제 코드로 대체하여 런타임 성능을 개선합니다.

클래스 병합 및 기타 전략이 적용되어 코드가 더 간결해집니다. 인터페이스 및 클래스 계층 구조와 같은 아름다운 추상화는 이 시점에서는 중요하지 않으며 삭제될 가능성이 높습니다.

코드 축소는 클래스, 필드, 메서드의 이름을 더 짧고 의미 없는 이름으로 변경하는 데 사용됩니다. 따라서 MyDataModel 대신 a라는 클래스가 생성될 수 있습니다. 이로 인해 R8 최적화 앱의 스택 트레이스를 읽을 때 가장 혼란스러워집니다. AGP 9.0에서 이 문제가 개선되었습니다.

리소스 축소는 xml 파일, 드로어블과 같은 사용하지 않는 리소스를 삭제하여 앱 크기를 더욱 줄입니다.

이 단계를 적용하면 R8 옵티마이저가 앱 시작 시간을 개선하고, 더 부드러운 UI 렌더링을 지원하며, 느리고 고정된 프레임을 줄이고 전반적인 온디바이스 리소스 사용량을 개선합니다.

케이스 스터디: R8을 사용한 Reddit의 성능 개선

R8로 성능을 개선할 수 있는 한 가지 예로 Reddit의 예를 살펴보겠습니다. 전체 모드에서 R8을 사용 설정한 후 Android용 Reddit 앱은 다양한 영역에서 상당한 성능 개선을 보였습니다.

image.png

캡션: R8로 Reddit 앱 성능을 개선한 방법

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

이러한 개선사항은 사용자 만족도에 매우 중요합니다. 시작 속도가 빠르면 기다리는 시간이 줄어들고 콘텐츠에 더 빠르게 액세스할 수 있습니다. ANR이 적을수록 앱이 더 안정적이고 신뢰할 수 있어 사용자의 불만이 줄어듭니다. 프레임 렌더링이 더 부드러워지면 UI 버벅거림이 사라져 스크롤과 애니메이션이 유연하고 반응성이 좋아집니다. 이러한 긍정적인 기술적 영향은 사용자 감정에서도 명확하게 드러났습니다.

Google 블로그에서 개선사항에 대해 자세히 알아보세요.

R8 사용의 비기술적 부작용

파트너와 협력하는 과정에서 이러한 기술적 개선사항이 사용자 만족도에 직접적인 영향을 미치며 사용자 유지율, 참여도, 세션 길이에 반영될 수 있다는 사실을 확인했습니다. 일일, 주간 또는 월간 활성 사용자 수로 측정할 수 있는 사용자 재방문율도 기술적 성능 개선의 영향을 받아 긍정적으로 변화했습니다. 또한 R8 채택과 함께 Play 스토어의 앱 등급이 상승하는 것을 확인할 수 있었습니다. 제품 소유자, CTO, 의사 결정권자와 이 정보를 공유하면 앱의 성능을 개선하는 데 도움이 됩니다.

image.png

따라서 의도적인 성능 최적화는 미덕이라고 할 수 있습니다.

성능이 더 우수한 앱을 위한 가이드

R8에 관한 개발자 안내를 개선해야 한다는 의견이 있었습니다. 그래서 Google은 이 문제를 해결하기 위해 노력했습니다. 이제 R8 옵티마이저에 관한 개발자 안내가 훨씬 더 실용적이며 R8을 사용 설정하고 디버그하는 데 필요한 포괄적인 안내를 제공합니다.

이 문서에서는 채택을 위한 개략적인 전략을 안내하며, 최적화 친화적인 라이브러리를 선택하고 안정성을 보장하기 위해 R8의 기능을 점진적으로 채택하는 것이 중요하다고 강조합니다. 이 단계별 접근 방식을 사용하면 R8의 이점을 안전하게 활용하면서 디버그하기 어려운 문제에 관한 안내를 받을 수 있습니다.

R8 최적화 도구를 제어하는 기본 메커니즘인 보관 규칙에 관한 안내가 크게 확장되었습니다. 이제 Keep 규칙이 무엇인지, 규칙을 적용하는 방법, 규칙을 작성하고 유지관리하는 권장사항을 안내하는 섹션이 제공됩니다. 또한 실용적이고 실행 가능한 사용 사례와 예시를 제공하여 리플렉션을 통해 액세스하거나 JNI 네이티브 인터페이스를 사용하는 코드와 같이 런타임에 필요한 코드가 R8에 의해 삭제되지 않도록 올바르게 방지하는 방법을 이해할 수 있습니다.

이제 문서에서 필수 후속 조치와 고급 시나리오도 다룹니다. 테스트 및 문제 해결에 관한 섹션을 추가하여 성능 향상을 확인하고 발생할 수 있는 문제를 디버그할 수 있습니다. 고급 구성 섹션에서는 특정 빌드 변형을 타겟팅하고, 유지하거나 삭제할 리소스를 맞춤설정하는 방법을 설명하며, 라이브러리 작성자를 위한 특별 최적화 안내를 제공하여 다른 개발자가 사용할 수 있는 최적화된 R8 호환 패키지를 제공할 수 있도록 합니다.

R8 옵티마이저의 잠재력 최대한 활용

R8 옵티마이저는 Android Gradle 플러그인 버전 8.0부터 기본적으로 '전체 모드'를 사용합니다. 프로젝트가 여러 해에 걸쳐 개발된 경우 사용 중지하는 기존 플래그가 포함되어 있을 수 있습니다. gradle.properties 파일에서 이 줄을 찾아 삭제합니다.

android.enableR8.fullMode=false // delete this line to enable R8's full potential

이제 출시 변형의 앱 build.gradle.kts 파일에서 R8을 사용 설정했는지 확인합니다. isMinifyEnabled와 isShrinkResources를 true로 설정하여 사용 설정됩니다. 이 단계에서 기본 및 맞춤 구성 파일을 전달할 수도 있습니다.

release {

   isMinifyEnabled = true

   isShrinkResources = true

   proguardFiles(

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

       "keep-rules.pro"

   )

}

우수사례: Disney+ 성능 개선

Disney+의 엔지니어는 앱 성능에 투자하고 앱의 사용자 환경을 최적화하고 있습니다. 때로는 사소해 보이는 변화가 큰 영향을 미칠 수 있습니다. R8 구성을 검사하는 동안 팀은 -dontoptimize 플래그가 사용되고 있음을 확인했습니다. 이 기능은 기본 구성 파일에 의해 도입되었으며, 이 파일은 오늘날에도 많은 앱에서 사용되고 있습니다.

proguard-android.txt를 proguard-android-optimize.txt로 바꾼 후 Disney+팀은 앱 성능이 크게 개선되었습니다.

image.png

이 변경사항이 포함된 새 버전의 앱이 사용자에게 출시된 후 Disney+는 앱 시작 속도가 30% 빨라지고 사용자 인식 ANR이 25% 감소했습니다. 

오늘날 많은 앱이 -dontoptimize 플래그가 포함된 proguard-android.txt 파일을 사용합니다. 이때 도구 개선이 필요합니다.

도구 지원

Android 스튜디오 Narwhal 3 기능 출시부터 proguard-android.txt를 사용하면 lint 경고가 표시됩니다.

image.png

AGP 9.0부터는 파일 지원이 완전히 중단됩니다. 즉, proguard-android-optimize.txt로 마이그레이션해야 합니다.

또한 새로운 Android 스튜디오 기능에 투자하여 R8로 최적화된 코드를 그 어느 때보다 쉽게 디버깅할 수 있도록 했습니다. 이제 AGP 9.0부터 Android 스튜디오의 Logcat에서 R8로 처리된 빌드의 스택 트레이스를 자동으로 난독화 해제하여 완전히 최적화된 앱에서도 문제를 일으키는 정확한 코드 줄을 파악할 수 있습니다. 이 내용은 내일 Android 성능 스포트라이트 주간 블로그 게시물에서 자세히 다룰 예정입니다.

다음 단계

YouTube에서 성능 Spotlight Week 소개를 통해 R8 최적화 도구를 확인하세요.

📣 실적 챌린지에 참여하세요!

이제 직접 혜택을 확인해 보세요.

오늘 앱에 R8 전체 모드를 사용 설정해 보세요.

  1. 개발자 가이드에 따라 시작하세요( 앱 최적화 사용 설정).
  2. 여전히 proguard-android.txt를 사용하는지 확인하고 proguard-android-optimize.txt으로 바꿉니다.
  3. 그런 다음 영향을 측정합니다. 차이를 느끼는 것뿐만 아니라 확인하세요.  GitHub의 Macrobenchmark 샘플 앱의 코드를 적용하여 시작 전후의 시작 시간을 측정하여 성능 향상을 측정합니다.

앱의 성능이 크게 개선될 것으로 기대합니다. R8 사용 설정 또는 문제 해결에 관한 질문이 있으면 #optimizationEnabled를 사용하세요. 최선을 다해 도와드리겠습니다.

금요일에 진행되는 Ask Android 세션에 대한 질문을 가져오세요

성능에 관한 질문이 있으면 소셜 태그 #AskAndroid를 사용하세요. 한 주 동안 질문을 모니터링하여 11월 21일 금요일에 진행되는 Ask Android 세션에서 성능에 관한 질문에 답변해 드릴 예정입니다. 내일은 디버깅 및 문제 해결에 대해 더 자세히 알아볼 예정이니 기대해 주세요. 하지만 지금은 R8로 시작하여 앱을 빠르게 추적하세요.

작성자:

계속 읽기