작성자: Kateryna Semenova (DevRel Engineer), Rahul Ravikumar(Software Engineer), Chris Craik(Software Engineer)
이 글의 원문은 여기서 확인하실 수 있으며 블로그 리뷰에는 노현석(GDE)님이 참여해주셨습니다.
시작 시간이 왜 중요할까요?
대부분의 경우에, 앱 성능과 사용자의 참여는 연결되어 있습니다. 사람들은 앱이 즉각 반응해 빠르게 열리기를 기대합니다. 시작 시간은 앱 성능과 품질의 주요 측정 항목 중 하나입니다.
일부 파트너들은 앱 시작 최적화를 위해 이미 많은 시간과 리소스를 투자했습니다. 그 예로 Facebook 스토리를 확인해 보세요.
이 블로그 게시물에서는 Baseline Profile과 시작 시간을 포함하여 앱과 라이브러리의 성능을 최대 40%까지 향상할 방법을 설명합니다. 이 블로그 게시물은 '시작'에 초점을 맞추지만 Baseline Profile은 버벅거림도 상당히 개선해 줍니다.
역사
Android 9(API 수준 28)는 앱 시작 시간 개선을 위해 Play Cloud에 ART 최적화 프로필을 도입했습니다. 평균적으로, Cloud Profile을 사용할 수 있을 때 다양한 기기에서 앱의 콜드 스타트가 15% 이상 더 빠르다는 사실을 확인했습니다.
Profile은 어떻게 작동할까요?
앱을 설치하거나 업데이트한 후에 처음 실행할 때 앱의 코드는 JIT될 때까지 인터프리트 모드(interpreted mode)로 실행됩니다. APK에서는 Java 및 Kotlin 코드가 dex 바이트 코드로 컴파일되지만, 완전히 컴파일된 앱을 저장하고 로드하는 비용 때문에 (Android 6 이후로는) 기계어 코드로 완전히 컴파일되지 않습니다. 앱에서 자주 사용되는 클래스와 메서드뿐 아니라 앱 시작에 사용되는 클래스와 메서드도 프로필 파일에 기록됩니다. 기기가 유휴 모드(idle mode)에 들어가면 ART는 이러한 프로필을 기반으로 앱을 컴파일합니다. 이에 따라 다음번에는 앱이 더 빠르게 시작됩니다.
Google Play는 Android 9(API 수준 28)부터 Cloud Profile도 제공합니다. 앱이 기기에서 실행될 때 ART에서 생성된 프로필은 Play Store 앱에 의해 업로드되고 클라우드에서 집계됩니다. 애플리케이션에 대해 업로드된 프로필이 충분히 많아지면, Play 앱은 후속 설치에 집계된 프로필을 사용합니다.
문제
Cloud Profile은 사용 가능할 경우에는 대단히 유용하지만 앱 설치 시 언제든 사용할 수 있는 것은 아닙니다. 프로필의 수집 및 집계에 보통 며칠이 걸리는데, 많은 앱이 매주 업데이트되기 때문입니다. Cloud Profile을 사용할 수 있게 되기 전에 많은 사용자가 업데이트를 설치할 것입니다. Google Android 팀은 프로필의 지연 시간을 개선할 다른 방법을 찾기 시작했습니다.
해결 방법
Baseline Profile은 Android 7(API 수준 24) 이상에서 사용할 수 있는 프로필을 제공하는 새로운 메커니즘입니다. Baseline Profile은 사람이 읽을 수 있도록 앱과 라이브러리에서 제공할 수 있는 프로필 형식을 사용하여 Android Gradle 플러그인에서 생성한 ART 프로필입니다. 예를 들면 다음과 같은 형태일 수 있습니다.
HSPLandroidx/compose/runtime/ComposerImpl;->updateValue(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I HLandroidx/compose/runtime/ComposerImpl;->validateNodeExpected()V PLandroidx/compose/runtime/CompositionImpl;->applyChanges()V HLandroidx/compose/runtime/ComposerKt;->findLocation(Ljava/util/List;I)I |
Compose 라이브러리의 예
바이너리 프로필은 APK assets 디렉터리(assets/dexopt/baseline.prof)의 특정 위치에 저장됩니다.
Baseline Profile은 빌드 시간 중에 생성되어 APK의 일부로서 Play로 전달된 다음, 앱 다운로드 시에 Play에서 사용자에게 전송됩니다. Cloud Profile을 아직 사용할 수 없을 때, Baseline Profile을 통해 ART Cloud Profile 파이프라인에서 그 간극을 채워주고, Cloud Profile을 사용할 수 있게 되면 Cloud Profile과 자동으로 병합합니다.
이 다이어그램은 생성부터 최종 사용자 전달까지의 Baseline Profile 워크플로를 보여줍니다.
Baseline Profile의 최대 이점 중 하나는 개발자가 실제 최종 사용자 성능 향상을 확인할 수 있도록 Baseline Profile을 로컬에서 개발하고 평가할 수 있다는 점입니다. Baseline Profile은 Android 9부터 제공되는 Cloud Profile보다 낮은 버전의 Android(7 이상)에서도 지원됩니다.
영향
앱 개발자
2021년 초에 Google 지도는 출시 주기를 2주에서 1주로 줄였습니다. 더 잦은 업데이트로 인해 로컬 사전 컴파일을 더 자주 삭제하게 되어 Play Cloud Profile이 없는 사용자의 앱이 느리게 시작되었습니다. Google 지도는 Baseline Profile을 사용하여 평균 시작 시간을 30% 개선하고 검색량이 2.4% 증가하는 것을 확인했는데, 이처럼 이미 확고히 자리 잡은 앱에는 엄청난 이득입니다.
라이브러리 개발자
라이브러리의 코드는 앱의 코드와 똑같아서 기본적으로 완전히 컴파일되지 않으므로, 중요한 시작 경로에서 상당한 수준의 작업을 수행할 경우 문제가 될 수 있습니다.
Jetpack Compose는 Android 시스템 이미지의 일부가 아니므로 대부분의 Android View 도구 키트 코드와는 달리, 설치 시 완전히 컴파일되지 않는 UI 라이브러리입니다. 이로 인해 앱을 처음 몇 차례 콜드 런치 할때 성능 문제가 자주 발생했습니다.
이 문제를 해결하기 위해, Compose는 프로필 설치 프로그램을 사용합니다. 이 설치 프로그램은 Compose 앱에서 시작 시간과 버벅거림을 줄여주는 Baseline Profile 규칙을 제공합니다.
Google Play Store의 검색 결과 페이지는 Compose로 다시 작성되었습니다. Compose의 Baseline Profile 규칙을 통합한 후, 이미지가 있는 초기 검색 결과 페이지를 렌더링하는 데 걸리는 시간이 최대 40%까지 짧아졌습니다.
Android 팀은 관련 AndroidX 라이브러리에도 Baseline Profile을 추가했습니다. 이 라이브러리를 사용하는 모든 Android 앱이 Baseline Profile의 장점을 누릴 수 있게 되었습니다. 그리고 Constraint Layout은 배송 프로필 규칙이 애니메이션 프레임 시간을 1밀리초 이상 줄여준다는 점을 발견했습니다.
Baseline Profile 사용 방법
사용자 설정 Baseline Profile 만들기
Baseline Profile를 포함하는 것은 모든 앱과 라이브러리 개발자에게 이득으로 작용합니다. 개발자들은 가장 중요한 사용자의 여정이 Cloud Profile의 제공 여부와 상관없이 일관되게 빠른 성능을 보장하기 위해 프로필을 생성합니다. 앱 및 라이브러리 개발자 모두를 위한 Baseline Profile 설정 방법에 관한 세부 가이드를 확인해 보세요.
종속 항목 업데이트
지금 당장 앱의 Baseline Profile을 생성할 준비가 되지 않았더라도, 종속 항목을 업데이트하여 Baseline Profile의 이점을 누릴 수 있습니다. Android Gradle 플러그인 7.1.0-alpha05 이상으로 빌드하면 라이브러리에서 이미 제공하는 APK(예: Jetpack)에 포함된 Baseline Profile을 얻게 됩니다. Google Play는 설치 시 Baseline Profile로 앱을 컴파일합니다. 애플리케이션 빌드 작업의 일부로 이러한 프로필을 보완할 수 있습니다.
개선 수준 측정
잊지 말고 꼭 개선 수준을 측정하세요. 로컬에서 생성된 프로필로 시작 성능을 측정하는 방법에 대한 단계를 따르세요.
피드백 제공
여러분의 의견과 경험담을 들려주세요!