본문 바로가기
Swift/TOPIC

Swift | iOS App 최적화 - App Thinning

by UDDT 2025. 7. 9.

 

   프로젝트에 이미지 파일을 넣을 때, 우리는 다음과 같이 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 Slicing

 

   슬라이싱은 다양한 대상 기기 및 운영 체제에 맞는 앱 변종(App variant)을 생성하고 제공하는 프로세스입니다

  앱 변종이라는 말이 어색하니까 앱 종류라고 하겠습니다

  사용자가 앱을 설치할 때 사용자 기기 및 운영 체제 버전에 맞는 적절한 앱을 시스템이 알아서 설치합니다

 

   우리는 위 과정을 통해 필요한 것들만 담겨있는 앱 종류 중 하나(App varaint 중 하나)를 다운로드 받는 것이죠

 

    위의 형태를 조금 더 정리된 그림으로 보자면 다음과 같습니다

   앱에는 위와 같은 정보들이 들어 있습니다

 

   작은 화면을 필요로 하는 iPhone13에서는 작은 사이즈의 이미지만 필요하고,

  큰 화면을 필요로 하는 iPad에서는 비교적 큰 사이즈의 이미지가 필요합니다

물론 예전에는 iPhone 6Plus가 가장 컸기 떄문에 3x iPhone 이미지를 사용한거 같네요

 

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

 

 온디맨드 리소스(On - Demand - Resource)

 

    온디맨드 리소스는 이미지나 사운드와 같이 키워드로 태그를 지정하고,

   태그별로 그룹화하여 요청할 수 있는 리소스입니다

 

    App Store는 Apple 서버에 리소스를 호스팅하고 다운로드를 관리하는데,

   App Store는 온디맨드 리소스를 분할하여 앱의 다양한 버전을 더욱 최적화 합니다

 

   유저가 앱을 탐색하는 동안 필요에 따라 온디맨드 리소스가 백그라운드에서 다운로드 되고,

   운영체제가 더 이상 리소스가 필요하지 않다고 판단할 때(또는 디스크 공간이 부족할 때) 이 리소스를 제거하기도 합니다

 

 

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

 

 

    On-demand resources를 통해 우리가 필요할 때 Cloud 또는 App Store에서 데이터를 넘겨 받을 수도 있습니다

 

    우리도 모르게 켜져있는 이 On Demand Resources가 최적화를 도와주고 있는 것이죠

 

    이 내용도 세부 내용이 많으니,
   Reference에 있는 On - Demand - Resource Guide를 정독해보셔도 좋을거 같습니다

 

 비트코드(Bit code)

https://needoneapp.medium.com/what-is-bitcode-in-ios-3913253cdff2

 

     * 예전에는 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)이라고 할 수 있습니다

 

    https://uddt.tistory.com/311

 

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

 

https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/index.html#//apple_ref/doc/uid/TP40015083

 

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 관련 내용을 소개한 적이 있습니다

 

     바로 이 영상인데 지금은 애플에서 해당 영상을 비활성화 처리해서 확인할 수는 없는거 같습니다ㅠ

 

최근댓글

최근글

skin by © 2024 ttuttak