iOS开发高手课
戴铭
前滴滴出行技术专家
立即订阅
11464 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 锚定一个点,然后在这个点上深耕
免费
基础篇 (20讲)
01 | 建立你自己的iOS开发知识体系
02 | App 启动速度怎么做优化与监控?
03 | Auto Layout 是怎么进行自动布局的,性能如何?
04 | 项目大了人员多了,架构怎么设计更合理?
05 | 链接器:符号是怎么绑定到地址上的?
06 | App 如何通过注入动态库的方式实现极速编译调试?
07 | Clang、Infer 和 OCLint ,我们应该使用谁来做静态分析?
08 | 如何利用 Clang 为 App 提质?
09 | 无侵入的埋点方案如何实现?
10 | 包大小:如何从资源和代码层面实现全方位瘦身?
11 | 热点问题答疑(一):基础模块问题答疑
12 | iOS 崩溃千奇百怪,如何全面监控?
13 | 如何利用 RunLoop 原理去监控卡顿?
14 | 临近 OOM,如何获取详细内存分配信息,分析内存问题?
15 | 日志监控:怎样获取 App 中的全量日志?
16 | 性能监控:衡量 App 质量的那把尺
17 | 远超你想象的多线程的那些坑
18 | 怎么减少 App 电量消耗?
19 | 热点问题答疑(二):基础模块问题答疑
20 | iOS开发的最佳学习路径是什么?
应用开发篇 (12讲)
21 | 除了 Cocoa,iOS还可以用哪些 GUI 框架开发?
22 | 细说 iOS 响应式框架变迁,哪些思想可以为我所用?
23 | 如何构造酷炫的物理效果和过场动画效果?
24 | A/B 测试:验证决策效果的利器
25 | 怎样构建底层的发布和订阅事件总线?
26 | 如何提高 JSON 解析的性能?
27 | 如何用 Flexbox 思路开发?跟自动布局比,Flexbox 好在哪?
28 | 怎么应对各种富文本表现需求?
29 | 如何在 iOS 中进行面向测试驱动开发和面向行为驱动开发?
30 | 如何制定一套适合自己团队的 iOS 编码规范?
31 | iOS 开发学习资料和书单推荐
32 | 热点问题答疑(三)
原理篇 (6讲)
33 | iOS 系统内核 XNU:App 如何加载?
34 | iOS 黑魔法 Runtime Method Swizzling 背后的原理
35 | libffi:动态调用和定义 C 函数
36 | iOS 是怎么管理内存的?
37 | 如何编写 Clang 插件?
38 | 热点问题答疑(四)
原生与前端共舞 (5讲)
39 | 打通前端与原生的桥梁:JavaScriptCore 能干哪些事情?
40 | React Native、Flutter 等,这些跨端方案怎么选?
41 | 原生布局转到前端布局,开发思路有哪些转变?
42 | iOS原生、大前端和Flutter分别是怎么渲染的?
43 | 剖析使 App 具有动态化和热更新能力的方案
用户故事 (1讲)
用户故事 | 我是如何学习这个专栏的?
结束语 (1讲)
结束语 | 慢几步,深几度
iOS开发高手课
登录|注册

06 | App 如何通过注入动态库的方式实现极速编译调试?

戴铭 2019-03-23
你好,我是戴铭。
在上一篇文章中,我和你分享了链接器的基础知识。今天我们再继续聊聊,动态库链接器的实际应用,也就是编译调试的提速问题。
iOS 原生代码的编译调试,都是通过一遍又一遍地编译重启 App 来进行的。所以,项目代码量越大,编译时间就越长。虽然我们可以通过将部分代码先编译成二进制集成到工程里,来避免每次都全量编译来加快编译速度,但即使这样,每次编译都还是需要重启 App,需要再走一遍调试流程。
对于开发者来说,提高编译调试的速度就是提高生产效率。试想一下,如果上线前一天突然发现了一个严重的 bug,每次编译调试都要耗费几十分钟,结果这一天的黄金时间,一晃就过去了。到最后,可能就是上线时间被延误。这个责任可不轻啊。
那么问题来了,原生代码怎样才能够实现动态极速调试,以此来大幅提高编译调试速度呢?在回答这个问题之前,我们先看看有哪些工具是这么玩儿的。了解了它们的玩法,我们也就自然清楚这个问题的答案了。

Swift Playground

说到 iOS 代码动态极速调试的工具,你首先能想到的估计就是 Playground。它是 Xcode 里集成的一个能够快速、实时调试程序的工具,可以实现所见即所得的效果,如下图所示:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《iOS开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(74)

  • drunkenMouse
    Clone一下代码弄得有点懵,不知道怎么克隆。然后我用了另一种方式使用了injection

    1.在App Store下载InjectionIII, 打开。
    2.选择项目的根目录
    3.项目的Appdelegate加入:
    #if DEBUG
     // iOS
        [[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"] load];
    #endif

    XCode10 是这个
    #if DEBUG
     // iOS
        [[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection10.bundle"] load];
    #endif

    而后启动,修改,保存,就会卡到断点位置了。
    2019-03-23
    23
  • mαnajay
    InjectionIII 上面有个 issue 是解决 pod 组件引入修改源码无法进行注入的问题 https://github.com/johnno1962/InjectionIII/issues/34, https://github.com/johnno1962/InjectionIII/issues/53 , 使用组件后接入还是有点麻烦
    2019-03-23
    9
  • Love mi
    1.在App Store下载InjectionIII, 打开。
    2.选择项目的根目录
    3.项目的Appdelegate加入:
        [[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"] load];
    运行报
    Error loading /Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle/iOSInjection: dlopen(/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle/iOSInjection, 265): Symbol not found: _$s19ArrayLiteralElements013ExpressibleByaB0PTl
      Referenced from: /Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle/iOSInjection
      Expected in: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/libswiftCore.dylib
     in /Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle/iOSInjection
    2019-03-28
    6
  • Hyman
    command+s就没有人报错误吗?
    Loading .dylib ...
    objc[4708]: Class ViewController is implemented in both /Users/hyman/Library/Developer/CoreSimulator/Devices/7C19EFEC-F0B4-4405-979A-358FA75F4A4F/data/Containers/Bundle/Application/A1A3313C-9092-4BBA-B2EF-604ECAD508D3/MTInjectionOC.app/MTInjectionOC (0x10f488d10) and /Users/hyman/Library/Containers/com.johnholdsworth.InjectionIII/Data/eval104.dylib (0x12d168138). One of the two will be used. Which one is undefined.
    💉 Loaded .dylib - Ignore any duplicate class warning ^
    2019-03-28
    1
    6
  • SLY
    @Link 回复楼上那位同学,把 file -> Workspace Setting -> Build System, 改为Legacy Build System模式,默认的New Build System(Default)模式,是不会编译pod 里面的改动的
    2019-03-25
    6
  • 亡命之徒
    项目使用了cocopods、这个插件用不了呀,保存的时候报错😭,新建的demo使用就没问题,麻烦老师解答下
    2019-03-29
    5
  • 景迪
    起来第一件事就是看看有没有更新😄
    2019-03-23
    4
  • Geek_48dbbf
    真机上如何实现注入动态库实时调试?
    2019-04-18
    3
  • Jersey、
    刚开始没重写 - (void)injected { } , 发现修改一直没反应, 控制台还收到了相应警告
    💉 Injection connected, watching /Users/user/JerseyCafe/JerseyCafe/MySampleCode/JSDPlayground/**
    💉 *** Compiling /Users/user/JerseyCafe/JerseyCafe/MySampleCode/JSDPlayground/JSDPlayground/Class/Launch/JSDHomeVC.m ***
    💉 Loading .dylib ...
    objc[22080]: Class JSDHomeVC is implemented in both /Users/user/Library/Developer/CoreSimulator/Devices/042DBB6D-8059-43E7-A609-3034F6D949AD/data/Containers/Bundle/Application/4BCF4C6E-3650-484C-BAE8-7ACB3B3A3E6E/JSDPlayground.app/JSDPlayground (0x10695a278) and /Users/user/Library/Containers/com.johnholdsworth.InjectionIII/Data/eval101.dylib (0x12cf821d8). One of the two will be used. Which one is undefined.
    💉 Loaded .dylib - Ignore any duplicate class warning ^
    然后找了下 github Issue [Issue](https://github.com/johnno1962/InjectionIII/issues/101) 原来要在相应的文件下重写 injected 方法, 在 .m 下添加下列代码即可
    Swift:
    extension UIViewController {
      @objc func injected() {
        viewDidLoad()
        viewWillAppear(true)
        viewDidAppear(true)
      }
    }
    OC:
    - (void)injected {
        
        [self viewDidLoad];
        [self viewWillAppear:YES];
        [self viewWillDisappear:YES];
    }
    直接修改代码即可, command + s 自动刷新。
    不过还是收到相应警告。
    2019-04-01
    3
  • Melvins
    @drunkenMouse,用你的方法在xcode 10.2上会出现👇错误提示,求教!!!

    Error loading /Applications/InjectionIII.app/Contents/Resources/iOSInjection10.bundle/iOSInjection10: dlopen(/Applications/InjectionIII.app/Contents/Resources/iOSInjection10.bundle/iOSInjection10, 265): Symbol not found: _$SBOWV
      Referenced from: /Applications/InjectionIII.app/Contents/Resources/iOSInjection10.bundle/iOSInjection10
      Expected in: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/libswiftCore.dylib
     in /Applications/InjectionIII.app/Contents/Resources/iOSInjection10.bundle/iOSInjection10
    2019-03-28
    4
    3
  • 旺旺
    我这保存后悔报错
    💉 *** Compiling /Users/zhaowangwang/Documents/中电科36所svn/E-Mobile/MeCenterViewController.m ***
    💉 *** Re-compilation failed (/Users/zhaowangwang/Library/Containers/com.johnholdsworth.InjectionIII/Data/command.sh)
    fatal error: malformed or corrupted AST file: 'could not find file '/Users/zhaowangwang/Documents/中电科36所svn/E-Mobile/RongIMLib.framework/Headers/RCAmrDataConverter.h' referenced by AST file '/Users/zhaowangwang/Library/Developer/Xcode/DerivedData/E-Mobile-brkkzascastenicojgygpmgoepqm/Build/Intermediates.noindex/PrecompiledHeaders/SharedPrecompiledHeaders/9438762758094351804/E-Mobile-Prefix.pch.gch''
    1 error generated.
     ***
    怎么破?
    2019-04-24
    2
  • 徐秀滨
    请问为啥我保存后,断点执行到了,但是过了之后就闪了,一脸懵逼。。。
    2019-03-26
    2
  • mqhong
    讲的有点深了 有没有推介的gnustep源码必读的类实现 和阅读的方法😂

    作者回复: 我觉得你在使用库有疑问时,或者看到分析有疑点时,带着问题去看,效果会很好。

    2019-03-23
    2
  • 给力的Andy
    崩溃的各位同学,看看项目中是否用了rac,这个会导致crash
    2019-07-09
    1
  • 韩小醋
    老师,是否可以讲解一下flutter attach 的原理,公司最近准备搞flutter 动态化
    2019-07-03
    1
    1
  • 景天儿
    蛮好用的,但是有几个需要注意的地方:
    1. 进行swizzling的类不要动态修改,否则二次交换,会引起死循环。
    2. 不支持方法的删除:删除后,方法调用仍然有效,不抛异常。
    3. 不支持新增类:新增类引入后使用无效。但类的重命名是有效的。
    4. 属性新增、删除、修改:反射上体现不出来。
    其中后三个的原因,不知道戴铭老师有没有什么见解。
    在我的角度来看,应该不是InjectionIII的问题,可能与苹果动态库调用有关。
    2019-05-28
    1
  • Daniel
    ios10之后由于沙盒的限制 应用无法加载自身bundle之外的动态库 这个工具只能在模拟器上使用
    2019-04-10
    1
  • 21💤
    - (void)injected
    + (void)injected
    INJECTION_BUNDLE_NOTIFICATION
    我这边所有的修改只有写在这3个方法里才会刷新,并不能像图片上那样随修随变,并一直报dylib 重复警告

    inject(tmpfile: String) 方法的代码大都是新类替换旧类,但是当我在- (void)injected里写入[self viewDidLoad];后,会发现并没有替换,而是重新创建了一遍新的UI,有请踩过坑的老哥发言😂

    2019-04-09
    1
  • @Hyman 出现的问题怎么解决的?
    💉 Loading .dylib ...
    objc[10390]: Class ViewController is implemented in both /Users/lutaohua/Library/Developer/CoreSimulator/Devices/37453FFB-A4BA-4761-B590-BFAEB3C54A5D/data/Containers/Bundle/Application/342F3B0F-D638-4A99-89C6-3C8A04A25135/Mach_O_test.app/Mach_O_test (0x100b65ea8) and /Users/lutaohua/Library/Containers/com.johnholdsworth.InjectionIII/Data/eval101.dylib (0x11e8e3218). One of the two will be used. Which one is undefined.
    💉 Loaded .dylib - Ignore any duplicate class warning ^
    2019-03-28
    1
  • Tim叔
    xocde10.1下编译错误open /~/bin/unhide no such file or
    2019-03-27
    1
收起评论
74
返回
顶部