Framework์ library์ ๋ํด์๋ ๋ชจ๋ ์์๋ค. ๊ทธ๋ผ XCFramework๋ ๋ฌด์์ผ๊น?
XCFramework
framework์ ๋ค์ํ ๋ณํ๋ค์ Bundleํ๋ ์๋ก์ด ๋ฐฉ๋ฒ, Framework๋ฅผ ํ๋ฒ๋ Bundling ํ๋ค.
Xcode 11๊ณผ ํจ๊ป 2019๋
์ ์ถ์๋ ๊ธฐ๋ฅ์ด๋ค. ๊ธฐ์กด์ Framework๋ฅผ ์ฌ์ฉํ์ฌ AppStore์ ์ฌ๋ฆฌ๋ ๊ฒฝ์ฐ, simulator architecture๊น์ง ๊ฐ์ด ๋ด๊ณ ์์ด์ ์๋ฌ๊ฐ ๋ฌ์๋ค. strip ์์
์ ํตํด ์ํ์ง ์๋ ์ํคํ
์ณ๋ฅผ stripํ์ฌ ๋ค์ ์ฌ๋ ค์ผ ํ๋ค. (lipo
command๋ฅผ ์ฌ์ฉํ๋ค.) ์ด ์ด์ ๋ Universal Framework๊ฐ simulator architecture๊น์ง ๋ด๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ ๋ชจ๋ฅธ๋ค๋ฉด ํด๋น ๊ธ์ ์ฝ๊ณ ์ค์. ์ด ์ํฉ์์ XCFramework๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์์ฒ ๋ด์ํ ์ ์๋ค.
๋จผ์ , ํ๋์ XCFramework์์ simulator target๊ณผ device target์ ๋ด์ ์ ์๋ค.
์ฌ์ง์ด iOS, maciOS, tvOS, watchOS์ ํ๋ ์์ํฌ๋ ํ๋๋ก ๋ฌถ์ ์ ์๋ค.
๋ํ Mac App์ ์ํ Framework์ธ AppKit๊ณผ iOS๋ฅผ ์ํ UIKit๋ ํ๋ฒ์ ๋ฌถ์ด์ ๊ด๋ฆฌํ ์ ์๋ค. Client๊ฐ ์ด๋ค API๋ฅผ ์ํ๋ ์ด ํ๋์ XCFramework์์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๋ํ ๊ธฐ์กด์๋ Framework๋ง Bundle up ํ ์ ์์์ง๋ง(์ผ์ชฝ), ์ด์ ๋ Static Library๋ header์ ํจ๊ป ๋ฌถ์ด Bundlingํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ฐํ, XCFramwork๋ Swift, C-Based code์ ๋ํด Binary Distribution์ ์ง์ํ๋ค.
์ ๋ฆฌ
- Muliple Architectures and Platforms๋ฅผ ์ํด ๋์จ ๊ฐ๋
- AppKit๊ณผ UIKit, Simulator์ฉ์ ํ๋ฒ์ ์ง์ ๊ฐ๋ฅ
- ์ฌ๋ฌ ํ๋ ์์ํฌ๋ฅผ ๋ค์ํ๋ฒ ๊ฐ์ธ๋ ํํ
- ๋์ด์ simulator architecture strip ๊ณผ์ ํ์ ์์
- Static library๋ header์ ํจ๊ป ๋ฌถ์ ์ ์์
- ์ด ๊ฒฝ์ฐ Xcode๊ฐ Project์ Header search path๋ฅผ ์๋์ผ๋ก update ํด์ค
Archiving Framework
XCFramework๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ์ผ๋จ binary๋ก ๋์จ ํ์ผ์ด ํ์ํ๋ค. ๊ทธ๋ ๊ฒ ํ๊ธฐ ์ํด์ ๋จผ์ , Project์ Build Option์์ Build Libraries for Distribution
์ต์
์ ์ผ์ฃผ์. ๋ด๊ฐ ์์
ํ๋ ๋
์์ด library๋ก ๋ฐฐํฌ๋ ๊ฒ์ธ์ง ํญ์ ์ผ์ฃผ์ด์ผ ํ๋ค. ์์ง ๋ง์.
xcodebuild archive
command๋ฅผ ํตํด ์์นด์ด๋นํ ์ ์๋ค.
ํ๋ก์ ํธ ๋ด์ ์ํ๋ Scheme์ ์ ํํ๊ณ , Compileํ๊ณ ์ถ์ destination์ ์ค์ ํ๋ค. ์๋ฅผ ๋ค์ด, iOS ๋๋ฐ์ด์ค์ simulator, mac์ ๋์๋๋ ๋น๋ product๋ฅผ ์ํ๋ค๋ฉด, ํด๋น ๋ถ๊ทผ์ argument๋ฅผ ์ ๋ฌํ๋ฉด ๋๋ค. ์ถ๊ฐ์ ์ผ๋ก Skip Install
๋น๋ ์ธํ
์ No๋ก ์ค์ ํด์ผ ํ๋ค. ์ด๋ ๊ฒ ํด์ผ ๊ฒฐ๊ณผ Archive์ Framework๋ฅผ ์ค์นํ๋ค.
์ด ์์ ์ ํตํด ์ฌ๋ฌ ๋ณํ๋ Archive๋ฅผ ๋ฝ์๋ด์๋ค. ์ฆ, ๋ค์ํ architecture, device์์ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ binary๋ฅผ ๋ฝ์๋ด์๋ค.
Building an XCFramework
์ด์ ๊ฐ๊ฐ ๋ค๋ฅธ binary framework๊ฐ ์์ผ๋, ์ด๋ฅผ XCFramework๋ก ๋ฌถ์ด๋ณด์.
xcodebuild -create-cxframework
command๋ก ์์ฑ์ด ๊ฐ๋ฅํ๋ค. framework์๋ archive๋ ํ์ผ๋ค์ ๊ฒฝ๋ก๋ฅผ ์ ์ด์ฃผ๋ฉด ๋๊ณ , output์ ์ต์ข
์ ์ผ๋ก bundling๋ XCFramework์ ๊ฒฝ๋ก๋ฅผ ์ ์ด์ฃผ๋ฉด ๋๋ค.
์ ๋ฆฌํ๋ฉด,
- Build Library for Distribution: YES
xcodebuild archive
xcodebuild -xreate-xcframework
Deep inside
์ค์ ๋ก ๋ง๋ค์ด์ง XCFramework๋ฅผ ์ด์ด๋ณด๋ฉด, ๊ฐ๊ฐ์ architecture์ ๋ฐ๋ฅธ framework๋ฅผ nestingํ ํํ๋ก ๋ด๊ณ ์๋ค.
์ ๋ฆฌ
์ง๊ธ๊น์ง ์ฝ 8๊ฐ ์ ๋์ ๊ธ์์ binary, framework, bundle ๋ฑ์ ๋ํด์ ์์๋ณด์๋ค. ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๊ณ ๋ง๋ฌด๋ฆฌ ํ๋๋ก ํ๊ฒ ๋ค.
- Library vs Framework
- Libary: Linkable binary
- Framework: Library with directory for resources and headers
- Static vs Dynamic
- Static: build-time linkable binary
- linkํ output binary์ ํฌํจ๋์ด ํ๋์ ์คํํ์ผ์ด ๋จ.
- Dynamic: run-time linkable binary
- output binary์ ํฌํจ๋์ง ์์ผ๋ฉฐ, ์ฌ๋ฌ ๋ค๋ฅธ binary์์ ๊ณต์ ํด์ ์ฌ์ฉ๊ฐ๋ฅ
- ์ฑ์์๋ Dynamic Framework์ธ ๊ฒฝ์ฐ App Package์ embedํ์ฌ ์ฌ์ฉ (
@rpath
)
- Static: build-time linkable binary
- Universal(fat) binary
- Multi-Architecture Binary format
- App store์ uploadํ๋ binary์๋ simulator์ฉ architecture๊ฐ ํฌํจ๋์ง ์์์ผ ํจ (
strip
ํ์)
- Swift Compatibility
- ABI Stability: Swift 5.0์ด์ (+ deployment target 13.0์ด์)
- Module Stability: Swift 5.1์ด์ (+ Build Libraries For Distribution = Yes)
- Useful shell commands
man
(manual) : format and display the on-line manual pagesfile
: determine file typelipo
: create or operate on universal filesotool
: command line parser for llvm-objdump
- Framework ์์ฑ ๋ชฉ์
- ํ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ฐฐํฌ (3rd-party library)
- ์ฑ ์ต์คํ ์ ์์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ ์ฝ๋ ๋ฐ ๋ฆฌ์์ค
- ๋น๋ ์๋ ๊ฐ์ (์ฑ ๋ฐ์นญ ์๋์ trade-off ๊ด๊ณ์)
- ๋ง์ดํฌ๋ก ํผ์ณ ์ํคํ ์ณ ์ ์ฉ ์ ์์ฑ ํ์