sizeledger
显示 iOS 应用的每一兆字节来自哪里:按类别、framework、asset catalog、语言和架构划分。
许可证: MIT
测试: 159测量日期:
测量方法
swift test in a fresh clone at tag v0.1.10 on a Mac (Apple silicon, Apple M5 Max, macOS 27.0.1), Swift 6.4: 159 tests (134 SizeLedgerKit, 25 CLI), 158 passed and 1 skipped because it needs a non-UTF-8 file name and runs on Linux only
摘要
- sizeledger 读取 .ipa、.app 或 .xcarchive,并按类别、framework、语言和 CPU 架构显示其字节分布。
- 它只读取文件:从不构建、运行、上传或更改应用,并在 macOS 和 Linux 上给出相同的报告。
- 它将三种大小区分开:文件总和、以 4 KiB 块计算的安装估算值,以及 .ipa 内部的压缩大小。
- ZIP 读取器、DEFLATE 解码器和 Mach-O 解析器都用 Swift 编写,因此 SizeLedgerKit 库没有任何依赖。
- 它不给出 App Store 的下载大小,截至 0.1.10,diff 和 budget 命令仍处于计划阶段,尚未发布。
将 sizeledger 指向一个 .ipa、.app 或 .xcarchive,它会显示应用的字节分布在哪里:按类别、按 framework 和资源、按语言和按 CPU 架构。它将三种大小区分开(文件总和、以整数个 4 KiB 块计算的安装大小估算值,以及对 .ipa 而言的压缩大小),并不声称知道 App Store 的下载大小。它只读取文件,使用自己实现的 ZIP、DEFLATE 和 Mach-O 读取器,因此不会构建、运行、上传或更改任何内容,在 macOS 和 Linux 上表现一致。SizeLedgerKit 为 Swift 程序提供相同的报告。
功能特性
- 整个应用用一张表呈现:主执行文件、framework 和 dylib、app extension、App Clip、watch app、本地化、asset catalog、代码签名以及其余所有内容;各类别总和始终等于总大小
- 每个 framework 和 extension 各占一行,每种 .lproj 语言会在应用及其所有 framework 范围内汇总
- 每个二进制文件的架构切片:哪些二进制文件是 universal 的,以及每个切片占用多少空间;JSON 中还包含 segment 大小和 Swift 元数据
- 将三种大小区分开:文件总和、以整数个 4 KiB 块计算的安装大小估算值,以及对 .ipa 而言的压缩大小
- 一个终端表格、用于 pull request 或 job summary 的 Markdown,以及键顺序固定的 JSON 报告
- 将输入视为不可信:对文件数、深度、声明的字节数和压缩比设有上限,并在输出中替换终端转义序列、双向覆盖字符和不可见字符
- SizeLedgerKit 是一个带有 DocC 文档且无依赖的 Swift 库:ZIP 读取器、DEFLATE 解码器和 Mach-O 解析器都是它的一部分
快速开始
1sizeledger analyze path/to/MyApp.ipa安装
Homebrew (macOS, Linux)
1brew install muhittincamdali/tap/sizeledgerFrom source
1git clone https://github.com/muhittincamdali/sizeledger.git && cd sizeledger && swift build -c releaseSwift package (product SizeLedgerKit)
1.package(url: "https://github.com/muhittincamdali/sizeledger", from: "0.1.10")截图

时间线
仓库开放并发布 0.1.0:sizeledger analyze 以及拥有自己的 ZIP、DEFLATE 和 Mach-O 读取器的 SizeLedgerKit 库
0.1.1 到 0.1.5:九种语言的 README、受限的 Mach-O 头部读取、拒绝 .xcarchive 中的符号链接,以及针对特意构造输入的限制(--max-files、--max-bytes、--max-ratio、--max-depth)
0.1.6 到 0.1.8:Sanitize.text 变为 public,输出中替换了更多不可见字符,路径的拆分和比较改为基于字节
0.1.9 和 0.1.10:重叠的 .ipa 条目会被当作损坏拒绝,--out 不再通过指向文件的链接写入,新增 --force 标志