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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также