IOS

[iOS] DynamicFramework

clamp 2024. 11. 25. 22:24

1. Framework, Library

- Library: Code와 Data가 모인 하나의 모듈

- Framework: Library를 포함하는 하나의 패키지로 캡슐화한 디렉토리

ex) Framework = Library + Nib + Resources(Image, String, Header)

 

2. DynamicFramework

- 컴파일된 바이너리 파일이 stack의 Bundle영역에 존재하여 어플리케이션 코드에서 스택 영역을 참조하여 사용

- 동적으로 연결되므로 전체를 빌드하지 않아도 프레임워크를 사용 가능

- Dynamic Framework는 공유메모리를 사용

같은 DynamicFramework를 사용하는 앱 들이 있다면 해당 코드는 메모리에 한 번만 로드되어 여러 앱이 공유

DynamicFramework는 앱 실행중에 시스템이 라이브러리를 로드

 

Dynamic Linker(dyld)

- DynamicFramework가 앱 실행중에 동적으로 연결되게 하는 시스템 컴포넌트

 

동적으로 연결이란 뭘까?

 

동적연결 과정

1. 실행파일(excutable File)로딩: 앱 실행시 iOS는 Executable File을 메모리에 로드

2. Dynamic Framework의 로드 과정

1) 프레임워크 경로 탐색

실행 파일에 기록된 DynamicFramework의 경로를 탐색, 경로는 주로 @rpath(run time search path), @executable_path 등의 동적 위치 정보를 기반으로 확인

2) 메모리 로드

dyld는 필요한 dynamicFramework를 시스템에서 읽어 메모리의 Heap 영역에 로드

3) 실행파일과 DynamicFramework 간의 함수, 변수 등의 참조를 연결

4) 최적화

-dyld는 동적 연결 속도를 높이기 위해 기존에 캐싱된 연결 정보(OpCache)나 Prebinding 정보를 사용

 

동적 연결 과정) 

ex) Alamofire

앱 실행 > dyld가 실행파일(Executable File)에서 Alamofire를 사용하는 것을 확인 > Alamofire Framework가 디스크에서 읽혀서 메모리에 로드 > dyld가 Alamofire의 api를 실행파일과 연결 > 앱이 호출시 메모리에 로드된 Alamofire 호출

 

DynamicFramework가 포함된 앱을 앱스토어에 올리면?

- AppBundle에 포함 "AppBundle/Frameworks" 경로에 위치(DrivedData)에서 확인 가능

- 앱을 빌드할 때 사용하는 Dynamic Framework를 XCode가 확인하고 이를 앱 번들 내부에 복사.

 

아래 구조와 같습니다.

MyApp.app/
 ㄴFrameworks/
 	ㄴMyDynamicframework.framework
    	ㄴOtherDynamicFramework.framework

 

 

 

DynamicFramework를 AppBundle에 포함시키기 위한 XCode 설정

1. LinkBinary with Libraries

- XCode에서 사용하는 Dynamic Framework를 프로젝트의 Link Binary with Libraries에 추가해야합니다.

2. EmbedFrameworks 설정

- Build Phase > Embed Frameworks에 해당 Framework를 추가해야합니다. XCode가 앱 번들에 Framework를 복사하고 런타임에 로드할 수 있도록 설정합니다.

3. CodeSigning 설정

- 앱 스토에 제출하려면 모든 DynamicFramework는 앱의 코드에 서명 정책에 따라 서명되어야 합니다

 

 

??? DynamicFramework도 AppBundle에 포함되는데 왜 App의 크기가 덜 증가하거나 효율적인지 궁금했습니다

공유메모리 사용
DynamicFramework는 런타임에 iOS의 "공유메모리"를 활용합니다
예를 들어 A앱, B앱이 모두 동일한 SomeFrameowrk.dylib를 사용한다면 두 앱은 메모리에서 같은 프레임워크를 공유합니다.

 

??? SomeFramework.dylib를 공유한다면 Framework의 변수가 변경되면 A, B 모두 영향?

DynamicFramework의 메모리 공유와 데이터 독립성
1. 공유되는 부분: 코드
- Dynamic Framework의 코드(함수, 메서드)는 읽기 전용으로 공유됩니다.

2. 독립적인 부분: 데이터
- Dynamic Framework에서 사용하는 **데이터(전역변수, 정적변수, 객체)는 앱 마다 독립적으로 할당됩니다.

 

 

참고: 

https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Framework.html