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에서 사용하는 **데이터(전역변수, 정적변수, 객체)는 앱 마다 독립적으로 할당됩니다.
참고: