관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] Static Framework와 Dynamic Framework의 개념 (UIKit은 Static일까? Dynamic일까?, XCFramework 개념, Mach-O 개념, Embed & Sign 개념) 본문

iOS 응용 (swift)

[iOS - swift] Static Framework와 Dynamic Framework의 개념 (UIKit은 Static일까? Dynamic일까?, XCFramework 개념, Mach-O 개념, Embed & Sign 개념)

jake-kim 2023. 3. 14. 01:34

Static Framework 개념

  • 의미
    • 앱의 실행 파일(excecutable)에 바이너리 파일이 포함되는 형식 (컴파일 타임에 로드되는 방식)
  • 단점
    • 앱의 사이즈 증가
    • 모듈화 시 static 프레임워크를 의존하게되면 복사가 되므로 여러곳에서 의존할 경우 코드 중복 발생하여 의존성 관리에 더욱 주의해야하는 점이 존재
  • 장점
    • dynamic framework보다 빠른 속도

Dynamic Framework 개념

  • 의미
    • 앱의 실행 파일(excecutable)에 포함되지 않고, 런타임 시 링크되어 앱이 실행되거나 필요할때 프레임워크 코드가 메모리에 로드되는 방식
  • 단점
    • 앱의 바이너리 파일에 포함되어 있지 않고, 링크하여 사용하므로 static framework에 비해서 느린 속도
  • 장점
    • static framework에 비해서 앱의 사이즈가 커지지 않음
    • 해당 프레임워크를 의존하면 코드 복사가 되지 않아서 코드 중복이 발생하지 않아 의존성 관리가 편한점이 존재

XCode에서의 Embed & Sign 개념

  • Xcode에서 Frameworks, Libraries, and Embedded Content를 보면 Embed 옵션이 존재

  • Embed 옵션: Embed라는 것은 앱의 번들 파일에 해당 프레임워크를 복사할 것인지를 의미 
    • Embed & Sign - dynamic framework인 경우 사용 (Framework를 앱 번들에 한번만 복사해놓고 코드 사이닝을 실행하여 런타임 시 해당 프레임워크가 필요하면 연결하여 사용)
    • Do not Embed - static framework인 경우 사용 (Static Framework는 앱의 실행 파일 executable에 포함되므로 따로 번들을 참조하지 않아도 됨)

Xcode에서의 Static Framework, Dynamic Framework와 Mach-O 개념

  • Mach-O: (Mach Object file format) - 애플 OS에서 동작하는 컴파일된 프로그램에 대한 파일 포맷을 의미
    • 오브젝트 파일(.o)
    • 동적 라이브러리(.dylib)
    • 정적 라이브러리(.a)
    • 번들(.bundle)

ex) Alamofire가 어떤 프레임워크인지 확인 방법 (dynamic vs static)

  • Show in Finder 선택

  • .framework 파일을 확인하러 finder로 이동 

(추가 확인)

  • 안에 계속 들어가면 Alamofire.exec (바이너리 파일이 존재)

  • file명령어로 Alamofire를 확인했을때 dynamically linked 가 있다면 dynamic framework라고 확인
% file Alamofire
Alamofire: Mach-O 64-bit dynamically linked shared library arm64

XCFramework 개념

  • Xcode 11부터 도입된 방식이고 dynamic이나 static framework를 포함하여 여러개를 포함하여 배포되는 방식
  • XCFramework는 빌드 할때 옵션에 따라 dynamic으로 만들수도 있고 static으로 만들 수 있는 점이 존재
  • 특정 .xcframework 형식의 프레임워크가 dynamic인지 static인지 알 수 있는 방법?
    • 위 Alamofire.xcframework를 확인해본 방법처럼 Alamofire의 이진 파일을 file 명령어로 확인하여 dynamically linked가 있는지 확인하여 판단이 가능

UIKit은 Dynamic Framework일까? Static Framework일까?

  • 바이너리 파일을 대상으로 file 명령어를 사용하면 dynamic인지 static인지 확인이 가능
  • find명령어로 UIKit의 바이너리 파일이 어디있는지 확인 후 file 명령어로 확인
file /Users/jake/Library/Developer/Xcode/iOS\ DeviceSupport/13.5.1\ \(17F80\)/Symbols/System/Library/Frameworks/UIKit.framework/UIKit

(결과) - UIKit은 dynamic framework

/Users/jake/Library/Developer/Xcode/iOS DeviceSupport/13.5.1 (17F80)/Symbols/System/Library/Frameworks/UIKit.framework/UIKit: Mach-O 64-bit dynamically linked shared library arm64

* 참고

https://keumjae.tistory.com/142

https://www.runtastic.com/blog/en/frameworks-ios/

https://stackoverflow.com/questions/148747/what-is-the-difference-between-a-framework-and-a-library

Comments