iOS-APP可执行文件分析
经过上次瘦身我们的可执行文件已经从54.4M缩小为24.6M,那么这24.6M里边到底包含些什么东西呢,接下来我们就来研究一下,其实最重要的是最后一步,看看可执行文件中哪些文件占的体积大,可以针对性优化
一、Link Map文件生成
按照图中步骤,在Xcode中设置Write Link Map File为YES,允许LinkMap文件写入本地
编译项目,然后参考Path to Link Map File寻找到文件路径如下,如果不知道DerivedData下边哪个是你的项目,你就把目录下的文件全删了,重新编译就会出现你现在的项目了
/Users/wanglizhi/Library/Developer/Xcode/DerivedData/teyuntong-dubdxtwoxsmbyvgqehamoxsavmuc/Build/Intermediates.noindex/teyuntong.build/Debug-iphoneos/teyuntong.build/teyuntong-LinkMap-normal-arm64.txt这个文件就是可执行文件的全部了,共361156行
二、Link Map文件解析
Link Map文件主要有以下几块信息
Path:此文件对应安装包的地址Arch:app架构Object file:目标文件列表Sections:各种数据类型所占内存空间Symbols:类名、变量名、方法名等符号Dead Stripped Symbols:没用的符号
Path、Arch这两个我相信就不用多说了,下面我们分析一下其它类型
2.1、Object files
# Object files:
[ 0] linker synthesized
[ 1] /Users/wanglizhi/Library/Developer/Xcode/DerivedData/teyuntong-dubdxtwoxsmbyvgqehamoxsavmuc/Build/Intermediates.noindex/teyuntong.build/Debug-iphoneos/teyuntong.build/Objects-normal/arm64/UIScrollView+MJExtension.o
[ 2] /Users/wanglizhi/Library/Developer/Xcode/DerivedData/teyuntong-dubdxtwoxsmbyvgqehamoxsavmuc/Build/Intermediates.noindex/teyuntong.build/Debug-iphoneos/teyuntong.build/Objects-normal/arm64/TYTSetPasswordController.o
[ 3] /Users/wanglizhi/Library/Developer/Xcode/DerivedData/teyuntong-dubdxtwoxsmbyvgqehamoxsavmuc/Build/Intermediates.noindex/teyuntong.build/Debug-iphoneos/teyuntong.build/Objects-normal/arm64/TYTMyGoodsModel.o
[ 4] /Users/wanglizhi/Library/Developer/Xcode/DerivedData/teyuntong-dubdxtwoxsmbyvgqehamoxsavmuc/Build/Intermediates.noindex/teyuntong.build/Debug-iphoneos/teyuntong.build/Objects-normal/arm64/BaseMapViewController.o
[ 5] /Users/wanglizhi/Library/Developer/Xcode/DerivedData/teyuntong-dubdxtwoxsmbyvgqehamoxsavmuc/Build/Intermediates.noindex/teyuntong.build/Debug-iphoneos/teyuntong.build/Objects-normal/arm64/AppDelegate.o
[ 6] /Users/wanglizhi/Library/Developer/Xcode/DerivedData/teyuntong-dubdxtwoxsmbyvgqehamoxsavmuc/Build/Intermediates.noindex/teyuntong.build/Debug-iphoneos/teyuntong.build/Objects-normal/arm64/TYTAbnormalReportController.o
[ 7] /Users/wanglizhi/Library/Developer/Xcode/DerivedData/teyuntong-dubdxtwoxsmbyvgqehamoxsavmuc/Build/Intermediates.noindex/teyuntong.build/Debug-iphoneos/teyuntong.build/Objects-normal/arm64/TYTOptimizeRequest.o
[ 8] /Users/wanglizhi/Library/Developer/Xcode/DerivedData/teyuntong-dubdxtwoxsmbyvgqehamoxsavmuc/Build/Intermediates.noindex/teyuntong.build/Debug-iphoneos/teyuntong.build/Objects-normal/arm64/TYTGoodsDetailController.o
[ 9] /Users/wanglizhi/Library/Developer/Xcode/DerivedData/teyuntong-dubdxtwoxsmbyvgqehamoxsavmuc/Build/Intermediates.noindex/teyuntong.build/Debug-iphoneos/teyuntong.build/Objects-normal/arm64/TYTMapSearchCell.o
[ 10] /Users/wanglizhi/Library/Developer/Xcode/DerivedData/teyuntong-dubdxtwoxsmbyvgqehamoxsavmuc/Build/Intermediates.noindex/teyuntong.build/Debug-iphoneos/teyuntong.build/Objects-normal/arm64/TYTAddDriverController.o
[ 11] /Users/wanglizhi/Library/Developer/Xcode/DerivedData/teyuntong-dubdxtwoxsmbyvgqehamoxsavmuc/Build/Intermediates.noindex/teyuntong.build/Debug-iphoneos/teyuntong.build/Objects-normal/arm64/MJRefreshAutoGifFooter.o2.2、Sections
描述各个段在可执行文件中的具体信息
下面说下每一列的意思
Address:偏移量Size: 占用内存大小Segment:代码段或初始变量Section:具体类型
Segment跟Section的具体解释
__TEXT:代码段__text: 主程序代码__cstring: c语言字符串stubs:用于动态链接库的stubstub_helper:用于动态链接库的stub__const: const修饰的常量__objc_methname: objc的方法名称__objc_methtype: objc方法类型__objc_classname: objc类方法
__DATA:已经初始化的变量等__objc_ivars: objc类的实例变量__objc_classlist: objc类列表__objc_protolist: objc协议列表__objc_imageinfo: objc镜像信息__objc_const: objc常量__objc_selfrefs: objc自引用(self)__objc_protorefs: objc协议引用__objc_superrefs: objc超类引用__cfstring: 使用Core Foundation字符串__bssBSS
# Sections:
# Address Size Segment Section
0x100005A3C 0x014FE08C __TEXT __text
0x101503AC8 0x00002E74 __TEXT __stubs
0x10150693C 0x00002E2C __TEXT __stub_helper
0x101509768 0x0008D90F __TEXT __objc_methname
0x101597077 0x0000B401 __TEXT __objc_classname
0x1015A2478 0x00019398 __TEXT __objc_methtype
0x1015BB810 0x000F92F8 __TEXT __cstring
0x1016B4B10 0x00080738 __TEXT __const
0x101735248 0x000B15E8 __TEXT __gcc_except_tab
0x1017E6830 0x000126B6 __TEXT __ustring
0x1017F8EE8 0x00036FEC __TEXT __unwind_info
0x10182FED8 0x00000124 __TEXT __eh_frame
0x101830000 0x00000A90 __DATA __got
0x101830A90 0x00001EF8 __DATA __la_symbol_ptr
0x101832988 0x000005E0 __DATA __mod_init_func
0x101832F70 0x00055088 __DATA __const
0x101887FF8 0x0005ADE0 __DATA __cfstring
0x1018E2DD8 0x00003940 __DATA __objc_classlist
0x1018E6718 0x00000048 __DATA __objc_nlclslist
0x1018E6760 0x000003F0 __DATA __objc_catlist
0x1018E6B50 0x00000028 __DATA __objc_nlcatlist
0x1018E6B78 0x000008A0 __DATA __objc_protolist
0x1018E7418 0x00000008 __DATA __objc_imageinfo
0x1018E7420 0x00200E58 __DATA __objc_const
0x101AE8278 0x00022E88 __DATA __objc_selrefs
0x101B0B100 0x00000080 __DATA __objc_protorefs
0x101B0B180 0x00003808 __DATA __objc_classrefs
0x101B0E988 0x000025D8 __DATA __objc_superrefs
0x101B10F60 0x0000AC64 __DATA __objc_ivar
0x101B1BBC8 0x00023CD0 __DATA __objc_data
0x101B3F8A0 0x000354A8 __DATA __data
0x101B75000 0x00002C00 __DATA __common
0x101B77C00 0x0000F250 __DATA __bss咱们看第一行的信息主程序代码的位置是0x100005A3C,所占内存的大小是0x014FE08C即c*16^0+8*16^1+0*16^2+E*16^3+F*16^4+4*16^5+1*16^6,那么第二行的偏移量0x101503AC8就等于0x100005A3C+0x014FE08C
2.3、Symbols
Symbols的信息就是标明方法、属性等占用的内存大小,以及属于哪个类
Address:偏移量Size: 占用内存大小File:对应2.2中Sections的序号,表明这是哪个类里的方法Name:方法名
# Symbols:
# Address Size File Name
0x100005A3C 0x0000008C [ 1] -[UIScrollView(MJExtension) setMj_insetT:]
0x100005AC8 0x00000048 [ 1] -[UIScrollView(MJExtension) mj_insetT]
0x100005B10 0x0000008C [ 1] -[UIScrollView(MJExtension) setMj_insetB:]
0x100005B9C 0x00000048 [ 1] -[UIScrollView(MJExtension) mj_insetB]
0x100005BE4 0x0000008C [ 1] -[UIScrollView(MJExtension) setMj_insetL:]
0x100005C70 0x00000048 [ 1] -[UIScrollView(MJExtension) mj_insetL]
0x100005CB8 0x0000008C [ 1] -[UIScrollView(MJExtension) setMj_insetR:]
0x100005D44 0x00000048 [ 1] -[UIScrollView(MJExtension) mj_insetR]
0x100005D8C 0x0000006C [ 1] -[UIScrollView(MJExtension) setMj_offsetX:]
0x100005DF8 0x00000040 [ 1] -[UIScrollView(MJExtension) mj_offsetX]
0x100005E38 0x0000006C [ 1] -[UIScrollView(MJExtension) setMj_offsetY:]
0x100005EA4 0x00000040 [ 1] -[UIScrollView(MJExtension) mj_offsetY]
0x100005EE4 0x0000006C [ 1] -[UIScrollView(MJExtension) setMj_contentW:]
0x100005F50 0x00000040 [ 1] -[UIScrollView(MJExtension) mj_contentW]
0x100005F90 0x0000006C [ 1] -[UIScrollView(MJExtension) setMj_contentH:]
0x100005FFC 0x00000040 [ 1] -[UIScrollView(MJExtension) mj_contentH]
0x10000603C 0x000006E0 [ 2] -[TYTSetPasswordController viewDidLoad]三、计算各个目标文件的体积
计算方法见LinkMapParser
wanglizhi@wlz:~/Downloads/LinkMapParser-master$ python parselinkmap.py teyuntong-LinkMap-normal-arm64.txt我们APP最终的计算结果如下,还是高德的两个SDK占用的位置最可怕,占了可执行文件的二分之一

转载请注明来源,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1226169349@qq.com
文章标题:iOS-APP可执行文件分析
文章字数:1.2k
本文作者:王立志
发布时间:2019-11-28, 14:12:25
最后更新:2019-11-28, 16:29:17
原始链接:http://yoursite.com/2019/11/28/iOS-APP可执行文件分析/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。