프로젝트에 이미지 파일을 넣을 때, 우리는 다음과 같이 3개의 파일을 Asset에 등록하고 있습니다

png 이미지를 넣으려면 @1x, @2x, @3x 사진을 넣어야한다는데 왜 이렇게 해야하는걸까요?
하나만 넣어서 잘쓰면 될거 같은데,
이미지 3개를 넣어버리는 바람에 앱의 크기만 너무 커지는거 아닐까요?
다행히 앱의 크기가 심각하게 비대해지는 일은 없습니다
앱스토어 커넥트는 기기와 운영체제에 맞춰 각 기기에 맞게 변형된 앱을 설치해주기 때문인데요
이런 기술이 어떻게 가능한걸까요?
⎮ App Thinning
App Thinning은 앱이 디바이스에 설치될 때, 앱스토어와 운영체제가 알아서 디바이스 특성에 맞게 앱이 설치되도록 하게 하는
최적화 기술입니다
덕분에 우리는 최소한으로만 디스크를 사용하고, 앱을 빠르게 다운로드 받을 수 있게 되었습니다
App Thinning은 슬라이싱(Slicing), 비트코드(BitCode), 온디맨드 리소스(On-Demand-Resoure). 이 3가지로 구분됩니다
⎮ 슬라이싱(Slicing)
Slicing은 iOS 9.0 이상을 실행하는 기기에서 적용됩니다
글의 서론에서 말씀드렸던 Asset의 예시가 바로 App Thinning에 해당합니다

슬라이싱은 다양한 대상 기기 및 운영 체제에 맞는 앱 변종(App variant)을 생성하고 제공하는 프로세스입니다
앱 변종이라는 말이 어색하니까 앱 종류라고 하겠습니다
사용자가 앱을 설치할 때 사용자 기기 및 운영 체제 버전에 맞는 적절한 앱을 시스템이 알아서 설치합니다
우리는 위 과정을 통해 필요한 것들만 담겨있는 앱 종류 중 하나(App varaint 중 하나)를 다운로드 받는 것이죠
위의 형태를 조금 더 정리된 그림으로 보자면 다음과 같습니다

앱에는 위와 같은 정보들이 들어 있습니다
작은 화면을 필요로 하는 iPhone13에서는 작은 사이즈의 이미지만 필요하고,
큰 화면을 필요로 하는 iPad에서는 비교적 큰 사이즈의 이미지가 필요합니다

위의 예시처럼 디바이스별로 필요한 요소들만 선별해서 변형시켜주고, 그 앱을 우리가 다운로드 받는 것이죠
⎮ 온디맨드 리소스(On - Demand - Resource)

온디맨드 리소스는 이미지나 사운드와 같이 키워드로 태그를 지정하고,
태그별로 그룹화하여 요청할 수 있는 리소스입니다
App Store는 Apple 서버에 리소스를 호스팅하고 다운로드를 관리하는데,
App Store는 온디맨드 리소스를 분할하여 앱의 다양한 버전을 더욱 최적화 합니다
유저가 앱을 탐색하는 동안 필요에 따라 온디맨드 리소스가 백그라운드에서 다운로드 되고,
운영체제가 더 이상 리소스가 필요하지 않다고 판단할 때(또는 디스크 공간이 부족할 때) 이 리소스를 제거하기도 합니다

위와 같이 기기에서 모든 데이터를 다 들고 있을 수도 있지만,

On-demand resources를 통해 우리가 필요할 때 Cloud 또는 App Store에서 데이터를 넘겨 받을 수도 있습니다
우리도 모르게 켜져있는 이 On Demand Resources가 최적화를 도와주고 있는 것이죠

이 내용도 세부 내용이 많으니,
Reference에 있는 On - Demand - Resource Guide를 정독해보셔도 좋을거 같습니다
⎮ 비트코드(Bit code)

* 예전에는 BuildSetting에도 Enable Bitcode 라는 항목이 있었지만, 최신 버전에는 없습니다
이러한 내용은 Xcode 14 Release Notes에서도 확인할 수 있습니다
Deprecations
Starting with Xcode 14, bitcode is no longer required for watchOS and tvOS applications, and the App Store no longer accepts bitcode submissions from Xcode 14.Xcode no longer builds bitcode by default and generates a warning message if a project explicitly enables bitcode: “Building with bitcode is deprecated. Please update your project and/or target settings to disable bitcode.” The capability to build with bitcode will be removed in a future Xcode release. IPAs that contain bitcode will have the bitcode stripped before being submitted to the App Store. Debug symbols can only be downloaded from App Store Connect / TestFlight for existing bitcode submissions and are no longer available for submissions made with Xcode 14. (86118779)
Xcode는 더 이상 기본적으로 비트코드를 빌드하지 않으며, 프로젝트에서 비트코드를 명시적으로 활성화하는 경우 "비트코드로 빌드하는 기능은 더 이상 지원되지 않습니다. 프로젝트 및/또는 타겟 설정을 업데이트하여 비트코드를 비활성화하십시오."라는 경고 메시지를 생성합니다. 비트코드로 빌드하는 기능은 향후 Xcode 릴리스에서 제거될 예정입니다. 비트코드가 포함된 IPA는 App Store에 제출되기 전에 비트코드가 제거됩니다. 디버그 심볼은 기존 비트코드 제출의 경우 App Store Connect/TestFlight에서만 다운로드할 수 있으며, Xcode 14로 제출된 경우에는 더 이상 사용할 수 없습니다
Xcode 14 Release Notes
사실상 지금은 앱을 완성된 Binary 형태로 제출하기 때문에 아래의 내용은 참고만 하시면 되겠습니다
비트코드는 기계어로 번역되기 이전의 중간 표현(IR)이라고 할 수 있습니다
Swift | ABI Stability - ABI 안정성
오늘은 호랑이 담배피던 시절 얘기를 해보겠습니다 Swift 5.0 이전의 환경은 버전이 바뀔 때마다 호환성 문제가 발생했습니다 버전이 바뀔때마다 ABI도 함께 변경되는 바람에 개발자의 고생이 늘
uddt.tistory.com
이전 포스팅에서 어셈블리 코드라는 용어를 스치듯이 다뤘는데요
비트코드가 어셈블리 코드인가? 할 수 있는데 어셈블리와는 또 다른 코드입니다
(무슨 코드가 이렇게 많은지...)
어셈블리 코드는 사람이 읽을 수 있는 형태의 저수준 언어이고,
비트코드는 LLVM(컴파일러 프레임워크)이 사용하는 중간표현(IR: Intermediate Representation)으로
기게어로 번역되기 전 플랫폼 독립적인 바이너리 코드입니다
Swift → SIL(Swift Intermediate Language) → LLVM Bitcode(중간단계) → Assembly → Machine Code 의 순서인데
그냥 쉽게 생각하시려면,
구버전(iOS 14 이전)의 경우 앱을 앱스토어에 업로드하거나 최적화할 때 비트코드를 사용했구나~ 하고 생각하시면 되겠습니다
⎮ 결론
앱이 디바이스에 설치될 때 App Thinning 시스템(슬라이싱, 주문형 리소스)을 통해 최적화된 앱을 사용자가 설치하게 된다
⎮ Reference
https://help.apple.com/xcode/mac/current/#/devbbdc5ce4f
https://help.apple.com/xcode/mac/current/#/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
https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes
Xcode 14 Release Notes | Apple Developer Documentation
Update your apps to use new features, and test your apps against API changes.
developer.apple.com
On-Demand Resources Guide: On-Demand Resources Essentials
On-Demand Resources Guide
developer.apple.com
https://clamp-coding.tistory.com/491
[iOS] App Thinning과 Bitcode에 대하여
App Thinning 앱이 디바이스에 설치될 때 앱스토어와 운영체제가 디바이스의 특성에 맞게 설치되도록 설치 최적화 기술입니다. iOS 9에서 도입된 기능으로 앱의 크기를 최적화 하고 사용자 기기에
clamp-coding.tistory.com
WWDC 2015에서 App Thinning 관련 내용을 소개한 적이 있습니다

바로 이 영상인데 지금은 애플에서 해당 영상을 비활성화 처리해서 확인할 수는 없는거 같습니다ㅠ
'Swift > TOPIC' 카테고리의 다른 글
| Swift | 초기화에는 시간이 얼마나 걸릴까? (0) | 2025.07.13 |
|---|---|
| Swift | UserDefaults는 어디에 저장될까? (+ PropertyWrapper) (1) | 2025.07.09 |
| Swift | ABI Stability - ABI 안정성 (2) | 2025.07.07 |
| Swift | @discardableResult (feat. Swift가 허락한 괴짜적 사고) (0) | 2025.07.03 |
| Swift | Raw Strings에 대하여(feat. 특수문자 처리반) (7) | 2025.07.01 |