Xcode 빌드 옵션의 영향 "비트 코드 사용"예 / 아니요


239

어제 나는 parse.com 라이브러리에 관한 많은 경고를 인정했다.

긴급 : '[path] /Parse.framework/Parse (PFAnalytics.o)'가 비트 코드없이 빌드되었으므로 모든 비트 코드가 삭제됩니다. 비트 코드 활성화 (Xcode 설정 ENABLE_BITCODE)로 다시 빌드하거나 공급 업체로부터 업데이트 된 라이브러리를 얻거나이 대상에 대한 비트 코드를 비활성화해야합니다. 참고 : 이것은 나중에 오류가 될 것입니다.

이 답변으로 경고를 제거 할 수 있다는 사실을 알고 있지만 이제는 AppStore 제출 및 / 또는 실제 앱 성능과 관련하여 부정적인 영향을 미칠지 궁금합니다.

Xcode는 비트 코드와 관련하여 알려줍니다

이 설정을 활성화하면 대상 또는 프로젝트가이를 지원하는 플랫폼 및 아키텍처의 컴파일 중에 비트 코드를 생성해야 함을 나타냅니다. 보관 빌드의 경우 비트 코드는 연결된 바이너리에 생성되어 앱 스토어에 제출됩니다. 다른 빌드의 경우 컴파일러와 링커는 코드가 비트 코드 생성 요구 사항을 준수하는지 확인하지만 실제 비트 코드는 생성하지 않습니다. [ENABLE_BITCODE]

그러나 나는이 텍스트에서 실제로 유용한 정보를 얻지 못했습니다.

  • 링크 된 답변을 사용하여 부정적인 영향이나 향후 AppStore 제출을 손상시키지 않고 문제를 피할 수 있습니까?
  • ENABLE_BITCODE실제로 무엇을 하는가? 향후 비 선택적 요건이 될 것인가?
  • 활성화 / 비활성화하면 성능에 영향이 있습니까?

답변:


399
  • ENABLE_BITCODE는 실제로 무엇을합니까? 향후 비 선택적 요구 사항이 있습니까?

어느 수준에서 답을 찾고 있는지 잘 모르겠으므로 약간의 여행을하겠습니다. 이 중 일부는 이미 알고있을 것입니다.

프로젝트를 빌드 할 때 Xcode는 clangObjective-C 대상 및 swift/ swiftcfor Swift 대상을 호출합니다 . 이 두 컴파일러는 앱을 중간 표현 (IR)으로 컴파일 하며이 IR 중 하나는 비트 코드입니다. 이 IR에서 LLVM이라는 프로그램이 x86 32 및 64 비트 모드 (시뮬레이터 용) 및 arm6 / arm7 / arm7s / arm64 (장치 용)에 필요한 이진 파일을 가져옵니다. 일반적으로 이러한 서로 다른 바이너리는 모두 fat binary 라는 단일 파일로 묶습니다 .

ENABLE_BITCODE 옵션은이 마지막 단계를 잘라냅니다. IR 비트 코드 바이너리를 사용하여 앱 버전을 만듭니다. 여기에는 여러 가지 훌륭한 기능이 있지만 한 가지 큰 단점이 있습니다. 비트 코드 바이너리가있는 앱을 실행하려면 비트 코드를 x86 또는 ARM 바이너리 로 다시 컴파일해야합니다 ( 어쩌면 올바른 코드인지 확실하지 않습니다 ).

비트 코드 앱이 App Store에 제출되면 Apple은이 마지막 단계를 수행하고 완성 된 바이너리를 생성합니다.

현재 비트 코드 앱은 선택 사항이지만 역사상 Apple은 선택 사항을 요구 사항 (예 : 64 비트 지원)으로 바 꾸었습니다. 일반적으로 몇 년이 걸리므로 Parse와 같은 타사 개발자는 업데이트 할 시간이 있습니다.

  • 부정적인 영향이나 향후 앱 스토어 제출을 손상시키지 않고 위의 방법을 사용할 수 있습니까?

예, ENABLE_BITCODE를 사용 중지하면 모든 것이 이전처럼 작동합니다. Apple이 비트 코드 앱을 App Store의 요구 사항으로 만들 때까지 괜찮습니다.

  • 활성화 / 비활성화하면 성능에 영향이 있습니까?

이 기능을 사용하면 성능에 부정적인 영향을 미치지 않지만 테스트 용 앱의 내부 배포는 더 복잡 할 수 있습니다.

긍정적 인 영향에 관해서는 ... 잘 복잡합니다.

App Store에서 배포하기 위해 Apple은 지방 바이너리가있는 하나의 앱 대신 각 시스템 아키텍처 (arm6 / arm7 / arm7s / arm64)에 대해 별도의 버전의 앱을 만듭니다. 즉, iOS 기기에 설치된 앱이 더 작아집니다.

또한 비트 코드가 다시 컴파일 될 때 ( 어쩌면 조립 또는 트랜스 코딩 될 수 있습니다 ... 다시, 올바른 동사를 잘 모르겠습니다 ) 최적화되어 있습니다. LLVM은 항상 새로운 최적화를 위해 노력하고 있습니다. 이론적으로 App Store는 새로운 LLVM 릴리스마다 App Store에서 별도의 버전의 앱을 다시 만들 수 있으므로 최신 LLVM 기술로 앱을 다시 최적화 할 수 있습니다.


19
"Apple은 팻 바이너리가있는 하나의 앱 대신 각 머신 아키텍처 (arm6 / arm7 / arm7s / arm64)에 대해 별도의 버전의 앱을 생성합니다. 이는 iOS 기기에 설치된 앱이 더 작음을 의미합니다." 그것이 슬라이싱이하는 일입니다. 이것은 비트 코드와 관련이 없습니다.
user102008

10
"ENABLE_BITCODE 옵션은이 마지막 단계를 잘라냅니다." 아무 단계도 끊지 않습니다. 모든 아키텍처 바이너리가 여전히 생성됩니다. 그런 다음 각 아키텍처에 대해 플러스 비트 코드 정보가 추가됩니다. 참조 stackoverflow.com/a/31030741/102008
user102008

6
developer.apple.com/library/prerelease/watchos/documentation/…을 참조하십시오. "슬라이스는 서로 다른 대상 장치에 대한 응용 프로그램 번들의 변형을 생성 및 제공하는 프로세스입니다. 변형에는 대상에 필요한 실행 가능한 아키텍처 및 리소스 만 포함됩니다. 장치."
user102008

7
Bitcode를 활성화하면 장치에 설치된 앱이 Bitcode를 비활성화했을 때보 다 더 작게 만든다는 것은 사실이 아닙니다. 어디에도 그렇게 말하지 않습니다.
user102008

7
@ onmyway133 모든 공급 업체가 소스를 제공하지는 않습니다. 모든 공급 업체가 제공하는 정적 lib 및 헤더 파일 (또는 프레임 워크) 인 경우 공급 업체는 비트 코드를 사용하도록 컴파일 된 항목을 보유해야합니다.
제프리 토마스


35

비트 코드는 iOS 9 의 새로운 기능입니다

비트 코드는 컴파일 된 프로그램의 중간 표현입니다. 비트 코드가 포함 된 iTunes Connect에 업로드 한 앱은 App Store에서 컴파일되고 링크됩니다. 비트 코드를 포함하면 Apple은 새로운 버전의 앱을 스토어에 제출할 필요없이 향후 앱 바이너리를 다시 최적화 할 수 있습니다.

참고 : iOS 앱의 경우 비트 코드가 기본값이지만 선택 사항입니다. 비트 코드를 제공하는 경우 앱 번들의 모든 앱 및 프레임 워크에 비트 코드가 포함되어야합니다. watchOS 앱의 경우 비트 코드가 필요합니다

따라서 앱의 모든 프레임 워크에서 비트 코드가 활성화 될 때까지 비트 코드를 비활성화해야합니다.


'향후 앱 바이너리를 다시 최적화하십시오'-좀 더 설명해 주시겠습니까?
genak 's

"비트 코드는 iOS 9의 새로운 기능"이고 "[...] watchOS 앱의 경우 비트 코드가 필요합니다 [...]"입니다. iOS 8에서 WatchOS 앱을 만들려면 어떻게해야합니까?
superpuccio

33

비트 코드는 충돌보고를 더욱 어렵게 만듭니다 . 다음은 HockeyApp 의 인용문입니다 ( 다른 충돌보고 솔루션 에도 해당 ).

응용 프로그램을 App Store에 업로드하고 "비트 코드"체크 상자를 활성화 한 상태로두면, Apple은 해당 비트 코드 빌드를 사용하여 장치에 배포하기 전에 마지막에 다시 컴파일합니다. 바이너리가 새로운 UUID를 얻게되고 Xcode를 통해 해당 dSYM을 다운로드하는 옵션이 있습니다.

참고 : 답변은 2016 년 1 월에 가장 최근의 변경 사항을 반영하도록 편집되었습니다.


2
9월 및 12월 사이에,이 새로운 엑스 코드 주최자 내보내기 옵션 (인용 HA 하우투에서 업데이트를 참조)를 통해 고정 (내 해결 참조 다시 깨진 얻을 관리 HA 질문 )
파벨 즈데넥을

13

@ vj9 thx. xcode 7로 업데이트합니다. 나에게 같은 오류가 표시됩니다. "NO"로 설정 한 후 빌드

여기에 이미지 설명을 입력하십시오

"아니오"로 설정하면 제대로 작동합니다.

여기에 이미지 설명을 입력하십시오


1
@Septronic YES를 선택하려면. 모든 세 번째 프레임 워크가이를 지원하는지 확인해야합니다.
zszen

대상 최소 지원 iOS 버전은 iOS 6 이상이어야합니다.
shallowThought

9

여기에서 비트 코드 에 관한 모든 솔루션을 찾을 수 있습니다

Apple Doc에 따라

비트 코드는 컴파일 된 프로그램의 중간 표현입니다. 비트 코드가 포함 된 iTunes Connect에 업로드 한 응용 프로그램은 저장되어 컴파일됩니다. 비트 코드를 포함하면 Apple은 새로운 버전의 앱을 스토어에 제출할 필요없이 향후 앱 바이너리를 다시 최적화 할 수 있습니다.

Xcode는 기본적으로 빌드 시간 동안 생성 된 심볼을 숨기므로 Apple에서 읽을 수 없습니다. 앱을 iTunes Connect에 업로드 할 때 심볼을 포함하도록 선택한 경우에만 심볼이 Apple로 전송됩니다. Apple에서 충돌 보고서를 받으려면 기호를 포함해야합니다.

참고 : iOS 앱의 경우 비트 코드가 기본값이지만 선택 사항입니다. watchOS 및 tvOS 앱의 경우 비트 코드가 필요합니다. 비트 코드를 제공하는 경우 앱 번들의 모든 앱 및 프레임 워크 (프로젝트의 모든 대상)에 비트 코드가 포함되어야합니다. iTunes Connect를 사용하여 응용 프로그램을 배포 한 후 다음에 설명 된대로 빌드 용 dSYM 파일을 다운로드 할 수 있습니다. , 장비 윈도우에서 충돌보기 및 가져 오기에

한 유형의 하드웨어에서 다른 유형의 하드웨어로 업그레이드하는 데 문제가 올바른 버전의 바이너리를 복원하지 못했기 때문에 Apple의 비트 코드 및 앱 씬닝 서비스의 초기 출시가 보류되었습니다. 이 문제는 이후 iOS 9.0.2에서 수정되었으며 기능이 다시 활성화되었습니다.

비트 코드는 항상 LLVM 컴파일 및 최적화 단계의 일부 였지만 백엔드 논리를 Apple 서버로 이동함으로써 개발자 컴파일 시간에서 App Store 배포로 최적화 및 어셈블 단계를 이동합니다. 이를 통해 향후 더 새롭고 더 빠른 프로세서를 지원할 수 있도록 향후 재 최적화 또는 재번역의 잠재력을 활용할 수 있습니다. 비트 코드 배포는 watchOS 및 tvOS 분리에 필요하며 프로젝트 설정의 "비트 코드 사용"옵션을 사용하여 기존 iOS 배포에 조건부로 활성화 할 수 있습니다. 디버그 빌드를위한 플래그 임베디드 비트 코드 마커와 아카이브 / 장치 빌드를위한 임베디드 비트 코드가 추가됩니다. 이것들은 -embed-bitcode와 함께 또는 Swift 컴파일러에 -fembed-bitcode와 함께 clang을 사용하여 전달 될 수 있습니다.

비트 코드에도 몇 가지 단점이 있습니다.개발자는 Apple에 제공된 바이너리에 해당하는 디버그 기호의 복사본을 저장하여 응용 프로그램에서 충돌 보고서를 디버깅 할 수 있습니다. 주어진 스택에서 충돌이 발생하면 개발자는 이러한 디버그 기호를 사용하여 충돌 보고서를 상징화하여 원래 스택 추적을 복원 할 수 있습니다. 그러나, 심볼은 중간 형태를 이진으로 변환하는 부산물이며; 그러나 해당 단계가 서버에서 수행되면이 정보가 손실됩니다. Apple은 개발자가 응용 프로그램을 게시 할 때 디버그 기호를 업로드 한 경우 디버거의 일부를 재생할 수있는 충돌보고 서비스를 제공합니다. 개발자가 정확한 바이너리를 보지 못한다는 것은 새로운 하드웨어가 발전함에 따라 특정 문제를 테스트하지 못할 수도 있음을 의미합니다.

마지막으로, 서버 의 비트 코드 는 새로운 아키텍처 및 명령어 세트가 발전함에 따라 지원되도록 변환 될 수 있습니다. 그들이 호출 규칙과 정렬 및 단어의 크기를 유지한다면, 비트 코드 응용 프로그램은 다른 아키텍처 유형으로 변환되어 새로운 프로세서에 맞게 최적화 될 수 있습니다. 수학 및 벡터 루틴을위한 표준 라이브러리를 사용하는 경우 지정된 어플리케이션에 대해 최고의 성능을 얻기 위해 프로세서 별 벡터 명령어로 최적화 할 수 있습니다. 옵티마이 저는 여러 개의 다른 인코딩을 생성하고 크기 또는 실행 속도에 따라 판단 할 수도 있습니다.

자세한 내용은 여기여기를 확인하십시오


6

로부터 문서

  • 부정적인 영향이나 향후 앱 스토어 제출을 손상시키지 않고 위의 방법을 사용할 수 있습니까?

비트 코드를 사용하면 다른 빌드를 제출하지 않고도 애플이 앱을 최적화 할 수 있습니다. 그러나 앱 번들의 모든 프레임 워크 및 앱에서이 기능을 활성화 한 경우에만이 기능을 활성화 할 수 있습니다. 도움이되지만 부정적인 영향을 미치지 않아야합니다.

  • ENABLE_BITCODE는 실제로 무엇을합니까? 향후 비 선택적 요구 사항이 있습니까?

iOS 앱의 경우 비트 코드가 기본값이지만 선택 사항입니다. 비트 코드를 제공하는 경우 앱 번들의 모든 앱 및 프레임 워크에 비트 코드가 포함되어야합니다. watchOS 앱의 경우 비트 코드가 필요합니다.

  • 활성화 / 비활성화하면 성능에 영향이 있습니까?

App Store 및 운영 체제는 설치 공간을 최소화하면서 사용자의 특정 장치 기능에 맞게 앱 제공을 조정하여 iOS 및 watchOS 앱 설치를 최적화합니다. App Thinning이라고하는이 최적화를 통해 가장 많은 장치 기능을 사용하고 최소 디스크 공간을 차지하며 Apple에서 적용 할 수있는 향후 업데이트를 수용하는 앱을 만들 수 있습니다. 더 빠른 다운로드와 다른 앱 및 콘텐츠를위한 더 많은 공간은 더 나은 사용자 경험을 제공합니다.

성능에 영향을 미치지 않아야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.