일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 개발자 면접
- UIPresentationController
- SwiftUI
- base64 변환
- url 추적
- UIViewControllerTransitioningDelegate
- DevelopmentRegion
- Swift Package Manager
- swift #swift keychain #keychain 사용법
- 스크롤 탭
- notifychanged
- convert base64
- oberve url
- url 관찰
- transformation.map
- swift
- scrolling tab
- Tuist
- Android
- DataBinding
- GeometryReader
- List
- Side Menu
- detect url
- development language
- ios
- pod install
- 기존 앱
- 상단 탭바
- ViewBuilder
- Today
- Total
버그 잡이
iOS - App Launch Time 줄이기 #pre-main time #static library 본문
먼저 Static Library와 Dynamic Library의 개념과 장단점에 대해서 간단하게 알아보고 넘어가겠습니다.
Dynamic vs Library 비교
Static Library
Excutable 파일에 라이브러리 파일이 포함됨
Dynamic Library
런타임 중에 필요시 해당 라이브러리 코드를 찾아서 연결
(Excutable 파일안에 코드가 있는 것이 아니라 프로그램 안에서 Framework로 따로 관리되는 개념)
# 장단점
Static Library
장점: 런타임에 해당 라이브러리 파일을 찾을 필요가 없기 때문에 앱 런치 타임 속도를 줄일 수 있음
단점: 앱 사이즈가 커짐
Dynamic Library
장점: 앱 사이즈가 작음
단점: 앱 런치 타임 속도를 느리게 할 수 있음
Launch Time 줄이기
WWDC 2016 - Optimizing App Startup Time 에서도 앱 런치 타임을 줄이기 위한 방법으로 Static Library를 쓰는 것을 이야기 합니다.
"앱 런치 타임 = pre-main time + post-main Time" 의 구조로 구성되는데
저의 앱의 pre-main Time 에서 가장 많은 부분을 차지하는게 다이나믹 라이브러리를 로드하는 시간이었습니다.
그래서 저는 CocoaPods 라이브러리들을 Static 방식으로 사용해보기 했습니다.
CocoaPods 라이브러리를 static 방식으로 사용하는 방법
변경 방법은 간단합니다.
use_frameworks! :linkage => :static
해당 내용만 Podfile 처음에 추가해주시면 됩니다.
(dynamic 설정을 원하시면 static을 dynamic으로 변경)
참고로 프로젝트 설정에서 Framework 부분을 보면 Embed & Sign / Do not embed / Embed without sign 을 설정하는 부분이 있는데, Static Library는 embed할 필요가 없습니다
이미 Excutable 파일에 포함되어 있기 때문에 embed 하면 중복으로 파일이 포함되기 때문에 불필요한 용량을 차지할 수 있습니다. (반면 Dynamic Library는 embed 해줘야 합니다)
변경 결과
Dynamic Library 로딩 타임은 Edit Scheme -> Run 탭 에서
DYLD_PRINT_STATISTICS를 추가해줌으로써 확인할 수 있습니다.
해당 변수를 추가하면 이후 빌드시 콘솔 로그에 시간이 찍힙니다.(시뮬레이터는 안 되고, 실제 디바이스만 되는 것 같습니다)
dylib Loading Time
변경 전 : 1.3 ~ 1.5초
변경 후 : 0.4 ~ 0.5초
앱 실행 시간 단축에는 확실히 효과가 있었습니다.
다만 이에 따라 얼마나 앱 사이즈가 증가하고 메모리 효율성은 정말로 나빠지는지 체크할 필요가 있겠습니다.
(업데이트. 22.07.08)
static Library로 바꾼 후 앱 사이즈를 측정하기 위해서 테스트플라이트에 올려봤습니다.
그런데.... 오히려 앱 사이즈가 줄어들었네요??
일반적으로 static library가 dynamic library보다 용량이 많이 나간다고 알려져 있는데, 예상 외의 결과였습니다.
관련해서 static library가 더 용량이 작다는 의견의 글을 찾았는데요.
https://bpoplauschi.github.io/2021/10/25/Advanced-static-vs-dynamic-libraries-and-frameworks.html
위 블로거의 주장은
static Library 는 바이너리 파일에 포함되기 때문에 swift compiler optimization에 의해 불필요한 symbol을 최적화 할 수 있다는 것입니다. (반면 dynamic library는 하나의 모듈로 embed 되기 때문에 compiler 최적화 작업이 안 된다고 하네요.)
위 의견도 일리가 있는 것 같네요.
아무튼 결과적으로 저도 static으로 바꾼 후 앱 용량이 줄어드는 효과를 봤습니다.
(해당 내용에 대해서 정확한 사실을 아시는분은 댓글 부탁드립니다!)
* 참고
https://manasaprema04.medium.com/reducing-ios-app-launch-time-pre-main-time-7e9f0c77d24
'IOS' 카테고리의 다른 글
WKWebview 메모리 릭 이슈 해결 (0) | 2022.08.07 |
---|---|
WKWebview Crash - OBSERVER_WAS_OVERRELEASED_OR_SMASHED (0) | 2022.08.05 |
iPad SplitviewController에서 DetailView 로 collapse 하기 #UISplitViewControllerDelegate (0) | 2022.06.23 |
Reactorkit에 coordinator 패턴 적용해보기 (0) | 2022.04.17 |
ReactorKit - transform() 은 무엇일까? (0) | 2022.04.06 |