Slicing: какво е, принцип на работа и връзка с App Thinning

Автор: IT Sectr Публикувано: 2026-04-17 Време за четене: 11 мин

Slicing — е механизъм на App Thinning, при който App Store автоматично създава няколко варианта на двоичния файл, всеки съдържащ ресурси само за конкретен модел устройство. Според Apple Developer Documentation, 2026, Slicing изключва от дистрибуцията ресурси за неподдържани конфигурации, намалявайки размера на инсталацията. Нека разгледаме принципа на работа, вариантите на рязане и проверката на резултатите.

Основни точки

  • Slicing — разделяне на двоичния файл на приложението на варианти за различни архитектури, резолюции и версии на iOS
  • App Store доставя на потребителя само ресурсите, съответстващи на неговото устройство
  • Asset Catalogs — основният инструмент на разработчика за управление на ресурсите, участващи в Slicing
  • GPU семейства (Apple GPU, PowerVR, Mali) също се вземат предвид при рязане на Metal шейдъри
  • Проверка на резките се извършва чрез Xcode Organizer и App Store Connect Build Metrics

Какво е Slicing

Slicing — е компонент на App Thinning, отговорен за създаването на варианти (резки) на двоичния файл на приложението от страна на App Store. Когато разработчикът качва универсален двоичен файл (fat binary), съдържащ код и ресурси за всички поддържани конфигурации, App Store го анализира и генерира няколко резки: отделно за iPhone с процесор A17, отделно за iPad с M4, отделно за Apple Watch. Всяка резка съдържа само онези фрагменти код и ресурси, които са необходими за тази конкретна комбинация от архитектура и резолюция.

Преди iOS 9 разработчиците ръчно създаваха отделни двоични файлове за различни устройства или доставяха универсален fat binary, който съдържаше всичко наведнъж. Slicing напълно автоматизира този процес: разработчикът подготвя един проект в Xcode, качва един архив в App Store Connect, а Slicing от страна на сървъра създава оптималния брой варианти. Потребителят никога не вижда процеса на рязане — той получава готов .app, оптимизиран за своето устройство.

Slicing се прилага не само към код и изображения, но и към Metal шейдъри. Apple GPU използва собствен набор от инструкции (Metal Shading Language), който се различава от инструкциите на PowerVR или ARM Mali. Slicing включва в резката само шейдъри за GPU семейството на целевото устройство. Това е особено важно за игри с персонализирани шейдъри — например високодетайлни ефекти на пост-обработка се компилират само за устройства с мощен GPU (iPad Pro M4, iPhone 16 Pro Max).

Разлика между Slicing и обикновена компилация за архитектура

Компилаторът на Xcode създава fat binary с няколко архитектури (armv7, arm64, arm64e), но не премахва ресурси — всички изображения за всички резолюции остават вътре в .app. Slicing отива по-далеч: анализира Asset Catalogs, Metal шейдъри и Swift библиотеки, премахвайки от всяка резка това, което не е необходимо за конкретна цел. Например от резката за iPhone SE не влиза @3x графика, а от резката за iPad Air — iPhone-специфични контролери (ако са отделени в отделни ресурси).

Как работи Slicing

Процесът на Slicing започва след качването на билда в App Store Connect и се състои от три етапа: анализ, рязане и опаковане. На етапа на анализ, сървърът на App Store разглобява двоичния файл, извлича от него информация за поддържаните архитектури, устройства, резолюции на екрани и версии на iOS. App Store използва картографиране на всички търговски модели на Apple към техните технически спецификации — базата данни с устройства (Device Database) се актуализира с всяко издание на iOS.

На етапа на рязане, сървърът създава отделни копия на двоичния файл за всяка уникална комбинация. За целта App Store извлича от Asset Catalogs изображения с конкретни тагове (idiom, subtype, scale), избира само тези, които съответстват на целевото устройство, и сглобява нов пакет ресурси. Стандартната библиотека на Swift също подлежи на рязане — от нея се премахват символи и методи, които не се използват от конкретното приложение (dead code stripping).

На етапа на опаковане, всяка резка се поставя в отделен дистрибуционен пакет и се свързва с метаданни — списък на моделите устройства, за които е предназначена тази резка. App Store при изтегляне на приложението от потребителя избира подходящата резка въз основа на модела устройство, версията на iOS и типа на връзката. Ако няма точно съвпадение, сървърът използва най-близката по спецификации резка. Apple съхранява всички варианти в CDN мрежата CloudKit за бърза доставка по целия свят.

Slicing в контекста на App Thinning

Slicing — е един от трите механизма на App Thinning, но дава най-голям принос за намаляване на размера на изтегляне. Bitcode отговаря за оптимизация на машинния код, On-Demand Resources — за управление на ресурсите на устройството, а Slicing — за премахване на излишните ресурси на етапа на дистрибуция. Без Slicing първите два механизма работят, но потребителите получават ресурси за всички устройства, което увеличава размера с 20-40% в зависимост от броя на Asset Catalogs.

Разликата между Slicing и Bitcode е в точката на приложение: Slicing работи на ниво ресурси (изображения, шейдъри, NIB файлове), Bitcode — на ниво машинен код. Slicing разделя кода по архитектури (arm64 vs arm64e), Bitcode позволява на Apple да прекомпилира кода за нови архитектури. Bitcode + Slicing заедно дават максимална оптимизация: Bitcode генерира код за конкретна архитектура, а Slicing премахва излишните ресурси за тази архитектура.

Връзка с On-Demand Resources — Slicing и ODR не се припокриват. Slicing решава кои ресурси изобщо ще влязат в дистрибуцията на устройството, а ODR управлява кога тези ресурси ще се заредят и освободят. Разработчикът може да маркира ресурс с ODR таг и Slicing ще го включи в резката, ако съответства на устройството. Apple препоръчва използването и на трите механизма едновременно за минимален размер на инсталацията.

МеханизъмОбект на оптимизацияКога се прилагаЕфект върху размера
SlicingРесурси (изображения, шейдъри)От страна на App StoreПремахва ~30% излишни ресурси
BitcodeМашинен кодПри изтегляне от потребителяОптимизация на кода за архитектура
ODRРесурси на устройствотоСлед инсталацияНамалява началния размер с 40-60%

Варианти на Slicing за различни устройства

Slicing създава отделни резки по няколко измерения: архитектура на процесора, размер на екрана (резолюция), версия на iOS и GPU семейство (за Metal). Архитектура определя набора от инструкции на CPU: arm64 — основен 64-битов набор (iPhone 5s — iPhone X), arm64e — разширен набор с поддръжка на Pointer Authentication и PAC (iPhone XS и по-нови, iPad Pro с A12X+). Резката за arm64e включва код с инструкции за защита на паметта, недостъпни на arm64 устройства.

Резолюция на екрана — второто ключово измерение на Slicing. Apple използва скали @1x (iPhone 3GS), @2x (iPhone 4 — iPhone SE 3), @3x (iPhone 6 Plus и по-нови) и специфични за iPad (2x и 3x с допълнителни метрики). Slicing включва в резката само изображения със скала, съответстваща на целевото устройство. При правилна организация на Asset Catalogs в Xcode това елиминира необходимостта от ръчно управление на наборите от ресурси — достатъчно е да добавите изображението в каталога, като посочите поддържаните типове устройства.

GPU семейство — третото измерение, критично за Metal приложения. Apple използва класификация на GPU по поколения: Apple GPU family 1 (A7), family 2 (A8), ... family 8 (M4). Metal шейдърите се компилират за всяко семейство отделно, тъй като наборът от инструкции на Metal Shading Language се разширява с всяко поколение GPU. Slicing включва в резката само шейдъри за GPU семейството на целевото устройство, което значително намалява размера на игри и приложения, използващи Metal за рендиране.

Влияние на архитектурата върху размера на резката

Архитектурата на CPU пряко влияе върху размера на резката: arm64e кодът съдържа допълнителни инструкции Pointer Authentication (PAC) и Signed Return Address, които увеличават двоичния файл с 5-10% в сравнение с arm64. Това увеличение обаче се компенсира от факта, че Slicing включва arm64e код само в резки за устройства с A12+ процесори. За iPhone SE (трето поколение) с A15 Bionic, Slicing създава отделна резка, оптимизирана за възможностите на този чип.

Настройка на Slicing в Xcode

Настройката на Slicing в Xcode е минимална — основната конфигурация се извършва чрез Asset Catalogs и Build Settings. Asset Catalog трябва да съдържа ресурси, организирани по типове устройства (Any, iPhone, iPad, Apple Watch, Apple TV) с правилно посочване на скала и режим на показване. Xcode автоматично включва в компилацията само онези ресурси, които съответстват на целевите устройства, посочени в настройките на Deployment Target.

Ключовата настройка на Slicing в Xcode — Build Setting App Thinning. Налични стойности:

  • None — Slicing е изключено, приложението се доставя като universal fat binary
  • Automatic — Xcode включва Slicing с настройки по подразбиране
  • Manual — разработчикът избира конкретни комбинации за Slicing
За публикуване в App Store използвайте Automatic. Ръчният режим е удобен за тестване на конкретни резки на локално устройство.

Targeted Device Families в General → Deployment Info определя за какви типове устройства се компилира приложението (iPhone / iPad / Universal). Slicing разчита на този параметър при рязане — ако приложението поддържа само iPhone, резка за iPad не се създава. Deployment Target (минимална версия на iOS) също влияе на Slicing: за стари версии на iOS може да са необходими armv7 резки, които не са нужни за iOS 13+. Apple препоръчва задаване на Deployment Target на най-новата стабилна версия на iOS — това намалява броя на резките и размера на двоичния файл.

Параметри на Asset Catalog за Slicing

За максимална ефективност на Slicing, Asset Catalogs трябва да използват специфични тагове за всеки ресурс. Xcode предоставя в Attributes Inspector за изображения: Width Class (Any, Compact, Regular), Height Class (Any, Compact, Regular), Gamut (sRGB, Display P3), Memory (Any, Low, High), Graphics (Any, Low, High). Комбинирайки тези тагове, разработчикът контролира в кои резки ще попадне всяко изображение. Например изображение за iPad с таг Regular Width + Regular Height ще попадне само в резки за iPad в landscape ориентация.

bash
# Експорт на резка за конкретно устройство
xcodebuild -exportArchive \
  -archivePath "App.xcarchive" \
  -exportPath "sliced/" \
  -exportOptionsPlist "export.plist" \
  -thinning "iPhone17,2" # iPhone 16 Pro Max

Xcodebuild с параметър -thinning и идентификатор на модел създава резка само за този модел. Списъкът с идентификатори може да се намери в Device Database на Apple (формат: iPhone17,2 — iPhone 16 Pro Max, iPad14,1 — iPad Pro 11 M4). Този метод е полезен за проверка на размера на резката преди изпращане в App Store Connect. CI/CD може да използва тази команда за автоматична верификация — ако размерът на резката надвишава лимита (например 100 MB за мобилно изтегляне), pipeline издава предупреждение.

Проверка на резултатите от Slicing

След качване на архива в App Store Connect, Apple предоставя подробна статистика за размерите на резките. App Store Connect → Activity → изберете билд → App Thinning — показва Estimated App Store Size за всяка категория устройства: iPhone, iPad, Apple Watch, tvOS. Размерите са разделени по версии на iOS и типове процесори. Ако някоя резка надвишава очаквания размер, App Store Connect я маркира с жълто предупреждение.

Локална проверка чрез Xcode Organizer: след архивиране отворете Window → Organizer, изберете архива и натиснете App Thinning Profiles. Xcode ще покаже размерите за всяка възможна резка въз основа на текущата конфигурация на проекта. Също така е налична опция Export за създаване на IPA с конкретен профил на Slicing. Xcode генерира .app-thinning.plist с информация за това кои ресурси са влезли във всяка резка.

За автоматизация на проверката на Slicing в CI/CD използвайте xcodebuild с -thinning и анализирайте размера на създадените .app файлове. Apple предоставя командната помощна програма app-size (инсталира се чрез Xcode Command Line Tools), която извежда подробен отчет: размер на кода, размер на ресурсите по категории (изображения, шейдъри, NIB), размер на Swift библиотеките. Сравнението на размерите на резките преди и след оптимизация на Asset Catalogs помага да се идентифицират ресурси, които не участват в Slicing поради неправилна конфигурация.

bash
# Анализ на размера на резката
app-size -m "sliced/App.app" \
  --format json

App-size извежда JSON отчет с разбивка по категории ресурси. Ако Slicing е конфигурирано правилно, в секцията „images” ще има само един набор скала (@2x или @3x), а не всички варианти. Грешка в конфигурацията на Asset Catalogs се проявява в това, че всички скали (@1x, @2x, @3x) присъстват в резката — това означава, че Xcode не е успял да определи целевото устройство за тези изображения и Slicing не е проработило.

Често задавани въпроси

Влияе ли Slicing на приложения, разпространявани чрез TestFlight?

Да, TestFlight също поддържа Slicing. Когато тестер изтегли приложението чрез TestFlight, сървърът на Apple доставя резка, оптимизирана за устройството на тестера. App Store Connect автоматично обработва Slicing за всички дистрибуции, включително TestFlight, с изключение на Enterprise и Ad Hoc сборки.

Може ли да се изключи Slicing за конкретен ресурс?

Да, в Asset Catalogs за всяко изображение могат да се премахнат отметките за определени типове устройства. Xcode позволява в Attributes Inspector да се посочи за кои Idiom (iPhone, iPad, Apple Watch, Mac) и скали ресурсът трябва да бъде включен. Ако ресурсът е необходим на всички устройства, използвайте Universal с произволна скала.

Как Slicing работи с персонализирани рамки?

Персонализираните рамки (.framework) също участват в Slicing, ако са компилирани като XCFramework (с няколко архитектури). App Store включва в резката само онази архитектура на рамката, която съответства на целевото устройство. Статичните библиотеки (.a) не подлежат на Slicing — те се вграждат в двоичния файл изцяло.

Защо размерът на App Store билда се различава от размера в Xcode Organizer?

Xcode Organizer показва estimated size — прогнозен размер без отчитане на действителното рязане на сървърите на Apple. App Store Connect показва реалния размер след Slicing, който може да бъде с 10-15% по-малък от прогнозния, тъй като сървърът прилага допълнителни оптимизации (алгоритми за компресия LZFSE, Zstandard), недостъпни локално.

Поддържа ли Slicing SwiftUI ресурси?

Да, Slicing е напълно съвместимо със SwiftUI. Asset Catalogs се използват от SwiftUI чрез типовете Image, Color, SymbolImage. Slicing се прилага към векторни и растерни изображения, символи на SF Symbols и Metal шейдъри, независимо дали за изграждане на интерфейса се използва SwiftUI или UIKit.

Обобщение

  • Slicing — механизъм за рязане на двоичния файл от страна на App Store, премахващ излишни ресурси за конкретно устройство
  • Три измерения на рязане: архитектура на CPU (arm64/arm64e), разделителна способност на екрана (@2x/@3x) и GPU семейство (Metal)
  • Asset Catalogs — основният инструмент за управление на ресурсите, участващи в Slicing
  • App Store доставя само ресурсите, които съответстват на модела устройство, версията на iOS и типа връзка
  • Xcode Organizer и App Store Connect показват размерите на резките за всички поддържани конфигурации
  • App-size инструмент от Xcode CL Tools позволява проверка на ефективността на Slicing в CI/CD
  • TestFlight също поддържа Slicing, за разлика от Enterprise и Ad Hoc дистрибуция

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също