本文主要是介绍Xcode缩小ipa包大小及symbols设置等,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
其实被这个问题困扰了好久,不过秉承着三分钟热度的新年新气象,还是要多弄懂一点(⊙_⊙)ゞ
Symbols是什么东西呢?虽然我对它没有深入的了解,但是大概知道它的作用。摘抄《深入理解计算机系统》里的一些描述:
一个典型的ELF可重定位目标文件包含下面几个节:
... ...
.symtab:一个符号表,它存放在程序中定义和引用的函数和全局变量信息。一些程序员错误地认为必须通过-g选项来编译程序才能得到符号表信息。实际上,每个可重定位目标文件在.symtab中都有一张符号表。然而,和编译器中的符号表不同,.symtab符号表不包含局部变量的条目。
... ...
.debug:一个调试符号表,其条目是程序中定义的局部变量和类型定义,程序中定义和引用的全局变量,以及原始的C源文件。只有以-g选项调用编译驱动程序时才会得到这张表。
... ...为了构造可执行文件,链接器必须完成两个主要任务:
- 符号解析(symbol resolution)。目标文件定义和引用符号。符号解析的目的是将每个符号引用刚好和一个符号定义联系起来。
- 重定位(relocation)。编译器和汇编器生成从地址0开始的代码和数据节。链接器通过把每个符号定义与一个存储器位置联系起来,然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节。
Objective-C有一些自己的生成符号的规则,比如文档中有提到:
The dynamic nature of Objective-C complicates things slightly. Because the code that implements a method is not determined until the method is actually called, Objective-C does not define linker symbols for methods. Linker symbols are only defined for classes.
Objective-C不会为方法定义链接符号,只会为类定义链接符号。
可以在终端中用nm
命令查看一个可重定位文件或可执行文件的符号表,其中加上-a
参数可以显示包括调试符号在内的所有符号。
合理的选择与symbols有关的设置选项,可以缩减app的大小,一定程度上能阻碍与源代码有关的信息被攻击者获得。Xcode的build setting中,有不少与symbols有关,现在我来依次试验这几个设置选项,了解一下它们的具体作用。
刚开始的时候,我使用Xcode7.2.1新建了一个工程,以下试验均在run和DEBUG模式下进行。
Generate Debug Symbols [GCC_GENERATE_DEBUGGING_SYMBOLS]
在Xcode7.2.1中,Generate Debug Symbols
这个设置在DEBUG和RELEASE下均默认为YES
。
官方文档对这个设置的说明:
Enables or disables generation of debug symbols. When debug symbols are enabled, the level of detail can be controlled by the build 'Level of Debug Symbols' setting.
调试符号是在编译时生成的。在Xcode中查看构建过程,可以发现,当Generate Debug Symbols
选项设置为YES
时,每个源文件在编译成.o文件时,编译参数多了-g
和-gmodules
两项。但链接等其他的过程没有变化。
Clang文档对-g
的描述是:
Generate complete debug info.
当Generate Debug Symbols
设置为YES
时,编译产生的.o文件会大一些,当然最终生成的可执行文件也大一些。
当Generate Debug Symbols
设置为NO
的时候,在Xcode中设置的断点不会中断。但是在程序中打印[NSThread callStackSymbols]
,依然可以看到类名和方法名,比如:
** 0 XSQSymbolsDemo 0x00000001000667f4 -[ViewController viewDidLoad] + 100**
在程序崩溃时,也可以得到带有类名和方法名的函数调用栈
现在把
这篇关于Xcode缩小ipa包大小及symbols设置等的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!