WWDC23에서 Mergeable Library에 대한 세션이 공개되었는데, 세션을 듣던 중 궁금한 것들이 있어 삽질한 내용을 정리해보고자 한다. 삽질한 김에 let us: Go! (iOS 개발자 컨퍼런스) 에서도 발표를 하게 되었다. - 자세한 내용은 영상 업로드가 되면 업데이트하겠습니다.
우리는 앱을 개발할 때 다양한 Swift Package Manager, Cocoapods, Carthage 등을 이용한 서드파티 라이브러리를 사용해 보면서 자연스럽게 라이브러리 사용에 익숙해져 있었다.
또한 앱 개발 중 분리하고 싶은 코드를 별도의 모듈로 만들어 Static 또는 Dynamic 하게 링킹 하여 사용하게 되었는데
이번에 공개된 Mergeable Library는 Dynamic의 빌드시간, Static Library의 앱 실행시간이 가지는 장점을 모두 가지는 라이브러리라고 한다. 즉 디버그모드에서는 다이나믹하게 링킹 되어 빌드시간을 줄여주고, 사용자에게 배포될 릴리즈 빌드에서는 스테틱 하게 링킹 하여 앱 실행시간을 줄인다는 취지다.
그럼 Dynamic 라이브러리를 Static 하게 링킹하기 전, 왜 우리가 Dynamic 라이브러리를 사용했었는지를 살펴보아야한다. 대표적으로 리소스 사용 및 중복 심볼, 코드 중복 등을 피하기 위해서 Dynamic 라이브러리를 사용하고 있다.
그럼 단순히 Static하게 링킹 된다는 장점을 가져가고, 기존 사용에는 영향을 주지 않을 것인지가 궁금했다.
그중 대표적으로 궁금했던 것은 리소스 사용이다.
리소스 사용을 위해서는 앱 내에 프레임워크 번들이 추가되어야 하고, 빌드 후 변환된 리소스는 위의 이미지처럼 존재한다.
XCAssets에 있는 리소스는 Assets.car로
Storyboard는 Storyboardc로
텍스트파일은 그대로 등등...
즉 이렇게 프레임워크 번들이 앱 번들 내에 Embed 된 상태여야 리소스를 사용할 수 있다는 말이다.
도쿄 iOS 밋업에서 발표한 Deep Dive into Mergeable Library를 보면, 릴리즈모드를 통해 빌드 후 메인번들에서 리소스를 찾지 못해 이미지를 표시하지 못한다고 설명하고 있다.
기존에 가지고 있던 상식대로, 앱 번들에 리소스가 포함(embed) 안되어있는데 로드가 안 되는 건 당연한 일이었다.
여기서 생기는 의문은 Mergeable Libray는 코드도 복사하고 프레임워크 번들도 앱 번들에 추가하면 결국 최종 앱 번들 사이즈가 증가하는 게 아닐까? 하는 것이었다.
그래서 애플 포럼에 이러한 궁금증에 대해서 질문을 남겼고...
에스키모 라고하시는 애플 직원분께서 답변을 달아주셨다.
결과만 말해보자면, Framework가 -make_mergeable 링커 플래그를 통해 메인 앱 바이너리에 merge 되었더라도 프레임워크는 Embed 되어야 한다.
단, 프레임워크 내에 있는 바이너리는 빈 바이너리이며, 리소스를 참조하기 위한 파일 시스템 계층만 존재한다.
그렇지만 빌드해보지 않으면 모르니까 한번 시도해 보니..
다이나믹하게 링킹 된 위쪽 결과와, Mergeable하게 링킹된 아래의 프래임워크 내 바이너리 크기를 비교해 보니, 매우 작아져있다는 것을 확인할 수 있었다.
결과적으로 최종 앱 번들 사이즈는 거의 증가하지 않는다는 것을 알게 되었다.
References
Meet mergeable libraries - https://developer.apple.com/videos/play/wwdc2023/10268
What is 'hook' mentioned at Meet mergeable libraries Session - https://developer.apple.com/forums/thread/736404
Bundle Programming Guide - https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/Introduction/Introduction.html
Depp dive into mergeable library(Tokyo iOS Meetup) - https://speakerdeck.com/giginet/deep-dive-into-mergeable-library
Bundle Main https://developer.apple.com/documentation/foundation/bundle/1410786-main
'iOS' 카테고리의 다른 글
(iOS) Link fast: Improve build and launch times - WWDC22 앞부분 정리 (0) | 2023.08.06 |
---|---|
(iOS) Swift Macros 찍먹해보기 (0) | 2023.07.03 |
(iOS) 유니플로거 리팩토링(3) 로그인, 회원가입 (feat. Spring Boot 삽질기) (5) | 2023.06.07 |
(iOS) 유니플로거 리팩토링(2) 튜토리얼 (0) | 2023.06.07 |
(iOS) 유니플로거 리팩토링(1) XCFramework (4) | 2023.05.07 |