iOS应用程序的二进制大小

4
我有一个iOS应用程序,使用了许多不同的静态库和框架(一些是第三方的)。我想要能够将静态库、框架和应用代码对最终应用程序二进制文件的贡献进行归因。我在这里看到了之前提出的一个类似问题:Find size contributed by each external library on iOS
'fullofsquirells' 的回答很相关,而且解释得很好。然而,如果我使用链接映射文件方法,如果我将所有区段或符号的大小相加,我得不到最终的二进制文件大小。
更多细节: 我的iOS应用程序的最终ipa大小约为50 MB。未压缩的应用程序有效负载大小约为90 MB,其中包含约50 MB的代码和40 MB的资源。50 MB的代码二进制包含两个二进制切片,分别对应于armv7和arm64。我可以使用“lipo”获取单独的切片,并且每个切片的大小大致相同,23 MB(armv7)和27 MB(arm64)。
使用链接映射法,我能够获得每个切片的部分和符号的大小(注意每个切片都有一个单独的链接映射文件)。问题是,如果我将所有区段或符号的大小相加,它们的总和并不等于该切片的应用程序二进制文件大小。
假设我在 symbols_arm64.txt 和 sections_arm64.txt 中有 arm64 的符号和部分,则:
cat symbols_arm64.txt |grep -e "0x" | awk '{print $2}'| xargs printf "%d\n"|paste -sd+ -|bc cat sections_arm64.txt |grep -e "0x" | awk '{print $2}'| xargs printf "%d\n"|paste -sd+ -|bc
这两个命令都会返回接近15 MB的值。我原本希望这两个命令都会接近27 MB。
是什么导致了缺失的12 MB?

我遇到了同样的问题。你找出是哪个导致了缺失的 MB 吗? - Zhe Yang
好的。对我来说,LINKEDIT部分也很重要。 - Zhe Yang
1个回答

1
除了链接映射文件中第二个部分列出的数据和文本部分之外,还有一个名为“linkEdit”的附加部分。DYLD使用此部分。有关LinkEdit的更多信息,请参见:http://newosxbook.com/articles/DYLD.html。 可以通过将DEPLOYMENT_POSTPROCESSING设置为“YES”来摆脱它。这将剥离所有符号,并且在最终二进制文件中也会删除LinkEdit部分。实际上,在发布二进制文件时建议这样做,当应用程序大小成为问题时。有关此信息的更多信息请参见Apple Tech Note:https://developer.apple.com/library/mac/technotes/tn2004/tn2123.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接