Compose 2024

2024. 6. 11. 17:17개발/[Kotlin] 안드로이드 개발

반응형

 

Compose 성능 최적화를 위한 Stability 마스터하기

- 무조건 컴포즈

Compose Structure

Compose Compiler

Jetpack compose 내에서 중추적인 역할을 하는 핵심 요소

Kotlin2.0부터는 Compose 컴파일러와 Kotlin의 버전 통합

Compose Runtime

Compose 모델 및 상태 관리의 초석 역할

Compose UI

개발자가 Composable 함수를 통해 레이아웃을 생성할 수 있도록 컴포넌트 라이브러리로 제공

 

recomposition을 통해 재실행이 가능함

관찰중인 State에 변경 발생할 때 일어남

Compose 런타임에거 정보를 전달

Compose런타임은 상태변경을 관찰하고 recomposition을 트리거하는 State라는 효율적인 매커니즘을제공

Compose 컴파일러는 Composable함수에 사용된 매개변수에게 stable 혹은 unstable 타입을 부여

 

Stable로 간주되는 유형

원시 타입

람다식으로 표현되는 함수의 유형

class의 public 프로퍼티가 모두 불변이거나 stable한 경우

class에 @stable @Immutable 어노테이션이 붙은 경우

 

Unstable로 간주되는 유형

컴파일 타임에 구현체를 예측할 수 없는 Any 유형과 같은 추상 클래스와 List, Map등을 포함한 모든 인터페이스

class의 public 프로퍼티중 최소 하나 이상이 가변적이거나 unstable한 경우

 

Smart Recomposition

stable함수이고 equals가 true라면 리컴포지션 하지 않음

매개변수가 unstable하거나 값이 변경된 경우 recomposition

 

What is ?

Restartable, Skippable, Moveable

 

Compose Runtime

@Immutable -> Compose 컴파일러에 대한 강력한 약속이며, class의 모든 public 프로퍼티와 필드가 초기화된 이후에 절대 변경되지 않도록 보장

val keyword 사용

커스텀 getter 사용 X

 

@Stable

Immutable 보다는 조금 느슨한 약속을 의미

 

@NonRestartableComposable

- Composable 함수에 사용할 경우 Restartable 속성을 부여하지 않고 recomposition을 생략

- Recomposition의 영향을 받지 않아야 하는 경우 사용하기에 적합

 

@Non-Skippable

@Skippable

 

ImmutableList를 사용해서 recomposition 생략 가능

 

앱 성능 영혼까지 끌어올리기

안정성

크래시 발생시?

어느 화면에서 발생? -> 화면 진입 경로 -> 마지막 호출 메서드? -> 특정기기 특성?

Fragment - FragmentLifecycleCallbacks 로깅을 사용

Activity - onConfigurationChanged, onNewIntent, onLowMemory

기기 특성 파악하기

네트워크

발생국가, 사용언어

언어 리소스 이슈 : 아랍권 언어 RTL

기기 사양 : 모델정보 제좌, GPU정보 등등

 

응답성

앱 시작시간, UI반응 속도, 데이터 로딩 시간

효율성 끌어올리기

 

앱 시작 시간

Cold Start Warm Start Hot Start

Cold Start

Process Init

 

Activity.onCreate

앱 객체 만들기 MainThread 시작 view inflate

Activity.onStart

 

baseline 적용한 최신 버전 속도가 올라감

baseline profile 적용 & macrobenchmark로 로컬 측정

비즈니스 로직 최적화

 

onCreate 필요한 API만 호출

Compose UI 컴포넌트 설계와 테스트

재사용 가능한 컴포넌트

결합도를 낮추고 응집도를 높인 설계

직관적인 API 디자인

-> 유연한 요구사항 대처

상태와 상태를 표시하는 UI 분리

 

상태와 상태를 표시하는 UI를 분리하여 Stateless 컴포넌트를 위주로 테스트하자.

- 변경사항에 유연함

- 테스트 가능한 컴포넌트

Screenshot Testing ? 

 

Github Actions 효율적인 배포 환경 만들기

구현부터 배포까지

 

SDLC

 

자동화 프로세스

구현

- ktlint -> 코틀린 스타일 가이드를 준수해서 일관된 코드 스타일을 유지시켜줌  

- 유닛테스트 -> 반복 작업의 제거, 비용 효율성 증대

- 빌드 검사 -> git tag

 

PR Comment

- pr 리뷰 과정에서 빌드가 필요할 때

- pr 커멘트로 명령어 작성

 

Firebase App Distribution

- develop에 코드가 머지되면 trigger

- app build 후 apk 파일 생성 -> firebase에 올라감

 

배포

마일스톤 생성 

문제상황

이번 배포에 포함되는 pr이 무엇인지 알기 어려움

진척상황이나 일정 가시화가 되지 않음

릴리즈 브랜치 생성 

 

앱 배포

 

배포 - 릴리즈 노트 생성

변경사항에 대한 추적이 어려움

휴먼에러 이슈

yml 파일로 release.yml 작성

 

당신의 앱 빌드는 안녕하십니까

특정 Repository에서 내려받을 산출물을 지정할 수 있음

 

빌드 성능 개선

2020.04 35개 -> 2024년 4월 274개........

빌드시간 12분38초 -> 6분 24초

Configuration

빌드 스크립트 내의 DSL을 평가하는 시간

 - 플러그인 적재 시간

 - 플러그인에서 제공하는 DSL을 이용한 빌드 설정 구성

On Demand Configuration

Configuration Cache

빌드스크립트를 해석한 결과가 Serializable 해야함

빌드 스크립트와 플러그인이 Configuration Cache가 지원되는지 확인이 필요

Gradle 9.0 부터, Configuration cache 기능이 기본으로 켜짐

 

Incremental Build(증분빌드)

변경된 부분과 그 영향을 받는 부분만 다시 빌드하고, 나머지 부분은 재활용

변경된 소스코드로 부터 영향을 받는 부분

- 참조하던 인라인 가능한 코드

- inline function

- 상수

- 참조하던 function signature가 바뀐 경우

 

BuildConfig

 - java/kotlin 컴파일러는 해당 상수값에 대해 inline 최적화를 수행합니다.

 - valueOf()로 감싸서 빌드시간 단축 시키기

 - 최적화가 안되면, 앱 런타임에서 느려지지 않을까요?

debug 빌드에서는 약간 느려질 수 있습니다

Release 빌드에서 사용되는 R8 컴파일러에서는 valueOf() 메소드 호출하는 부분에 대해 inline 최적화가 수행됩니다.

Gradle Build Cache

이전 빌드의 결과물을 재사용

로컬 개발환경에서만 동작합니다.

간단하게 추가가능

 

KPDS

 

 

반응형