Tron 是一个简单的命令行 Swift 工具,它可以大致估算一组 Swift 包和 Cocoapod 的下载和安装大小的贡献。
通常,我们会向应用程序添加一个新的成员(依赖项),它可以帮助我们完成很多事情。 由于这也会增加二进制文件的大小,并且考虑到二进制文件的大小始终与用户所经历的下载/安装体验相关,因此值得探索其贡献。 这种分析在很多方面对我们有帮助。
$ git clone https://github.com/chiragramani/Tron
$ cd Tron
$ swift build -c release
$ cd .build/release
$ swift run Tron <path_to_tron_config_json_file> // follow the steps mentioned under "Run" below.
swift run Tron <path_to_tron_config_json_file>
。 Tron 配置文件示例Swift 5.3 或更高版本
Xcode 12.0 或更高版本
如果测量 pods 的贡献,则应安装 cocoapods。
如果测量对下载大小的影响,
Swift 在 Swift 5.0 🎉 发布时变得 ABI 稳定。 因此,如果部署目标是 macOS 10.14.4、iOS 12.2、tvOS 12.2、watchOS 5.2 及更高版本,则应用程序不再需要与 Swift 运行时库一起分发,从而减小下载大小。 但是,如果您想支持早期版本,那么 Swift 运行时将与您的应用程序二进制文件捆绑在一起。 对于早期版本,重要的是了解引入的 libswift 动态库及其在探索特定依赖项时的各自贡献。 有关 ABI 稳定性的更多信息,请参阅此篇出色的 swift.org 文章 - ABI 稳定性和更多。
例如
请注意: 即使在添加依赖项之前,您的应用程序可能已经添加了上面所有或其中的一些 dylibs,因此请考虑现有状态。 例如,如果您已经在应用程序中导入了 CoreLocation - 那么 libswiftCoreLocation.dylib 将不是新增的,因此可以从报告的 dylibs 的总贡献中减去其约 ~=730 KB 的贡献。
该方法深受 Google Cocoapods-size 的启发,并执行以下操作
Testflight 报告的大小与遵循上述方法计算的结果非常接近(在 3% 的范围内)。 就本地分析而言,上述方法提供了一个不错的 ballpark。 一旦 IPA 上传,就会发生很多事情 - App Store 服务器将根据您应用程序的配置考虑 bitcode 和应用程序瘦身。 在应用多种优化后,服务器还会应用必要的加密以及许多其他步骤,然后才能将应用程序交付给用户。 因此,用户看到的大小与此工具报告的大小之间的差异会有所不同。
tuist/XcodeProj | swift-argument-parser
如果您遇到任何问题,请提交 git issue。 请包括
swift --version
)git tag
获取所有发布版本的列表,或使用 git log
获取特定 commit sha)Tron 在 MIT 许可下获得许可。 有关更多信息,请参见 LICENSE。
MIT License
Copyright (c) 2021 Chirag Ramani
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.