iOS) Dynamic/Static Framework/Library

Havi·2021년 6월 28일
0

원본 글을 번역한 글입니다. https://theswiftdev.com/deep-dive-into-swift-frameworks/

라이브러리

  • Object file의 집합
  • program과 link가능
  • static과 dynamic 라이브러리가 있다.

Mach-O file format

개발자의 소스코드가 컴파일러에 의해 object file로 변환됨 (.swift -> .o)

object file이 static linker에 의해 executable code 또는 static library로 변환됨

→ 이 과정을 linking이라고 한다

Static Linking

Static Linking에서 library의 source code는 literal하게 어플리케이션의 소스로 복사된다.

따라서 executable 파일의 용량이 커지고, 이는 load시간 증가로 이어지며 따라서 앱의 바이너리가 느린 startup time을 가진다.

동일한 라이브러리를 다시 link하려고 하면 process가 중복된 symbol에 의해 실패할 것이다.

이 방법은 장점을 가지고 있다. 예를 들어 executable은 매번 올바른 버전의 library를 가지고 있고, 실제로 사용되는 부분만 main application에 복사된다. 따라서 모든 것을 load할 필요가 없다. 하지만 dynamic linking의 경우 몇몇의 case에서 장점을 가진다.

Dynamic Linking

Dynamic Libraries 는 바이너리의 소스에 embed되지 않고, runtime에 load된다. 그 말은 즉슨 앱이 더 작아지고, 작아진 binary file에 의해 startup time이 significant하게 빨라질 수 있다. dynamic library는 다수의 executable을 공유할 수 있기 때문에 memory footprint또한 적게 쓴다. 그래서 가끔 shared libraries라 불린다.

물론 dynamic library를 사용할 수 없거나, 버전이 다르다면 앱이 죽을 것이다. 반면 이것은 advantage가 될 수 있다. 왜냐하면 dynamic library의 작업자가 수정해도 실제 앱은 recompliation을 하지 않아도 된다.

UIKit 같은 system library는 항상 available하므로 이런 이슈에 대해 너무 걱정하지 않아도 된다.

Framework

framework는 공유 리소스를 캡슐화 하는 계층적인 디렉토리이다. dynamic shared library나, nib파일, image, localized strings, header file 같은 리소스를 하나의 package로 관리한다.

따라서 framework는 extra asset과 메타데이터와 version이 번들로 패킹된 static 하거나 dynamic 한 library이다. UIKit은 UI요소를 display하기 위해 image asset이 필요한, 버전정보를 가지고있는 프레임워크이다.

Module

Swift는 module로 코드를 구성한다. 각각의 모듈은 namespace를 특정화 하고, access control을 강제한다.

import 키워드를 통해 외부 모듈을 소스로 임포트 할 수 있다.

profile
iOS Developer

0개의 댓글