App Thinning 是 Apple 的一项技术,通过仅交付用户特定设备所需的资源来减少已安装应用程序的大小。根据 Apple Developer Documentation, 2026,App Thinning 包含三种机制:Slicing、Bitcode 和 On-Demand Resources。让我们探讨每个组件及其对分发大小的影响。
要点
App Thinning 是 Apple 随 iOS 9(2015 年 9 月)推出的一项全面的 iOS 应用分发优化技术。App Thinning 的目标是在不更改源代码和功能的情况下,最小化用户下载到其设备上的应用大小。该技术在三个层面工作:构建阶段(编译)、App Store 端(交付)和设备端(资源管理)。
在 App Thinning 出现之前,开发人员会将所有可能设备的资源包含在二进制文件中 — @2x 和 @3x 图像、32 位和 64 位代码、用于不同 GPU 的 Metal 着色器。这导致应用体积膨胀:拥有 Retina HD 显示屏的 iPhone 6 Plus 用户会收到从未使用的 iPad Pro 矢量资源。Apple 通过将部分构建工作转移到 App Store 服务器解决了这个问题。
根据 Apple 的研究(WWDC 2015,Session 412),支持多种架构和分辨率的典型应用在应用 App Thinning 后可以缩小30-50%。对于拥有大量高细节纹理的游戏,节省可达 70-80%。Apple 不断改进该技术:在 iOS 17 中增加了对 ARM64e 的优化,并改进了使用 Swift Package Manager 的应用的 On-Demand Resources 功能。
移动应用的体积不断增长。根据Sensor Tower (2025) 的数据,iOS 应用的平均大小在过去 5 年中增长了 45%。对于数据套餐有限或网速较慢的用户,每个兆字节都很重要。App Thinning 在无需开发人员参与的情况下解决了这个问题 — 只需在项目设置中启用支持并将构建上传到 App Store Connect 即可。
App Thinning 过程始于将应用存档上传到 App Store Connect 之后。App Store 分析二进制文件并根据架构(armv7、arm64、arm64e)、屏幕分辨率(iPhone、iPad)和 iOS 版本将其分割成段。每个组合都会创建一个单独的变体。当用户点击“下载”时,App Store 会确定设备型号、iOS 版本和连接类型(Wi-Fi / 蜂窝网络),并仅发送相应的变体。
对用户来说,该过程是透明的 — 没有“精简版”选择或设置对话框。App Store 会根据下载请求时发送到服务器的设备元数据自动选择最合适的变体。如果设备使用 Wi-Fi,App Store 可以发送具有更高质量资源的变体(例如,iPhone 16 Pro 的 ProRes 视频)。通过蜂窝网络下载时,使用最小可能的资源集。
第二个优化级别 — Bitcode。启用 ENABLE_BITCODE 选项后,Xcode 不会将应用编译为机器码,而是编译为 LLVM 中间表示。App Store 会针对用户特定的处理器架构重新编译 Bitcode,使 Apple 能够为新世代芯片(A17、M4)应用编译器优化,而无需开发人员更新应用。Bitcode 对于 watchOS 和 tvOS 是强制性的,但对于 iOS 是可选的。
App Thinning 由三个独立的机制组成,每个机制负责优化中的一个方面。Slicing(切片)根据架构和屏幕分辨率将二进制文件分割成变体。开发人员通过 Asset Catalogs 配置 Slicing — Xcode 会自动在切片中只包含与目标设备匹配的资源。例如,iPhone SE(第三代)将只接收 @2x 图像和 arm64 代码,而 iPad Pro M4 将接收 @3x 图像和 arm64e 代码。
Bitcode 是 LLVM IR(中间表示)— 一种与机器无关的程序表示形式。启用 Bitcode 后,Xcode 不会生成最终机器码,而是保存中间表示。App Store Connect 在上传构建时接收 Bitcode,并将其重新编译为所有支持设备的架构。Bitcode 允许 Apple 应用开发人员在编译阶段无法获得的优化 — 例如,在 M4 芯片上使用新的处理器指令(SME、SVE)。
On-Demand Resources (ODR) — 第三个机制,允许在使用后卸载应用资源。开发人员使用 ODR 标签标记资源(游戏关卡、入门图像、视频)。iOS 在后台按需加载标记的资源,并在内存不足或使用后卸载它们。ODR 对于内容丰富的游戏特别有效 — 初始关卡可以在应用内交付,其余关卡随玩家进度加载。
App Thinning 机制的选择取决于应用类型及其目标受众。Slicing 建议始终启用 — 除了正确组织 Asset Catalogs 之外,不需要开发人员额外操作,并提供稳定的 20-30% 大小缩减。如果应用使用自定义 Metal 着色器或计划支持新的 Apple 架构而无需重新构建,则值得启用 Bitcode。ODR 适用于内容量大的应用 — 游戏、照片编辑器、流媒体应用。
对于典型的商业应用(数据源、表单、REST API),Slicing 和入门图像的最小 ODR 配置就足够了。游戏与 3D 图形受益于所有三种机制:Slicing 移除不必要的着色器,Bitcode 优化 GPU 渲染,ODR 卸载已完成的关卡。根据 Apple(WWDC 2024),三种机制的组合与通用二进制文件相比,平均将初始安装大小减少 45-55%。
| 机制 | 作用 | 工作位置 | 需要开发人员操作 |
|---|---|---|---|
| Slicing | 移除其他设备的资源 | App Store + 设备 | Asset Catalogs |
| Bitcode | 针对架构重新编译 | App Store | ENABLE_BITCODE=YES |
| ODR | 按需加载资源 | 设备 | 项目中的 ODR 标签 |
要在 Xcode 项目中启用 App Thinning,需要执行几个步骤。Slicing 通过构建设置中的 App Thinning 配置:Build Settings → App Thinning。有三个值可用:None(无优化)、Automatic(默认自动配置)和 Manual(选择特定变体进行测试)。Apple 建议大多数项目使用 Automatic。
对于Asset Catalogs,正确组织资源很重要:图像放置在通用目录中并指定宽度/高度,Xcode 会自动创建 @1x、@2x 和 @3x 变体。Xcode 在构建时只包含项目中使用的分辨率。Metal 着色器会针对每个 GPU 系列单独编译 — Apple GPU、PowerVR、Mali,这也通过 Asset Catalogs 管理。
Bitcode 通过 Build Settings 中的 ENABLE_BITCODE = YES 标志启用。对于 iOS,此标志是可选的(自 Xcode 14 起默认禁用),但对于 watchOS 和 tvOS 是强制性的。在使用第三方库的项目中启用 Bitcode 时,所有这些库也必须使用 Bitcode 构建,否则构建将失败并报错。Bitcode 将编译时间增加 20-30%,但确保与未来架构完全兼容。
上传到 App Store Connect 后,您可以在 Activity → Build Metric 部分检查切片的大小。App Store Connect 会显示不同设备的 Estimated App Store Size。对于本地检查,Xcode 提供带有 -exportArchive 标志和 thinning 选项的 xcodebuild 命令,用于在本地计算机上创建切片。Slicing 的结果可以在归档后在 Organizer(Window → Organizer)中查看 — App Thinning Profiles 选项卡显示不同设备的大小。
# 本地检查 Slicing
xcodebuild -exportArchive \
-archivePath "App.xcarchive" \
-exportPath "export/" \
-exportOptionsPlist "export.plist" \
-thinning "<thin-for-all-variants>"
Xcodebuild 使用 -thinning 标志为架构、位数和 GPU 的每种组合创建 .app 文件。<thin-for-all-variants> 参数创建所有可能的变体 — 便于检查。对于 CI 流水线,使用特定的组合,例如 iPhone14,4(iPhone SE 3)。生成的 .app 文件可以使用 app-size 工具进行分析。
App Thinning 的主要优势是减少下载大小,对最终用户而言。根据 Apple(WWDC 2024),使用所有三种 App Thinning 机制的典型应用通过蜂窝网络下载平均快 40%,占用的磁盘空间少 35%。这直接影响安装转化率:根据 Sensor Tower 的数据,应用大小每增加 10 MB,转化率就下降 1%。
第二个优势 — 得益于 Bitcode 的针对未来设备的优化。Apple 可以在无需开发人员参与的情况下将 Bitcode 应用重新编译为新架构。例如,在从 Intel 过渡到 Apple Silicon(M1)时,Bitcode 应用通过 Rosetta 2 在 macOS 上运行,无需额外编译。未启用 Bitcode 的开发人员被迫为 arm64 重新构建应用。
第三个优势 — ODR(On-Demand Resources)减轻了设备存储的负担。拥有数十个关卡的游戏,例如《狂野飙车 8: airborne》,使用 ODR 在玩家进度中加载新赛道。开发人员可以为与应用一起加载的资源设置 Initial Install Tags,为安装后在后台加载的内容设置 Prefetch Tags。Apple 控制 ODR 限制:每个请求最多 512 MB,设备上总缓存最多 20 GB。
App Thinning 有几个重要的限制,在设计应用时需要考虑。首先,Slicing 不适用于通过 Enterprise(in-house)或 Ad Hoc 分发的应用 — 这些构建包含所有变体,不经过 App Store。要测试 Slicing,开发人员可以使用 TestFlight,它也会在 Apple 服务器端处理 Slicing。
其次,Bitcode 将构建时间和 .xcarchive 存档大小增加约 30-50%。并非所有第三方库都支持 Bitcode — 如果至少有一个依赖项没有使用 Bitcode 构建,则使用 ENABLE_BITCODE 构建项目将失败。Apple 建议在启用 Bitcode 之前检查库的兼容性。此外,Bitcode 不完全支持 Swift Package Manager — 某些 Swift 包可能会破坏 Bitcode 构建。
第三,On-Demand Resources 不保证内容的即时可用性 — ODR 加载在后台进行,如果设备处于低电量模式或网络信号弱,可能会延迟。开发人员必须通过 NSBundleResourceRequest 实现 ODR 加载状态的处理,并向用户显示进度指示器。ODR 加载失败不应阻止应用功能 — 需要 graceful fallback。
常见问题
不,App Thinning 不是强制性的。没有 App Thinning 的应用将作为一个包含所有资源变体的单一通用二进制文件加载到 App Store。然而,Apple 强烈建议启用 App Thinning,因为它可以改善用户体验并减轻 App Store 服务器的负担。
Xcode Organizer 在归档后会显示不同设备的 Estimated App Store Size。App Store Connect 在 Activity 部分会在构建上传后显示精确的切片大小。对于本地检查,请使用带 -thinning 标志的 xcodebuild。
是的,App Thinning 与 SwiftUI 完全兼容。Slicing 与 Asset Catalogs 配合使用,SwiftUI 通过 Image 和 Color 使用它们。Bitcode 支持 SwiftUI 项目,前提是所有依赖项也使用 Bitcode 构建。ODR 通过 NSBundleResourceRequest 管理,独立于框架。
Slicing 不会影响启动时间 — 已删除的资源不会加载。由于 JIT 编译,Bitcode 可能会在首次启动时略微增加启动时间。如果带有 Initial Install Tags 的资源尚未加载,ODR 可能会增加启动时间。Apple 建议仅将关键重要资源标记为 Initial Install。
如果项目需要 Bitcode 但库不支持 — 有两种方法:从项目中移除该库并找到与 Bitcode 兼容的替代品,或者通过 Build Settings 中的 ENABLE_BITCODE 为特定 target 禁用 Bitcode。Apple 允许为 iOS 禁用 Bitcode,但 watchOS 和 tvOS 需要强制支持。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。