IPA包增大检测工具

随着版本不断迭代,各种新的业务代码不断被加入,IPA 包的体积也在不断增大。为了方便检测出两个版本之间安装包体积增大的原因,这里写了个小工具。

工具介绍

此工具有以下两个功能:

  1. 查看特定版本的 IPA 包中各个模块的代码体积占用大小
  2. 找到两个版本的代码体积增减变化的代码模块

使用方法

1. 安装好 python3

未安装的可通过以下命令安装:

1
brew install python3

2. 找到需要查看大小的版本的 Linkmap

在 BuildSetting 里找到 Write Link Map 并设置为 YES。然后先用 Xcode 对想查看的版本的代码编译一遍,然后 Linkmap 文件可从这里找到:

1
~/Library/Developer/Xcode/DerivedData/xxx/Build/Intermediates/xxx.build/Debug-iphoneos/xxx.build/xxx-LinkMap-normal-arm64.txt

3. 下载附件,通过下面命令运行:

1
python3 ./calc_size.py

然后按提示选择需要的功能即可,等出现“完成”时,会在 Linkmap 所在目录下新增一个以 xxx-result.txt 命名的文件用于结果的输出。

原理

最后再介绍下工具的原理,通过上面的使用方法可以得知其中利用了编译产生的 LinkMap。这里主要用到了 LinkMap 文件中的 2 个模块:

  1. Object files
  2. Symbols

其中在 Object files 中记录了编译产生的对象(.o)以及其编号,例如:

1
2
3
4
5
# Object files:
[ 0] linker synthesized
[ 1] /Users/welkinxie/Library/Developer/Xcode/DerivedData/QQKSong/Build/Products/Debug-iphoneos/xxx/xxx.a(xxx-xxx.o)
[ 2] /Users/welkinxie/Documents/QQKSong/xxxSDK/xxx.a(xxx.o)
[ 3] /Users/welkinxie/Library/Developer/Xcode/DerivedData/QQKSong/Build/Intermediates.noindex/QQKSong.build/Debug-iphoneos/QQKSong.build/Objects-normal/arm64/xxx.o

而在 Symbols 中则记录了所有对象(.o)中方法等占用空间的大小及其对象的编号:

1
2
3
4
5
# Symbols:
# Address Size File Name
0x100006B60 0x0000012C [ 1] -[XXX url]
0x100006C8C 0x00000034 [ 2] -[XXXCell isXXX:]
0x100006CC0 0x00000034 [ 3] -[XXX init]

从而将每个编号下所有的方法大小相加,然后通过编号与对象的映射关系,就能得出每个对象所占用的空间大小,最后将两个版本的对象大小相减即可定位到代码体积发生变化的模块了。

📎附件在这