Mergeable libraries로 앱 실행 시간 29% 단축하기
Mergeable libraries 도입으로 29CM iOS 앱의 Cold Start를 400~500ms 줄였다.
29CM 모바일팀은 Sentry로 앱 성능을 측정한 결과 iOS 앱의 Cold Start가 p50 기준 약 1.5초, p90 기준 약 2.3초로 느리다는 점을 확인했고, 첫 개선 과제로 앱 시작 시간 단축을 선택했다.
앱은 **Tuist 기반 The Modular Architecture(TMA)**로 구성되어 있었고, 80개가 넘는 모듈 중 다른 모듈에 의존하는 interface 타겟이 Dynamic library 형태였다. Apple의 Reducing your app’s launch time 문서와 Mergeable libraries 개념을 검토한 뒤, Release에서 Static library처럼 병합하고 Debug에서는 Dynamic library처럼 빌드 시간을 유지하는 방향이 적합하다고 판단했다.
적용 과정에서 Xcode 15의 Mergeable libraries를 먼저 Automatic으로 설정했지만, Release 빌드에서 앱이 크래시했다. 이유는 간접 종속성(indirect dependency) 라이브러리는 Automatic이 아니라 Manual로 설정해야 하기 때문이었고, 관련 문서의 안내에 따라 설정 방식을 바꿔 문제를 해결했다.
Manual 설정에서는 다음 작업을 Tuist 설정에 반영했다.
MERGED_BINARY_TYPE = Manual- 병합 대상 타겟에
MERGEABLE_LIBRARY = Yes,MAKE_MERGEABLE = Yes - 간접 종속성에는
-Wl,-merge_framework,{라이브러리명}추가
빌드 결과도 확인했다. Debug에서는 실행 파일은 작고 debug.dylib와 여러 프레임워크가 남아 있었지만, Release에서는 자체 모듈 라이브러리들이 실행 파일에서 사라지고 오픈소스 라이브러리만 남았다. 프레임워크 파일 크기도 185KB에서 84KB로 줄었고, 병합된 라이브러리는 실제 코드 대신 껍데기 파일만 남는 형태로 확인됐다.
적용 후 Sentry 집계에서는 버전 6.39.0 이상부터 Mergeable libraries가 반영됐고, 샘플 수는 많지 않았지만 성능 개선이 분명하게 나타났다. Cold Start는 약 400~500ms, Warm Start는 약 180~250ms 개선됐으며, 추가로 -no_exported_symbols 옵션을 사용해 불필요한 심볼 정보를 줄이고 링크 시간을 더 줄였다.
이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.
요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.