Tron 是一个简单的命令行 Swift 工具,它可以大致估算一组 Swift 包和 Cocoapod 的下载和安装大小的贡献。

为什么测量依赖项的贡献很重要?

通常,我们会向应用程序添加一个新的成员(依赖项),它可以帮助我们完成很多事情。 由于这也会增加二进制文件的大小,并且考虑到二进制文件的大小始终与用户所经历的下载/安装体验相关,因此值得探索其贡献。 这种分析在很多方面对我们有帮助。

  1. 它可以大致了解应用程序大小的增加。 如果大小的增加令人惊讶,它又提供了一个机会来协作并探索是否有办法获得依赖项的精简版本,或者探索其他依赖项等等。
  2. 它可以帮助我们推断相似的依赖项在二进制文件大小方面的各自贡献。
  3. Peter Reinhardt 撰写了一篇精彩的文章,讨论了“移动应用大小对下载的影响”。 请参阅文章,了解更多关于安装率等方面的影响。

安装

$ 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.

运行

  1. 更新 tronSampleConfig.json,其中包含您要探索的依赖项的信息。(Swift 远程 + 本地包以及远程 + 本地 pods。)
  2. 然后运行 swift run Tron <path_to_tron_config_json_file>Tron 配置文件示例

Screenshot 2021-03-01 at 3 59 56 AM

系统要求

常见问题

为什么我们必须在配置文件中提及最低部署目标版本? (ABI 稳定性)

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 的启发,并执行以下操作

  1. 将基线应用程序归档为 ARM64,不带 bitcode。
  2. 添加所需的依赖项。
  3. 将基线应用程序归档为 ARM64,不带 bitcode。
  4. 计算差异并报告各自的贡献。

Testflight 报告的大小与遵循上述方法计算的结果非常接近(在 3% 的范围内)。 就本地分析而言,上述方法提供了一个不错的 ballpark。 一旦 IPA 上传,就会发生很多事情 - App Store 服务器将根据您应用程序的配置考虑 bitcode 和应用程序瘦身。 在应用多种优化后,服务器还会应用必要的加密以及许多其他步骤,然后才能将应用程序交付给用户。 因此,用户看到的大小与此工具报告的大小之间的差异会有所不同。

使用的库

tuist/XcodeProj | swift-argument-parser

推荐

报告任何问题

如果您遇到任何问题,请提交 git issue。 请包括

许可证

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.