iOS 开发高手课
戴铭
前滴滴出行技术专家
42934 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
用户故事 (1讲)
iOS 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

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

加载动态库到可执行文件
通过Socket通知运行的App
重新编译、打包成动态库
执行rebuildClass
监听源代码文件的变化
上线时间延误
编译调试耗时
修改代码编译、打包成动态库直接让对方看到修改的情况
Injection的工作原理
程序无需重启
加快调试速度
动态执行Swift或Objective-C代码
实时调试
Google开发的跨平台开发框架
实时调试程序
Xcode集成
严重bug的发现
提高生产效率
分享观点
利用底层知识提高开发效率
底层知识的基础
沟通效率的提高
提供更稳定、性能更好的App
提高开发效率
底层知识的重要性
Injection for Xcode
Flutter Hot Reload
Swift Playground
编译调试的提速问题
小结
应用场景
工具
实际应用
动态库链接器
文章

该思维导图由 AI 生成,仅供参考

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

Swift Playground

说到 iOS 代码动态极速调试的工具,你首先能想到的估计就是 Playground。它是 Xcode 里集成的一个能够快速、实时调试程序的工具,可以实现所见即所得的效果,如下图所示:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

通过注入动态库的方式实现极速编译调试是开发中的重要技术。本文介绍了动态库链接器的实际应用,以及一些工具的使用方法。其中,Swift Playground和Flutter Hot Reload是实现实时调试的工具,而对于iOS开发者来说,Injection for Xcode是一个非常实用的工具。文章详细介绍了Injection的工作原理,包括监听源代码文件的变化、重新编译、打包成动态库以及动态库的加载过程。通过这种方式,开发者可以在不重新编译和重启App的情况下实现极速调试,大大提高了编译调试的效率。文章最后鼓励读者思考底层知识的更多运用场景,并分享观点。整体而言,本文深入浅出地介绍了动态库链接器的实际应用,对于开发者提高生产效率具有一定的指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《iOS 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(83)

  • 最新
  • 精选
  • mqhong
    讲的有点深了 有没有推介的gnustep源码必读的类实现 和阅读的方法😂

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

    2019-03-23
    2
  • Damon
    报错了,建议看看留言或者直接看github仓库中的issue看是否有你遇到的问题;看了留言我的问题完美解决

    作者回复: 赞

    2019-04-30
    1
  • bubble
    想问下老师 为什么只有模拟器可以 而真机不可以呢?

    作者回复: 针对 arm64 芯片写的

    2019-03-25
    2
    1
  • 刘儒勇
    历尽千辛万苦,终于可以用了✌️

    作者回复: 👍🏻

    2019-05-31
  • Ant
    这样审核能通过吗? 是不是调试的时候用,提交App Store时候移除呢

    作者回复: 答疑二里我会专门针对你的问题进行答疑。

    2019-04-10
  • 郑昊鸣
    感谢老师,对于已经模块化的项目,在pod的example project中开发,InjectionIII就不好用了。InjectionIII要求项目都在一个目录下,当项目加载本地pod进行开发的时候,本地pod和项目project不在同一目录下,InjectionIII该如何使用呢,谢谢~

    作者回复: 对文件变化的监听部分可以做些修改

    2019-03-28
  • 痞子胡
    接入到项目中,启动后直接crash,报bad access。找了一天还没找到原因,求解。

    作者回复: 贴出详细信息吧

    2019-03-27
  • 徐秀滨
    接我上个问题,已经解决了。 使用通知接收就可以。 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test) name:@"INJECTION_BUNDLE_NOTIFICATION" object:nil];

    作者回复: 赞

    2019-03-26
  • 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
    1
    31
  • Daniel
    ios10之后由于沙盒的限制 应用无法加载自身bundle之外的动态库 这个工具只能在模拟器上使用
    2019-04-10
    20
收起评论
显示
设置
留言
83
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部