首页 > 解决方案 > 如何从 macOS 应用程序包中排除标准但未使用的 libswift*.dylib 并减小包大小

问题描述

当我使用 Xcode 9 构建用 Swift 4 编写的简单菜单栏可可应用程序时,许多 libswift*.dylib 库被链接/下载/嵌入到 .app 包中,进入 Frameworks 文件夹,如下所示:

libswift

我只在我的项目中使用import Cocoaandimport Foundation和一些 @objc 函数作为定时器函数的选择器。我真的不认为我非常简单的菜单栏应用程序需要一些 3D 渲染 Metal 库函数或任何 SwiftOnoneSupport,所以我希望将它们从 .app bundle 中删除。(相同的库也包含在帮助应用程序中以在登录功能时启动,这使得帮助应用程序甚至超过 10 MB)

我原以为 Xcode 实际上只会复制默认情况下需要的任何内容。这里这里都提出了一些类似的问题,但我认为这两个问题都没有令人满意的最新答案。

到目前为止我尝试过的

我设置ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIESNO. Build Settings它似乎没有任何效果。

我设置LINK_WITH_STANDARD_LIBRARIESNO. Build Settings即使我尝试在链接框架和库部分下自行添加一些框架(Cocoa、Foundation),它也破坏了一切并且无法构建它。

标签: xcodemacosoptimizationframeworksdylib

解决方案


简而言之,不可能排除 Swift 自动包含在应用程序中的标准库并期望它能够工作。目前,任何使用 Swift 创建的应用程序都捆绑了自己的 Swift 动态库版本。Swift 并不存在于操作系统上,而是存在于每个应用程序包中。这意味着任何使用 Swift 4.1 的应用程序,例如 Swift 4.1 动态库(包含 4.1 ABI)中的捆绑包,等等。

Swift 项目路线图上的一件事是最终拥有ABI 稳定性。如果 Swift 成为 ABI Stable,Swift 将存在于操作系统中,并且它的 ABI 将与 Swift 的每个版本兼容。


推荐阅读