본문 바로가기

iOS

(iOS) Mergeable Library 삽질기(1)

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 된 상태여야 리소스를 사용할 수 있다는 말이다.

Tokyo iOS Meetup 발표자료 내용

도쿄 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