스위프트 런타임과 ABI 안정화

2014년 WWDC에서 발표되었던 스위프트가 9월에 Xcode 6와 함께 출시되었을 때부터 아이폰 앱 하나를 완전히 스위프트로 만들어 12월에 출시했었다. 스위프트 3까지 대격변 마이그레이션을 겪으면서 프로덕션에 사용할 수 없겠다는 생각으로 Objective-C로 앱을 다시 만들었다.

올해 3월 스위프트 5가 Xcode 10.2와 함께 출시하면서 ABIApplication Binary Interface 안정화가 선언되었고, 함께 출시한 macOS 10.14.4, iOS 12.2, watchOS 5.2, tvOS 12.2부터 스위프트 런타임 라이브러리가 OS의 기본 컴포넌트로 포함되기 시작하였다.

이전까지는 스위프트의 버전에 따른 바이너리 호환성이 없으므로 각 앱이 자신이 사용하는 버전의 스위프트 런타임 라이브러리를 직접 포함하여 배포되었다. macOS 기준으로 이 라이브러리 파일들(.dylib)은 11MB 정도인데, 앱이 배포되는 크기를 증가시키고, 모든 앱이 그만큼의 메모리를 각자 점유하게 되므로 효율적이지 못한 부분이었다. 이 런타임 라이브러리가 OS의 일부로 포함됨으로써 Objective-C처럼 1등 시민first-class citizen의 영역에 들어온 것이다.

앱 씨닝App Thinning에 의해 스위프트 5로 만들어진 앱은 스위프트 런타임 라이브러리가 포함된 OS에서 앱 스토어로부터 다운로드될 때 내장 라이브러리가 제외된 빌드를 받게 된다. 그 이전의 OS에서는 예전과 같이 런타임 라이브러리가 내장되어 있으므로 실행에 문제가 없다.

macOS는 앱 씨닝을 지원하지 않지만, 스위프트 5로 빌드된 앱이 macOS Mojave 10.14.4 이상에서 실행될 때는 앱에 내장된 스위프트 런타임 대신 OS의 것을 링크한다.1 앱의 배포 대상deployment target을 10.14.4 이상으로 설정하면 스위프트 런타임을 내장하지 않도록 앱이 빌드된다.


  1. Evolving Swift On Apple Platforms After ABI Stability (February 11, 2019) ↩︎