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 对其进行分析并生成多个切片:分别适用于配备 A17 处理器的 iPhone、配备 M4 的 iPad、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 编译器创建包含多个架构(armv7、arm64、arm64e)的 fat binary,但不会删除资源——所有分辨率的图像都保留在 .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 标准库也经过切割——从中删除特定应用程序未使用的符号和方法(死代码剥离)。

打包阶段,每个切片被放入单独的分发包中,并与元数据关联——该切片适用的设备型号列表。当用户下载应用程序时,App Store 根据设备型号、iOS 版本和连接类型选择合适的切片。如果没有完全匹配,服务器将使用规格最接近的切片。Apple 将所有变体存储在 CloudKit CDN 网络中,以便在全球范围内快速交付。

App Thinning 上下文中的 Slicing

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 及更新机型、配备 A12X+ 的 iPad Pro)。arm64e 的切片包含 arm64 设备上不可用的内存保护指令代码。

屏幕分辨率 — Slicing 的第二个关键维度。Apple 使用 @1x(iPhone 3GS)、@2x(iPhone 4 — iPhone SE 3)、@3x(iPhone 6 Plus 及更新机型)以及 iPad 特定的缩放比例(2x 和 3x,附带额外指标)。Slicing 仅将具有与目标设备匹配的缩放比例的图像包含在切片中。通过在 Xcode 中正确组织 Asset Catalogs,这消除了手动管理资源集的需求——只需将图像添加到目录中,指定支持的设备类型即可。

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 指令,这使得二进制文件比 arm64 大 5-10%。然而,这种增加被 Slicing 仅将 arm64e 代码包含在配备 A12+ 处理器的设备的切片中这一事实所抵消。对于配备 A15 Bionic 的 iPhone SE(第三代),Slicing 创建了一个针对该芯片功能优化的单独切片。

在 Xcode 中配置 Slicing

在 Xcode 中配置 Slicing 是最小化的——主要配置通过 Asset Catalogs 和 Build Settings 完成。Asset Catalog 应包含按设备类型(Any、iPhone、iPad、Apple Watch、Apple TV)组织的资源,并正确指明缩放比例和显示模式。Xcode 自动仅在编译中包含与 Deployment Target 设置中指定的目标设备匹配的资源。

Xcode 中的关键 Slicing 设置 —— Build Setting App Thinning。可用值:

  • None — Slicing 禁用,应用程序作为通用 fat binary 提供
  • Automatic — Xcode 以默认设置启用 Slicing
  • Manual — 开发人员选择特定组合进行 Slicing
在 App Store 发布时使用 Automatic。Manual 模式用于在本地设备上测试特定切片。

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 Catalog 参数

为了最大程度地提高 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)。通过组合这些标签,开发人员控制每个图像将进入哪些切片。例如,带有 Regular Width + Regular Height 标签的 iPad 图像将仅进入横向方向 iPad 的切片。

bash
# 导出特定设备的切片
xcodebuild -exportArchive \
  -archivePath "App.xcarchive" \
  -exportPath "sliced/" \
  -exportOptionsPlist "export.plist" \
  -thinning "iPhone17,2" # iPhone 16 Pro Max

Xcodebuild 使用 -thinning 参数和型号标识符仅为此型号创建切片。标识符列表可以在 Apple Device Database 中找到(格式:iPhone17,2 — iPhone 16 Pro Max,iPad14,1 — iPad Pro 11 M4)。此方法可用于在发送到 App Store Connect 之前检查切片大小。CI/CD 可以使用此命令进行自动验证——如果切片大小超过限制(例如,移动下载为 100 MB),管道会发出警告。

检查 Slicing 结果

将存档上传到 App Store Connect 后,Apple 提供有关切片大小的详细统计信息。App Store Connect → Activity → 选择 build → App Thinning — 显示每个设备类别的 Estimated App Store Size:iPhone、iPad、Apple Watch、tvOS。大小按 iOS 版本和处理器类型细分。如果某个切片超过预期大小,App Store Connect 会用黄色警告标记它。

通过 Xcode Organizer 进行本地检查:存档后,打开 Window → Organizer,选择存档并单击 App Thinning Profiles。Xcode 将根据当前项目配置显示每个可能切片的大小。还提供 Export 选项,用于创建具有特定 Slicing 配置文件的 IPA。Xcode 生成 .app-thinning.plist 文件,其中包含有关哪些资源进入每个切片的信息。

要自动化 CI/CD 中的 Slicing 检查,请使用带有 -thinning 的 xcodebuild 并分析创建的 .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)作为 XCFramework(包含多个架构)编译,它们也会参与 Slicing。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 通过 Image、Color、SymbolImage 类型被 SwiftUI 使用。无论使用 SwiftUI 还是 UIKit 构建界面,Slicing 都适用于矢量图像、光栅图像、SF Symbols 符号和 Metal 着色器。

总结

  • 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 中的工具允许在 CI/CD 中检查 Slicing 效率
  • TestFlight 也支持 Slicing,与 Enterprise 和 Ad Hoc 分发不同

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读