Slicing — е механизъм на App Thinning, при който App Store автоматично създава няколко варианта на двоичния файл, всеки съдържащ ресурси само за конкретен модел устройство. Според Apple Developer Documentation, 2026, 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).
Компилаторът на Xcode създава fat binary с няколко архитектури (armv7, arm64, arm64e), но не премахва ресурси — всички изображения за всички резолюции остават вътре в .app. Slicing отива по-далеч: анализира Asset Catalogs, Metal шейдъри и Swift библиотеки, премахвайки от всяка резка това, което не е необходимо за конкретна цел. Например от резката за iPhone SE не влиза @3x графика, а от резката за iPad Air — iPhone-специфични контролери (ако са отделени в отделни ресурси).
Процесът на 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, но дава най-голям принос за намаляване на размера на изтегляне. 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 създава отделни резки по няколко измерения: архитектура на процесора, размер на екрана (резолюция), версия на 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 е минимална — основната конфигурация се извършва чрез Asset Catalogs и Build Settings. Asset Catalog трябва да съдържа ресурси, организирани по типове устройства (Any, iPhone, iPad, Apple Watch, Apple TV) с правилно посочване на скала и режим на показване. Xcode автоматично включва в компилацията само онези ресурси, които съответстват на целевите устройства, посочени в настройките на Deployment Target.
Ключовата настройка на Slicing в Xcode — Build Setting App Thinning. Налични стойности:
Targeted Device Families в General → Deployment Info определя за какви типове устройства се компилира приложението (iPhone / iPad / Universal). Slicing разчита на този параметър при рязане — ако приложението поддържа само iPhone, резка за iPad не се създава. Deployment Target (минимална версия на iOS) също влияе на Slicing: за стари версии на iOS може да са необходими armv7 резки, които не са нужни за iOS 13+. Apple препоръчва задаване на Deployment Target на най-новата стабилна версия на iOS — това намалява броя на резките и размера на двоичния файл.
За максимална ефективност на 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 ориентация.
# Експорт на резка за конкретно устройство
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 издава предупреждение.
След качване на архива в 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 поради неправилна конфигурация.
# Анализ на размера на резката
app-size -m "sliced/App.app" \
--format json
App-size извежда JSON отчет с разбивка по категории ресурси. Ако Slicing е конфигурирано правилно, в секцията „images” ще има само един набор скала (@2x или @3x), а не всички варианти. Грешка в конфигурацията на Asset Catalogs се проявява в това, че всички скали (@1x, @2x, @3x) присъстват в резката — това означава, че Xcode не е успял да определи целевото устройство за тези изображения и Slicing не е проработило.
Често задавани въпроси
Да, TestFlight също поддържа Slicing. Когато тестер изтегли приложението чрез TestFlight, сървърът на Apple доставя резка, оптимизирана за устройството на тестера. App Store Connect автоматично обработва Slicing за всички дистрибуции, включително TestFlight, с изключение на Enterprise и Ad Hoc сборки.
Да, в Asset Catalogs за всяко изображение могат да се премахнат отметките за определени типове устройства. Xcode позволява в Attributes Inspector да се посочи за кои Idiom (iPhone, iPad, Apple Watch, Mac) и скали ресурсът трябва да бъде включен. Ако ресурсът е необходим на всички устройства, използвайте Universal с произволна скала.
Персонализираните рамки (.framework) също участват в Slicing, ако са компилирани като XCFramework (с няколко архитектури). App Store включва в резката само онази архитектура на рамката, която съответства на целевото устройство. Статичните библиотеки (.a) не подлежат на Slicing — те се вграждат в двоичния файл изцяло.
Xcode Organizer показва estimated size — прогнозен размер без отчитане на действителното рязане на сървърите на Apple. App Store Connect показва реалния размер след Slicing, който може да бъде с 10-15% по-малък от прогнозния, тъй като сървърът прилага допълнителни оптимизации (алгоритми за компресия LZFSE, Zstandard), недостъпни локално.
Да, Slicing е напълно съвместимо със SwiftUI. Asset Catalogs се използват от SwiftUI чрез типовете Image, Color, SymbolImage. Slicing се прилага към векторни и растерни изображения, символи на SF Symbols и Metal шейдъри, независимо дали за изграждане на интерфейса се използва SwiftUI или UIKit.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също