목차
티스토리 뷰
1. CPU Architecture
iOS에서는 arm 계열의 CPU 아키텍처를 사용하며 아래와 같습니다.
iOS CPU Architecture | 모델 |
arm7 | iPhone 4S 이전 기종 |
armv7s | 아이폰5, 5C |
arm64 | 아이폰 5S 이후 기종 |
Xcode의 시뮬레이터는 위의 CPU 아키텍처를 따라가지 않고,
실행한 Mac의 CPU 아키텍처에 종속되며 아래와 같이 두 종류의 아키텍처가 존재합니다.
Mac CPU Architecture | 모델 |
x86_64(x64) | 2005년부터 2021년 사이에 출하된 Intel 기반의 Mac |
arm64 | 2020년 말 이후에 출하된 Apple Silicon 기반의 Mac |
Apple Silicon이 나오기 전까지는 Mac에서 시뮬레이터 빌드를 할때 x86_64 아키텍처 만을 사용하였고,
arm 계열의 아키텍처는 타겟 디바이스의 빌드나 배포에 사용되어왔었습니다.
그러나 Apple silicon 기반의 Mac이 출시되어 MacOS에서 두 개의 아키텍처를 갖게 되었고
Xcode12 이후부터 x86_64, arm64 두 개의 아키텍처를 호환하게 되었습니다.
Xcode에는 내가 실행할 장치의 CPU Architecture에 해당하는 바이너리만 생성하는 옵션이 있습니다.
프로젝트 설정 - Target - Build Settings - Build Architecture Only 입니다.
debug 모드일땐 시뮬레이터나 mac과 연결된 아이폰의 아키텍처만을 필요로하고 다른 아키텍쳐에 대한 바이너리를 생성할 필요가 없기 때문에 Yes, realease 모드일땐 모든 장치에 대응해야 하기 때문에 No로 설정되어 있는 것이 디폴트 설정입니다.
이 옵션을 Yes로 활성화 한후 시뮬레이터를 빌드한다고 가정해볼까요?
아래와 같은 아키텍처 바이너리가 생성될 겁니다.
- intel 기반의 mac : x86_64
- apple silicon 기반의 mac : arm64
아키텍처 관련 에러는 대부분 위와 같은 아키텍처 차이로 인해 발생됩니다.
x86_64 아키텍처의 바이너리를 arm64 기반의 아키텍처로 빌드하려 한다거나, 그 반대의 경우도 있을겁니다.
그리고 이 문제는 개발시 주로 사용되는 프레임워크에서 일어납니다.
2. Framework Architecture
프레임워크 아키텍처 또한 위에서 설명한 CPU 아키텍처의 연장선상입니다.
intel 기반의 맥이라고 가정 하였을 때,
프레임워크가 시뮬레이터 빌드를 지원해야 한다면 그 프레임워크 바이너리는 x86_64 아키텍쳐까지 지원하는 Fat Framework(Univalsal Framework)이여아 합니다.
하지만 앱 배포시, 앱스토어에 배포하는 프레임워크 바이너리에는 시뮬레이터용 아키텍처(x86_64, i386)가 필요하지 않습니다.
그래서 해당 프레임워크에 arm 계열의 아키텍처를 제외한 다른 아키텍처를 쳐내는 작업을 하는데, 이 과정을 strip이라 합니다.
따라서 유니버셜 프레임워크나 외부 라이브러리 프레임워크 사용 중 발생되는 에러는 이와 관련된 에러일 확률이 높습니다.
이럴 땐 strip 된 바이너리 프레임워크를 새로 받거나,
그럴 수 없는 상황일땐 아래와 같이 Target - Build Settings - Excluded Architectures 설정을 통해 문제를 해결하라는 솔루션이 iOS 관련 기술 블로그 등에 많이 올라와 있습니다.
이미 개발되었던 프레임워크들에 대해서는 어쩔 수 없지만, 앞으로는 이러한 문제를 어떻게 방지 할 수 있을까요?
저 역시 커스텀 프레임워크를 개발 할 일이 있어 그동안 설명했던 과정들을 겪어 보면서,
이런 상황 자체를 겪지 않도록 XCFramework를 사용하여 커스텀 프레임워크를 배포하게 되었습니다.
XCFramework는 Xcode11부터 공식적으로 지원된 라이브러리 바이너리 배포 형식입니다.(참고 영상)
시뮬레이터와 디바이스 환경 모두(Multiple Architecture)를 지원하기 위한 개념으로 등장하였습니다.
자세한 사용 방법은 이 글을 참고해주세요!
2023.05.17 - [iOS/Swift] - [iOS] 커스텀 프레임워크 생성 및 사용
Apple의 CPU Architecture 격변기를 겪으며 히스토리를 정리하기 위해 쓴 글이지만,
두서 없이 작성된 글에 이해하기 어려웠다면 양해드립니다.
혹시나 틀린 부분이 있다면 알려주세요. 감사합니다 :)
'iOS > System' 카테고리의 다른 글
[iOS] Locale, TimeZone 기본 개념 정리 (0) | 2023.05.30 |
---|---|
[iOS] Firebase Distribution을 통한 앱 배포 (1) | 2023.05.17 |
[iOS] iOS앱에 Firebase 추가하기 (0) | 2023.04.28 |
[iOS] SwiftGen 적용하기 (0) | 2023.04.02 |
[iOS] Fastlane를 통한 iOS 앱 배포 자동화(AppStore, Firebase Distribution) (0) | 2023.04.02 |
- Total
- Today
- Yesterday
- ios xcframework
- swift quick
- swift 구글 로그인
- iOS Unit Tes
- ios google signin
- swift 구글 sdk
- XCFramework
- swift google login
- iOS Nimble
- swift nimble
- ios 구글 로그인 sdk
- swift google login sdk
- swift google signin
- swift framework
- Quick
- ios mvvm
- iOS 유닛테스트
- swift xctest
- iOS Framework
- Firebase Distribution
- Framework
- iOS Quick
- iOS 테스트 코드
- swift reactorkit
- ios google
- ios reactorkit
- iOS 단위테스트
- swift google sdk
- XCTest
- nimble
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |