우선적으로 생성한다. 👉 Kotlin은 확장 함수 등으로 Java 클래스를 상속 없이 확장하는 형태로, 전용 API를 제공한다. 👉 ʻKotlinc’컴파일러는 .class 바이트 코드와 코틀린 전용 API를 묶어 .jar확장자의 바이트 코드를 생성한다. 1단계 : kotlinc 컴파일
JIT 컴파일 👉 AOT : 앱을 스토어에서 다운로드할 때, .dex를 AndroidOS가 이해 가능한 기계어로 사전 컴파일 👉 JIT : 앱 실행 or 중간에 기능을 동작시킬 때, .dex를 AndroidOS가 이해 가능안 기계어로 그때그때 컴파일 .oat odex .vdex 등…
사전 컴파일로 인해 런타임 성능은 가장 좋으나, 설치 속도와 앱 용량 이슈가 존재한다. 👉 현재 ART는 JIT + AOT 하이브리드 환경으로, 실 사용자 환경과 유사하지 않으며, 성능 개선 확인 용도로 확인한다. .Full() 2 Benchmark 성능 측정 옵션 AOT : 10.3ms
타이틀이 길어지면 위치를 아래로 내리셔도 됩니다 현재 버전의 ART는 AOT와 JIT이 혼합된 하이브리드 방식으로 동작하며, 어떤 코드가 AOT 또는 JIT 방식으로 컴파일될지는 내부적으로 결정되기 때문에 개발자가 예측하기 어렵다. 따라서 렌더링 속도가 중요한 앱의 특정 지점에서는 Baseline Profile을 적용 AOT 컴파일의 보장 및 렌더링 성능을 개선할 수 있다.
저장 후, AOT컴파일을 점진적으로 진행한다. 👉 이때, 개발자는 BaselineProfile을 사용해 AOT컴파일이 진행 될 지점을 사전 지정 가능하다. 👉 하지만 AOT의 부분 지정인 만큼 앱의 다른 부분은 JIT컴파일 방식이 적용됨을 유의한다. .Partial() 2 Benchmark 성능 측정 옵션 AOT : 11.6ms
타이틀이 길어지면 위치를 아래로 내리셔도 됩니다 [시사점1] frameDurationCpuMs의 P50가 16.67이상으로 나온다면 렌더링 이슈 발생 확률이 높다. 전체 프레임의 50%에서 CPU 연산 시간이 16.67ms(60fps 기준 1프레임 시간)를 초과했다는 것은, 프레임 렌더링 초기 단계에서부터 문제가 발생했음을 의미하기 때문이다. Why?
이미지 Main Thread를 점유하며 로딩이 이뤄져 frame rendering성능에 영향을 미침. 따라서 고화질의 Rester이미지 로딩을 위해선 coil등 비동이 이미지 라이브러리 사용이 권장됨. [Vector이미지] : .xml, .kt 등, pixel과 무관하게 점,선,면 등 수학 공식으로 만들어진 이미지 composable환경의 Vector이미지는 Vector Image Tree를 구축하여 그려지는데, 이를 통해 Main Thread의 리소스를 더 아낄 수 있음. 3 UI 성능 개선 여정
Vector Image Tree를 그려야 함 (Composable구성을 위해 Layout Node Tree를 그리는 것과 유사) 따라서 .xml 이미지 또한 Vector Image Tree로 표현되기 위해 ImageVector로의 변환 작업이 진행됨. 하지만 이 변환 작업은 Main Thread를 Blocking한다. 따라서 .xml타입의 벡터 이미지는 .kotlin 이미지보다 더 느리다.
사용하여 Layout단계 때 상태값 전달 val heightToPx by rememberUpdatedState( { ((1 - scrollProgressState) * with (density) { 18.dp.roundToPx() }).toInt() } ) Text( modifier = Modifier .heightWithNoComposition(heightToPx), text = tradingDetailProfileVo.stock, fontSize = 12.sp ) ) // 하위 Composable에 적용 될 Modifier.layout 확장 함수 fun Modifier.heightWithNoComposition( // height: Float, heightProvider: () -> Float ): Modifier = this.layout { … }
오늘 다룬 성능 최적화는 이미지나 리컴포지션에만 해당되지 않습니다. 왜냐하면 앱 성능은 아키텍처, 하드웨어 등 다양한 요소에 의해 좌우되며, 개선할 수 있는 지점도 훨씬 많을거라 보기 때문입니다. 크로스플랫폼도 튜닝은 가능합니다. 하지만 네이티브 개발자는 OS와 더 가까운 만큼 플랫폼을 직접적으로 이해할 수 있고, 문제를 파악하여 개선할 수 있다는 점에서 경쟁력이 있다 믿습니다. 혹시 다른 방식의 최적화 경험이 있으시다면, 제 블로그에 댓글로 공유해 주세요. 함께 나누면 더 좋은 인사이트가 될 수 있을 것 같습니다. 감사합니다!