Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 2022 플러터 설치
- 2022 플러터 안드로이드 스튜디오
- Rxjava Observable
- jvm이란
- 안드로이드 유닛 테스트
- android ar 개발
- rxjava hot observable
- 큐 자바 코드
- jvm 작동 원리
- android retrofit login
- 자바 다형성
- 클래스
- 스택 큐 차이
- ANR이란
- 안드로이드 유닛 테스트 예시
- 안드로이드 레트로핏 사용법
- ar vr 차이
- rxjava cold observable
- 멤버변수
- rxjava disposable
- 안드로이드 os 구조
- 안드로이드 라이선스 종류
- 안드로이드 레트로핏 crud
- 객체
- 서비스 vs 쓰레드
- 플러터 설치 2022
- 서비스 쓰레드 차이
- 안드로이드 유닛테스트란
- 안드로이드 라이선스
- 스택 자바 코드
Archives
- Today
- Total
나만을 위한 블로그
[Android] 앱 시작 시간의 종류 (Cold / Warm / Hot Start) 본문
728x90
반응형
앱이 시작하는 상태는 제목처럼 총 3가지로 나뉜다. 안드로이드 디벨로퍼에서 설명하는 각 단계별 설명은 아래와 같다.
https://developer.android.com/topic/performance/vitals/launch-time#internals
앱은 콜드 / 웜 / 핫 스타트라는 3개 상태 중 하나에서 시작하며 각 상태는 앱이 사용자에게 표시되는 데 걸리는 시간에 영향을 준다. 콜드 스타트에선 앱이 처음부터 시작된다. 다른 상태에선 시스템이 실행 중인 앱을 백그라운드에서 포그라운드로 가져와야 한다. 항상 콜드 스타트를 가정해 최적화하는 게 좋다. 이렇게 하면 웜 / 핫 스타트 성능도 개선될 수 있다. 앱이 빠르게 시작하게 최적화하려면 상태별로 시스템 수준 및 앱 수준에서 발생하는 일, 시스템과 앱이 상호작용하는 방식을 이해하는 게 좋다
< 콜드 스타트 >
콜드 스타트는 앱이 처음부터 시작하는 걸 말한다. 콜드 스타트 이전에는 시스템의 프로세스에서 앱의 프로세스를 만들지 않는다. 기기가 부팅되거나 시스템에서 앱이 종료되고 난 후 앱이 처음 시작되는 경우 등에서 콜드 스타트가 발생한다. 이 같은 시작 유형에선 시스템과 앱이 다른 시작 상태보다 더 많은 작업을 실행해야 하므로 시작 시간을 최소화하는 데 가장 큰 어려움이 있다. 콜드 스타트를 시작할 때 시스템은 3가지 작업을 실행한다
1. 앱 로드 및 시작
2. 시작 직후 앱의 빈 시작 창 표시
3. 앱 프로세스 만들기
시스템에서 앱 프로세스를 만들면 앱 프로세스에선 곧바로 다음 단계를 실행한다
1. 앱 객체 만들기
2. 메인 쓰레드 시작
3. 메인 액티비티 만들기
4. 뷰 확장
5. 화면 배치
6. 처음 그리기 실행
앱 프로세스에서 첫 번째 그리기를 완료하고 나면 시스템 프로세스에서 현재 표시된 백그라운드 창을 전환하고 기본 액티비티로 바꾼다. 이 시점에서 사용자는 앱 사용을 시작할 수 있다. 아래 그림은 시스템 프로세스, 앱 프로세스가 서로 간에 작업을 전달하는 방법을 보여준다
- 애플리케이션 만들기
애플리케이션이 시작되면 시스템에서 처음 앱 그리기를 완료할 때까지 빈 시작 창이 화면에 남아 있다. 이 시점에서 시스템 프로세스가 앱의 시작 창을 전환해서 사용자가 앱과 상호작용을 시작할 수 있게 한다. 자체 앱에서 Application.onCreate()가 재정의되면 시스템은 앱 객체에서 onCreate()를 호출한다. 그 다음 앱에서 메인 쓰레드(UI 쓰레드라고도 부름)를 생성하고 이 쓰레드를 통해 기본 액티비티를 만든다. 이 시점부터 앱 생명주기 단계에 따라 시스템 및 앱 수준 프로세스가 진행된다
- 액티비티 만들기
앱 프로세스에서 액티비티를 만든 후 액티비티에선 다음 작업을 진행한다
- 값 초기화
- 생성자 호출
- Activity.onCreate() 같이 액티비티의 현재 생명주기 상태에 적합한 콜백 메서드를 호출한다
일반적으로 onCreate()는 오버헤드가 가장 높은 작업(뷰 로드 및 확장, 액티비티 실행에 필요한 객체 초기화)을 실행하므로 로드 시간에 큰 영향을 준다
< 웜 스타트 >
웜 스타트는 콜드 스타트 시 발생하는 작업의 일부 하위 집합을 포함하며 동시에 핫 스타트보다 더 많은 오버헤드를 나타낸다. 웜 스타트로 간주될 수 있는 상태로는 여러 개가 있다.
- 사용자가 앱을 종료한 다음 재시작한다. 프로세스가 계속 실행됐을 수도 있지만 앱이 onCreate() 호출을 통해 액티비티를 처음부터 다시 만들어야 한다
- 시스템이 메모리에서 앱을 제거한 다음 사용자가 앱을 다시 시작한다. 프로세스, 액티비티를 다시 시작해야 하지만 onCreate()에 전달된 저장된 인스턴스 상태 번들이 작업 실행에 어느 정도 도움이 된다
< 핫 스타트 >
핫 스타트는 콜드 스타트보다 훨씬 간단하고 오버헤드가 낮다. 핫 스타트에선 시스템이 액티비티를 포그라운드로 가져오기만 하면 된다. 애플리케이션의 모든 액티비티가 아직 메모리에 있으면 앱에서 객체 초기화, 레이아웃 확장, 렌더링을 반복하지 않아도 된다. 하지만 onTrimMemory() 등 메모리 자르기 이벤트로 인해 일부 메모리가 삭제된 경우 핫 스타트 이벤트에 대한 대응으로 객체를 다시 만들어야 한다. 핫 스타트는 콜드 스타트 시나리오와 동일한 화면 동작을 표시한다. 시스템 프로세스는 앱이 액티비티 렌더링을 완료할 때까지 빈 화면을 표시한다...(중략)
그러니까 콜드 스타트는 캐시된 데이터들이 없이 깡스타트하는 거고 웜 스타트는 메모리에 데이터가 조금 캐시된 상태로 시작하는 걸 말하는 것 같다. 핫 스타트는 콜드 스타트와 똑같은 화면 동작을 갖는데 그거 말고는 뭔지 모르겠다.
아래는 구글을 뒤지다 찾은 내용들이다.
https://stackoverflow.com/questions/18385939/android-how-to-determine-cold-start
스플래시 화면은 앱이 시작될 때 일정 시간 동안 표시되고 일정 시간이 지나면 앱 기본 액티비티로 리디렉션되는 액티비티다...(중략)...시작 화면을 표시하면서 네트워크 또는 기타 소스에서 데이터를 불러온다. 앱이 앱의 다른 컨텐츠를 표시하기 전에 아이콘을 표시할 수 있도록 스플래시 화면이 사용된다. 콜드 스타트는 안드로이드에서 스플래시 화면, 시작 화면으로도 알려져 있다. 사용자가 앱을 시작하면 안드로이드는 새 프로세스를 생성한다. 앱 테마 또는 진입점인 액티비티 테마로 내장된 흑백 화면을 사용자에게 보여준다. 앱이 더 복잡하고 일반적으로 쓰이는 애플리케이션 객체를 사용하는 경우 더 많은 로드가 있을 수 있다. 앱 로드 시간이 느린 경우 placeholder를 써서 실제 컨텐츠로 간단히 채울 수 있고, 작업 부하가 복잡한 경우 앱 로고를 표시해서 앱을 아름답게 만들 수 있다.
< 각 launch time에 대한 최고의 벤치마크 시간 >
구글은 각 스타트 별 이상적인 벤치마크 시간을 아래와 같이 말했다.
- 콜드 스타트업은 5초 이상 걸린다
- 웜 스타트업은 2초 이상 걸린다
- 핫 스타트업은 1.5초 이상 걸린다
따라서 앱을 만들 때마다 항상 이런 시작시간을 고려하고 앱과 비교하라. 앱 실행 시간을 벤치마킹하는 건 모든 비즈니스에 매우 중요하다
< 앱 / 비즈니스에 launch time이 중요한 이유 >
앱에서 첫인상은 매우 중요하다. 첫인상이 느리면 사용자는 다음에 앱을 사용하지 않을 수 있으며 출시 시간을 관리하는 경쟁자를 확인해서 일회성 방문자를 확보한다...(중략)
< 앱 시작 시간 성능을 개선하기 위한 핵심 사항 >
- 실행 시간 추적 : 성능(performance) 탭 아래의 파이어베이스 콘솔인 로그캣을 써서 실행 시간을 추적할 수 있다. 위에서 말한 임계 시간(5초, 2초, 1.5초)과 비교하라
- 회색 영역 찾기 : 이 임계값 비교는 주의, 조치가 필요한 영역 식별에 도움이 된다
- 회색 영역에 대한 솔루션 : 주요 영역은 일반적으로 앱의 진입점이다. 안드로이드에선 Application, Activity, Fragment의 onCreate()는 일반적으로 이런 혼란을 만드는 영역이다. 따라서 이런 시작 문제를 피하려면 탐욕스런 초기화 대신 지연 로딩 접근 방식을 시도하라. 시작 지점 시간을 방해하지 않는 방식으로 무거운 자산을 불러와라
시작 시간 성능은 소프트웨어 성능 회의에서 거의 논의되지 않는 주제 중 하나지만 앱의 가장 중요한 측면 중 하나다. 앱 시작 시간은 사용자에게 남기는 첫인상이며 60% 이상의 사용자가 느린 시작 앱을 찾았을 때 하는 것처럼 사용자가 떠나는 걸 원하지 않을 것이다
반응형
'Android' 카테고리의 다른 글
[Android] hilt 사용 시 Cannot create an instance of class ViewModel 에러 해결 (0) | 2023.01.25 |
---|---|
[Android] Flow, LiveData를 써서 네트워크 연결 상태를 확인하는 방법 (0) | 2023.01.20 |
[Android] Jetpack Navigation, Room DB, Flow 같이 사용하기 - 4 - (0) | 2022.12.13 |
[Android] Jetpack Navigation, Room DB, Flow 같이 사용하기 - 3 - (0) | 2022.12.13 |
[Android] Jetpack Navigation, Room DB, Flow 같이 사용하기 - 2 - (0) | 2022.12.13 |
Comments