Xcode 빌드 옵션 중에는
ENABLE_BITCODE 라는게 존재한다.
예전에 빌드 도중
'{FILE_NAME}' does not contain bitcode.
You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE),
obtain an updated library from the vendor, or disable bitcode for this target.
for architecture arm64
해당 오류를 만난 적이 있다.
당시에는 아무것도 모르는 상태로 해당 값을 No(false)로 바꿨더니 문제가 해결됐고, 그냥 그렇게 넘겼다.
이제 그 때의 내가 뭘 한건지 알아보자.
먼저 구글에 Apple Bitcode를 검색하면
https://developer.apple.com/documentation/xcode/doing-basic-optimization-to-reduce-your-app-s-size
해당 Article이 나온다.
App Size랑 관련이 있나보다.
AppThinning 과정을 통해 App Size를 줄이고, 해당 과정에는 크게 3가지 구성 요소가 있다.
- App Slicing
- on-Demand Resources
- Bitcode
App Slicing
App Slicing은 말 그대로 앱을 각 기기별 아키텍처를 대상으로 App Variant을 만드는 과정이다.
이렇게 되면 사용자가 앱스토어에서 앱을 다운받을 때 앱의 모든 리소스를 받을 필요 없이,
필요한 리소스만 다운받게 되므로써 앱이 차지하는 용량을 줄일 수 있다.
관련해서 쉽게 접근할 수 있는 것이 에셋에 이미지 소스를 추가할 때 볼 수 있었던 1x, 2x, 3x의 개념이다.
앱이 설치될 때 세개의 소스 데이터가 전부 앱에 추가되는 것이 아닌 필요한 소스만 추가된다.
on-Demand Resources
앱을 실행하고 사용하는 과정에서 필요한 자원만 App Store에서 호스팅되어 제공한다.
설치되는 앱이 모든 리소스를 전부 가지고 있을 필요가 없기 때문에 작은 용량의 앱을 제공할 수 있게된다.
리소스를 메모리에서 관리되고, 필요가 없어진 리소스는 삭제한다.
on-Demand Resource에 해당되는 리소스에 태그를 할당하여 사용한다.
태그를 통해 앱을 설치할 때 함께 받아올 것인지, 필요한 순간에 받아올 것인지 등을 설정할 수 있다.
이미지 에셋에 잘 활용하면 앱의 크기를 효과적으로 줄일 수 있지 않을까 싶다.
Bitcode
Article 마지막 단락에 Bitcode에 대한 이야기가 나오는데 앱의 크기를 줄이기 위해 배포할 때 다시 컴파일되는 기술이라고 한다.
조금 자세히 보기 위해 다음 Document를 확인하자
https://help.apple.com/xcode/mac/11.0/index.html?localePath=en.lproj#/dev96dd5a6a3
Bitcode는 컴파일된 프로그램의 중간 단계에 해당된다.
비트코드가 포함된 앱(ENABLE_BITCODE = Yes)이 App Store Connect에 업로드 되면, 앱스토어에서 컴파일되고 연결(link)된다.
그러면 앱 스토어에 새 앱을 제출할 필요 없이 추후에 앱 바이너리를 다시 최적화할 수 있다.
AppThinning의 세 요소 중 가장 이해하는데 오래 걸렸다.
설명에는 앱의 새버전을 App Store에 제출할 필요 없이 바이너리를 다시 최적화한다고 하는데 이게 무슨 뜻인지 이해가 안됐다.
바이너리 데이터는 기계어 코드를 포함한다.
그럼 "바이너리 데이터는 컴파일의 결과물이다." 라고 먼저 이해하자.
애플은 항상 HW적, SW적 업데이트를 진행한다.
여기에는 우리가 작성한 코드를 바이너리 데이터로 만들어주는 컴파일러 등 여러 요소가 포함될 것이다.
따라서 그런한 업데이트가 진행될 때마다 우리의 앱 또한 최적화 시키는데 그때 사용되는 것이 Bitcode가 된다.
앞서 Bitcode는 컴파일의 중간단계라고 했다.
Bitcode를 사용하면, App Store Connect에서 App Store로 전달될 때,
Bitcode를 사용해 나머지 부분이 컴파일되며, 기기가 실제로 다운로드하는 것은 컴파일된 바이너리 데이터가 된다.
이 컴파일 과정에서 통해 불필요하거나, 호환되지 않는 프로세스 코드를 제거하는 등 바이너리 데이터를 다시 최적화(re-optimize) 시킨다.
때문에 우리는 애플의 여러 호환이 불가능할 정도의 내부 성능 향상이 아닌이상,
App Store에 새로운 앱을 제출할 필요도 없어지고, 바이너리를 다시 최적화 시킬 수 있는 것이다.
그리고 앞의 두 요소와 함께 앱의 크기를 줄일 수 있게된다.
결론
나는 이전에 ENABLE_BITCODE의 옵션을 No로 변경하면 Apple이 제공하는 앱의 최적화를 포기한 셈이다.
Reference
https://help.apple.com/xcode/mac/11.0/index.html?localePath=en.lproj#/devbbdc5ce4f
https://help.apple.com/xcode/mac/11.0/index.html?localePath=en.lproj#/devbbdc5ce4f
To see this page, you must enable JavaScript. Pour afficher cette page, vous devez activer JavaScript. Zur Anzeige dieser Seite müssen Sie JavaScript aktivieren. このページを表示するには、JavaScript を有効にする必要があります。
help.apple.com
// 정확하지 않은 정보가 있을 경우 댓글로 알려주시면 감사하겠습니다.
'iOS > iOS' 카테고리의 다른 글
[iOS] Tuist - 3. Target 생성 (0) | 2023.02.03 |
---|---|
[iOS] Tuist - 2. 프로젝트 파일 정리 (0) | 2023.02.02 |
[iOS] Tuist - 1. XcodeGen에서 Tuist로 (0) | 2023.02.02 |
[iOS] Swift Static Framework 만들기(Universal) - 1. 삽질 구간 (0) | 2022.07.16 |
[iOS] Swift Static Library 만들기(Device, Simulator) (0) | 2022.06.30 |