LinkMap分析初窥

基础服务是为了开发人员更好的进行开发,LinkMap分析服务就是这样的存在

1.我们为什么要用LinkMap

  当一个中大型iOS项目在不断迭代更新的过程中,代码量日渐壮大,需要重构和review的代码也越来越多,可一旦代码达到一定程度后变得不是那么可控,为了使得项目还可以持续可集成稳健的开发下去,缩小iOS安装包大小是必须要做的事情,通常会从压缩图片和音频文件开始,使用开发工具查找冗余不用的资源文件,这一阶段之后只能通过对代码的重构来达到可执行文件整体瘦身的效果。

  当从事参与的一个项目在不断迭代过程中,App的安装包在不断变大,通过自己的shell脚本分析,多达几十万行,这时候非常有瘦身的必要,这其中包括了.h.m.mm.cpp.rss格式文件。观察项目中引入的Pods文件及相关第三方库,多达上百个库,这时候这样一个中大型App就涉及到应用瘦身的问题,如何才能有效解决代码不可控的问题,如何能提高项目中底层基础架构的稳定性及健壮性,相信LinkMap能给予我们一些答案。

2.LinkMap是什么

  在iOS开发领域,LinkMap可能对初学者是一个陌生的名词,简而言之,LinkMap的输出是一个纯文本格式的文件,里面包含重要的编译信息及报错信息,这也是Apple用来分析你的应用的主要方式,通过这种方式可以发现应用中是否使用了私有库等不符合Apple提交应用规范的内容,但对于我们开发人员,LinkMap却是一个用于分析源码及查看Crash的有效途径。

3.LinkMap的构成

一份完整的LinkMap文件中包含了一下几个部分:

  1. App的编译路径(#Path)

    # Path: /Users/XXXXX/Library/Developer/Xcode/DerivedData/XXXXXXXXXXXX-fwtuexpkzxsfkjaootcqwizogrhf/Build/Products/Debug-iphonesimulator/XXXXX.app/XXXXXXX
    
  2. App对应的架构(#Arch)

    # Arch: x86_64
    
  3. App的完整的目标文件列表(#Object files)

    [1] /Users/XXXX/Library/Developer/Xcode/DerivedData/XXXXXXX-fwtuexpkzxsfkjaootcqwizogrhf/Build/Intermediates/XXXXX.build/Debug-iphonesimulator/XXXX.build/Objects-normal/x86_64/main.o
    [2] /Users/XXXX/Library/Developer/Xcode/DerivedData/XXXX-fwtuexpkzxsfkjaootcqwizogrhf/Build/Products/Debug-iphonesimulator/libPods-XXXX-XXX-AFHTTPRequestOperationLogger.a(AFHTTPRequestOperationLogger.o)
    [3] /Users/XX/Library/Developer/Xcode/DerivedData/XXXX-fwtuexpkzxsfkjaootcqwizogrhf/Build/Products/Debug-iphonesimulator/libPods-XXX-XXX-AFHTTPRequestOperationLogger.a(Pods-XXX-XXX-AFHTTPRequestOperationLogger-dummy.o)
    [4] /Users/XX/Library/Developer/Xcode/DerivedData/XXXXXX-fwtuexpkzxsfkjaootcqwizogrhf/Build/Products/Debug-iphonesimulator/libPods-XXX-XXX-AFNetworking.a(AFHTTPClient.o)
...

  1. App的段表(#Section)

    段表标题中列举出了地址,大小,段类型以及段名称。
    数据类型分为两种不同类型,一种是__TEXT,用于保存程序代码段经过编译后的机器码,另外一种是__DATA用于保存诸如全局变量或者局部变量。
    段的区分更多,如__cstring为字符串常量,__bss表示未初始化的全局变量及局部静态变量,__const表示的是对应的不可变的变量。当然这一切的数据都是文件占用空间,并不是运行时的占用空间。

    # Address   Size        Segment Section
    0x100001E80 0x0176F009  __TEXT  __text
    0x101770E8A 0x00002C58  __TEXT  __stubs
    0x101773AE4 0x00003288  __TEXT  __stub_helper
    0x101776D6C 0x000CD35C  __TEXT  __objc_methname
    0x1018440D0 0x0011D09D  __TEXT  __cstring
    0x10196116D 0x0001A327  __TEXT  __objc_classname
    0x10197B494 0x0001F64C  __TEXT  __objc_methtype
    0x10199AAE0 0x00077720  __TEXT  __const
    ...
    
  1. App中具体目标文件在对应的section中的位置和大小(#Symbols)

    0x100001E80 0x00000097  [  1] _main
    0x100001F20 0x000000B0  [  2] +[AFHTTPRequestOperationLogger sharedLogger]
    0x100001FD0 0x00000050  [  2] ___44+[AFHTTPRequestOperationLogger sharedLogger]_block_invoke
    0x100002020 0x00000010  [  2] ___copy_helper_block_
    0x100002030 0x00000010  [  2] ___destroy_helper_block_
    0x100002040 0x000000D0  [  2] -[AFHTTPRequestOperationLogger init]
    0x100002110 0x00000060  [  2] -[AFHTTPRequestOperationLogger dealloc]
    ...
    

4.LinkMap服务的开启方式及文件目录

  1. Xcode->Project->Build Settings-> Search map -> 设置 Write Link Map Files 选项为YES(这里需要注意的是不是设置Pods.xcodeproj的LinkMap而是xxx-xxxxx.xcodeproj,其他项目也要去设置主工程的对应编译选项,以此类推)
  2. 文件位于指定的路径,默认是在~/Library/Developer/Xcode/DerivedData/xxx-xxx-fwtuexpkzxsfkjaootcqwizogrhf/Build/Intermediates/xx-xxx.build/Debug-iphonesimulator/xxx-xxx.build/xxx-xxx-LinkMap-normal-x86_64.txt(文件路径顺序基本一致,文件名会有所不同,自行查看)

5.LinkMap服务化

  • 作为基础服务,我们直接看LinkMap文件有时候非常吃力,如果能够配合图形化的方式来分析应用,这样对于开发人员来说是大大的便利。

6.App瘦身及展望

  App瘦身是目前天猫App需要解决的问题,不光是通过LinkMap分析源码,实际上还可以通过好几个维度进行瘦身,包括优化资源文件,优化编译选项,优化可执行文件,当然这些都可以继续深入细分。

  苹果官方也带来一些App瘦身好消息,WWDC2015带来一个App Thining的App瘦身功能,这是Xcode7测试版本的功能之一,App Thining根据用户设备类别和屏幕分辨率的不同来定制不同的下载包,这样为用户很好的节省了存储空间,相信这也是一种很好的App瘦身方式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,918评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 不断的开发迭代,产品经理不断的添加需求,引入的资源文件几乎是只加不减,猛然回首,iOS包已经100多m,看来iOS...
    码农甲阅读 3,699评论 8 31
  • 原文地址 前言一般可以将编程语言分为两种,编译语言和直译式语言。像C++,Objective C都是编译语言。编译...
    一片枫叶随风舞阅读 357评论 0 0
  • 第一次见面 大一的学生来到大学少不了的就是老乡会,每年都会有各个省市的大学生老乡会,他们中有学长,...
    尴尬囹圄阅读 228评论 0 0