[Xcode] Bitcode의 역할과 지원 종료
이 글은 과거 Xcode에서 사용하던 Bitcode를 설명하는 기록이다. 현재 프로젝트에서 Bitcode를 활성화하는 방법을 안내하는 글이 아니다.
현재 상태
Apple은 Xcode 14에서 Bitcode를 deprecated 처리했다. 이때부터 iOS, tvOS, watchOS 빌드에 Bitcode가 기본으로 포함되지 않았고, App Store도 Xcode 14에서 생성한 Bitcode 제출을 받지 않게 되었다.
Xcode 15에서는 Bitcode 지원이 제거되었으며 ENABLE_BITCODE 빌드 설정도 더 이상 효과가 없다. 따라서 현재 프로젝트에서는 Bitcode를 활성화하거나 -fembed-bitcode 같은 플래그를 추가할 필요가 없다.
Bitcode란 무엇이었나
Bitcode는 컴파일된 프로그램의 중간 표현(Intermediate Representation)을 앱과 프레임워크에 포함하는 방식이었다. 과거에는 Apple이 제출된 Bitcode를 이용해 App Store 배포 바이너리를 다시 최적화할 수 있었다.
당시에는 앱뿐 아니라 앱이 사용하는 서드파티 프레임워크와 정적 라이브러리도 Bitcode를 포함해야 했다. 구성 요소 하나라도 Bitcode를 빠뜨리면 Archive 또는 App Store 업로드 단계에서 오류가 발생할 수 있었다.

오래된 프로젝트를 정리하는 방법
예전 프로젝트를 최신 Xcode로 마이그레이션한다면 다음 항목을 확인한다.
- 사용자 정의
ENABLE_BITCODE설정을 제거한다. Other C Flags와Other C++ Flags에 남아 있는-fembed-bitcode를 제거한다.- Bitcode 전용 스크립트와 검증 단계를 삭제한다.
- 오래된 서드파티 바이너리는 현재 플랫폼과 아키텍처를 지원하는 XCFramework로 교체한다.
- Bitcode 설정 변경 뒤 발생한 빌드 문제는 캐시 삭제보다 먼저 실제 오류 메시지와 라이브러리 호환성을 확인한다.
Skip Install은 Bitcode 활성화 옵션이 아니다. 프레임워크를 Archive 결과에 포함할지 제어하는 별도의 빌드 설정이므로, Bitcode 문제를 해결하기 위해 무조건 YES로 변경해서는 안 된다. XCFramework를 만들기 위해 프레임워크를 Archive할 때는 오히려 Skip Install을 NO로 설정해야 한다.
과거 바이너리 확인
레거시 바이너리를 조사해야 한다면 otool로 __LLVM 세그먼트가 있는지 확인할 수 있다.
otool -l LegacyFramework.framework/LegacyFramework | grep __LLVM
이 명령은 과거 산출물 분석을 위한 용도다. 현재 Xcode 프로젝트에 Bitcode를 다시 활성화해야 한다는 의미는 아니다.
댓글남기기