์์ผ๋ก ๊ทธ๋ฆผ์์ ๋์ค๋ Swift version์ ๊ฐ์์ด๋ค. ์ดํด๋ฅผ ์ํด์ ๊ฐ์์ผ๋ก ์ ์๋ค.
์ฌ์ ์ง์
otool
Object๋ฅผ dumpํด์ ๋ด์ฉ๋ค์ ์ดํด๋ณผ ์ ์๋ utility
๊ทธ ์ค otool -L
์ ๋ฐ์ด๋๋ฆฌ์ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ํ๋์๋ฅผ ํ์ธํ ์ ์๋ ๋ช
๋ น์ด์ด๋ค. ์ฆ, ์ด ๋ช
๋ น์ด๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ด ์์กดํ๊ณ ์๋ ์ธ๋ถ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ path๋ฅผ ๋์ดํด์ค๋ค. ๋ด๊ฐ ๋ง๋ testFramework ์คํํ์ผ์ ํด๋น ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด๋ณด์. (์ด๊ฑด Swift 2.0 ๋ฒ์ ์ด๋ค. ์ด๋ ๊ฒ ํ๋ ์ด์ ๊ฐ ์๋ค. ๋ค์ ๋์จ๋ค.)
$ otool -arch arm64 -L testFramework
testFramework:
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1673.126.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.0.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 61000.0.0)
@rpath/libswiftCore.dylib (compatibility version 1.0.0, current version 1100.2.255)
@rpath/libswiftFoundation.dylib (compatibility version 1.0.0, current version 0.0.0)
@rpath/libswiftObjectiveC.dylib (compatibility version 1.0.0, current version 0.0.0)
์์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Foundation
๊ณผ UIKit
์ด ๋ณด์ธ๋ค. @rpath
๋ผ๊ณ ๋ฌ๋ ค์์ง ์์ ๊ฒฝ๋ก๋ system library์ด๋ค.
@rpath
๋ ์คํ๋๋ binary์ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก(์ฆ ์๋ ๊ฒฝ๋ก๋ก) dynamic library๋ framework์ ์์น๋ฅผ ์ง์ ํ ์ ์๋ค. Run-Path๋ผ๊ณ ๋ถ๋ฆฐ๋ค. ๋ณดํต ์ค์น๋๋ App Bundle์ dynamic library๊ฐ ํฌํจ๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค. Xcode Project file์์๋ ๋ค์์ ๊ฒฝ๋ก์์ ํ์ธํ ์ ์๋ค.
- Xcode > Build Settings > Linking > RunPath Search Paths
๊ทธ๋ฐ๋ฐ ์ด์ํ ๊ฒ ์๋ค. dynamic library๋ framework๋ ์ธ๋ถ์์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ ๊ฒ ์๋๊ฐ? ์ง๊ธ์ ์ธ๋ถ ํ๋ ์์ํฌ๊ฐ ์์ ์์์๋ ๋ถ๊ตฌํ๊ณ @rpath
๊ฐ ์๋ค. ์๋ฌด๋๋ ์์คํ
์ ๊ด๋ จ๋ ๋
์ ์ฆ, Swift, Foundation, ObjectiveC์ ๊ด๋ จ๋ ๋
์์ธ ๊ฒ ๊ฐ์๋ฐ ์ Bundle ๋ด๋ถ์ ์ถ๊ฐ๋์ด ์์๊น?
์ฌ๊ธฐ์ ์๋ฌธ์ ์ด ๋ค์๋ค๋ฉด ์ ์ฐพ์์๋ค.
App Package Inside
์ผ๋จ ๋ค์ํ ์ํคํ
์ณ์ ๋์๋๋ ์คํํ์ผ์ ๋ง๋ค์ด๋ณด์. Xcode์์ ํ๋ก์ ํธ๋ฅผ Any iOS Device target์ผ๋ก ๋น๋ํ๋ค. ๋น๋ํ Product๋ฅผ ๋ณด๋ ค๋ฉด DerivedData
(ํ์ ๋ฐ์ดํฐ)์ ์ ๊ทผํ๋ฉด ๋๋ค. ์ด์ ์๋ project navigator์ products๋ผ๋ group์ด ์์๋๋ฐ, ์์ด์ง ๋ฏ ํ๋ค.
- ๊ฒฝ๋ก:
~/Library/Developer/Xcode/DerivedData
Xcode์์ ํด๋น ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ก ์ฐพ์๊ฐ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํ์ธํ ์ ์๋ค.
- Xcode > Preference > Locations > Derived Data
- Xcode > File > Project Settings > Derived Data
ํด๋น ๊ฒฝ๋ก ์์๋ ๋ด๊ฐ ๋น๋ํ ํ๋ก์ ํธ๋ค์ด ๋ชจ์ฌ ์๋ค. ํ๋ก์ ํธ ์ด๋ฆ + ํด์๊ฐ
์ ํํ์ ํด๋๋ค์ด ๋ณด์ผ๊ฑฐ๋ค.
App์ ๋น๋ํ ๊ฒฝ์ฐ์๋ Package
ํํ๋ก ๋ฌถ์ฌ์์ด ์ค๋ฅธ์ชฝ ํด๋ฆญ ํ โํจํค์ง ๋ด์ฉ ๋ณด๊ธฐโ๋ฅผ ํตํด ์ ๊ทผํด์ผ ํ๋ค.
๋ง์ฝ Framework๋ผ๋ฉด Opaque directory๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ํด๋ ํํ์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด ์ค๋ช ์ด ์ด๋ ต๋ค๋ฉด Package, Bundle์ ์ฝ๊ณ ์ค๋ฉด ์ข๋ค.
ABI
์ผ๋จ ๋จ์ด๋ถํฐ ๋ฌด์จ์๋ฆฌ์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค. ์ผ๋จ ABI๋ผ๋ ๊ฒ์ด ๋ฌด์์ผ๊น?
Application Binary Interface
ํํ ์๋ API(Application Programming Interface)์ ๋น์ทํ๋ค. API์ ๊ฒฝ์ฐ ํน์ ํจ์๋ property๋ฅผ ๊ณต๊ฐํ๊ณ , ํ ํ๋ก๊ทธ๋จ ํน์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฌ์ฉํ ์ ์๋ cheat sheet?์ ๊ฐ๋ ์ด๋ค. ๋ง ๊ทธ๋๋ interface์ธ ๊ฒ.
ABI ์ญ์ interface์ด๋, ์์ญ์ด binary์ธ ๊ฒ์ด ๋ค๋ฅด๋ค. ์ฐ๋ฆฌ๊ฐ ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ์ปดํ์ผํ๋ฉด ์ต์ข ๊ฒฐ๊ณผ๋ฌผ๋ก binary code๊ฐ ๋์จ๋ค. ๊ฒฐ๊ตญ ์ด ์น๊ตฌ๋ค๊ณผ ์ํธ ์ํตํ๋ฉฐ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ฝ๋๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ์ฌ product๊ฐ ๋์ํ๋ ๊ฒ. ๊ทธ๋ผ ์ด ํ๊ฒฝ์์ ์ญ์ ์๋ก ์ด๋ป๊ฒ ์ํตํ ์ง์ ๋ํ ๊ท์ฝ์ด ํ์ํ๋ค. ๊ทธ๊ฒ์ด ABI์ด๋ค.
๋ฐํ์์ Swift ํ๋ก๊ทธ๋จ์ binary๋ ๋ค๋ฅธ library์ ABI๋ฅผ ํตํด ์ํตํ๋ค. API๋ฅผ ์ ์ํ ๋๋ ๋ณดํต ํจ์์ ์ด๋ฆ, ํ์ , ์ธ์, ๋ฐํ ํ์ ๋ฑ์ ์ ์ํ๋ค. ABI์ ๊ฒฝ์ฐ์๋ ํจ์๋ฅผ ์ด๋ป๊ฒ ํธ์ถํ ์ง, ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ํํํ ์ง, ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ด๋์ ๋๊ณ ์ด๋ป๊ฒ ์ ๊ทผํ ์ง ๋ฑ์ ์ ์ํ๋ค.
- CPU instructions (registers, stack organization, memory access type) CPU๋ช ๋ น์ด
- calling convention(ํจ์ ํธ์ถ, argument์ ๋ฌ, ๊ฐ ๋ฆฌํด)
- OS์ ๋ํ ์์คํ ํธ์ถ
- Data Layout
- Type Metadata
- Mangling
- Runtime
- Standard Library
์ดํด๋ฅผ ์ํด์! Dynamic library๋ฅผ ๋ก๋ํ์ฌ ์ฌ์ฉํ ๋ ํ์ํ ๊ฒ์ด๋ผ ์๊ฐํ์. Dynamic library์ ๊ฒฝ์ฐ ์ด๋ฏธ ์ปดํ์ผ๋ ์คํํ์ผ ์์ฒด๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค ์ฌ์ฉํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, Binary ์์ญ์์์ interface๊ฐ ํ์์ ์ด๋ค.
ABI Stability (Binary Compatibility)
ABI Stability๋ Swift 5.0์์ ํ๋ณด๋ ๊ธฐ๋ฅ์ด๋ค. ์ด๊ฒ ๋๋์ฒด ์ ํ์ํ ๊น? ์ฝ๊ฒ API๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ฐํด๋ณด์. ์๋ฒ์์ ์ฌ์ฉ์๊ฐ ๋ด์๋ ์ํ ๋ฆฌ์คํธ๋ฅผ ์กฐํํ๋ API version 1.0์ ๋ฐฐํฌํด์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๊ณ ์์๋ค๊ณ ํ์. ๊ทธ๋ฐ๋ฐ version 2๋ก ์ ๋ฐ์ดํธ๊ฐ ๋๋ฉด์, ๊ธฐ์กด์ ์ฌ์ฉํ๊ณ ์๋ interface์ ์ด๋ฆ์ด ๋ฐ๋์๋ค! ํน์ ์ํ ๋ฆฌ์คํธ๋ฅผ ์กฐํํ๋๋ฐ, ์์ ๋ชจ๋(?)์์ ์ ๊ทผํ๋์ง๋ฅผ ํ๋จํ๋ ์ธ์๊ฐ ์ถ๊ฐ๋์๋ค๊ณ ํ์. ๊ทธ๋ผ client์ชฝ์ (ํด๋น API๋ฅผ ์ฌ์ฉํ๋ ์ชฝ) ์์ ์ฌ์ฉ์ด ๋ถ๊ฐํ๊ฒ ๋๋ค.
์ด์ ๋ง์ฐฌ๊ฐ์ง์ ์ํฉ์ด๋ค! Swift ๋ฒ์ ์ด ๋ณ๊ฒฝ๋๋ฉด, ํด๋น ์ธ์ด๋ฅผ ํด์ํ ์ ์๋ Compiler์ ๋ณ๊ฒฝ์ด ์ผ์ด๋๊ณ , ๊ทธ๋ ๊ฒ ๋๋ฉด ABI์ญ์ ๋ณ๊ฒฝ๋๋ค. Swift 2.0์ผ๋ก ๋ง๋ค์ด๋ธ binary file๋ฅผ Swift 3.0์์ ์ฌ์ฉํ ์๊ฐ ์๋ค. ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด์๋ Package์ Swift runtime library๋ฅผ ์ถ๊ฐํ์ฌ ํ์ ๋ฒ์ ์ OS์ ํธํ์ ํ๋ณดํด์ผ ํ์๋ค. ๊ทธ๋์ ์ด์ Swift 2.0 ๋ฒ์ ์ App์ ๋ณด๋ฉด(ipa๋ฅผ ์ด๋ฉด) .dylib
๋ฅผ ํฌํจํ๊ณ ์์๋ค๊ณ ํ๋ค. (Swift dynamic library) ์ฆ, ๋ค๋ฅธ ๋ฒ์ ์ binary ํธํ์ฑ์ ์ํด App Bundle์ ์ด๋ฅผ ์ถ๊ฐํด์ ๋ฐฐํฌํ๋ ๊ฒ.
๊ทธ๋ ๋ค๋ฉด ABI Stability๋ฅผ ์ง์ํ๋ค๋ ๊ฒ์ ์ด๋ค ๋ง์ผ๊น?
Swift Dynamic library(Swift Runtime library)๊ฐ OS์ ์ผ๋ถ๊ฐ ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด Swift version์ ์๊ด์์ด ํด๋น binary๋ฅผ ํด์ํ๋ ABI๋ OS๊ฐ ๋ค๊ณ ์์ด์ App Package์ ์ถ๊ฐํ์ง ์์๋ ๋๋ค! ๊ทธ๋์ deployment target 13.0 ์ด์ ์ค์ ์, Swift Runtime Library์ ์์น๊ฐ @rpath
์์ system path๋ก ๋ณ๊ฒฝ๋๋ค.
$ otool -arch arm64 -L testFramework
testFramework:
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1673.126.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.0.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 61000.0.0)
/usr/lib/swift/libswiftCore.dylib (compatibility version 1.0.0, current version 1100.2.255)
/usr/lib/swift/libswiftFoundation.dylib (compatibility version 1.0.0, current version 0.0.0)
/usr/lib/swift/libswiftObjectiveC.dylib (compatibility version 1.0.0, current version 0.0.0)
์๋์ 3๊ฐ ํญ๋ชฉ์ด OS ๊ฒฝ๋ก๋ก ๋ณ๊ฒฝ๋์๋ค. ์ด์ ์๋ฌธ์ ์ด ํด์๋์๋ค!
์ฅ์
์ผ๋จ ์ ํ์ ์ ์ฅ์์ ํ๋ซํผ ์์ ํ๋ฅผ ๊ฐ์ง๋ค๋ ์ ์์ ์ข์ ๊ฒ์ด๋ค. ํ ๊ฐ๋ฐ ๊ด์ ์์๋ง ๋ณด์๋ฉด,
- App๊ณผ Library๊ฐ์ Binary Compatibility๋ฅผ ๊ฐ์ง๋ค.
- ํน์ ๋ฒ์ ์ Swift Compiler๋ก ๊ตฌ์ถ๋ Product๋ฅผ ๋ฒ์ ์ ์๊ด์์ด ์ ์ฉํ ์ ์๋ค.
- ๋ฒ๋ค ํฌ๊ธฐ ๊ฐ์
- ์ด์ ์๋ Swift Runtime Library๋ฅผ ์ถ๊ฐํด์คฌ์ด์ผ ํ๋๋ฐ ๋นผ๋ ๋๋ค. (๊ทผ๋ฐ ํ 5mb ํ๋..)
- Migration ๋น์ฉ ๊ฐ์
- ๊ฐ๋ฐ์์๊ฒ ํธ์ฌ์ ํธ์ฌ
Reference
- ABI Stability and More
- The System Library: libSystem
- What is ABI Stability in Swift 5?
- Optimizing App Startup Time (WWDC16)
- stackoverflow - Submit to App Store issues: Unsupported Architecture x86
- hmac - duplicate symbol ์ด์
- Run-Path Dependent Libraries - Dynamic Library Programming Topics
- ABI Stability and More
- Binary Frameworks in Swift
- Compatibility
- Binary Frameworks in Swift - WWDC 2019