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 МБ для мобильной загрузки), пайплайн выдаёт предупреждение.
После загрузки архива в 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також