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
'개발 > [Kotlin] 안드로이드 개발' 카테고리의 다른 글
[Android A..Z] Flow 중간연산자 정리 (0) | 2024.04.21 |
---|---|
[Android A..Z] Flow onXXX연산자 예외처리 정리 (0) | 2024.04.21 |
[Android A..Z] Flow collect vs collectLatest (0) | 2024.03.30 |
[Android A..Z] Flow StateFlow vs SharedFlow 비교 (0) | 2024.03.30 |
[A..Z] Kotlin Flow vs StateFlow hot? cold? 스트림 쉽게 알아보기 (2) | 2023.11.29 |