06 | App 如何通过注入动态库的方式实现极速编译调试?
戴铭
该思维导图由 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
《iOS 开发高手课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(83)
- 最新
- 精选
- mqhong讲的有点深了 有没有推介的gnustep源码必读的类实现 和阅读的方法😂
作者回复: 我觉得你在使用库有疑问时,或者看到分析有疑点时,带着问题去看,效果会很好。
2019-03-232 - Damon报错了,建议看看留言或者直接看github仓库中的issue看是否有你遇到的问题;看了留言我的问题完美解决
作者回复: 赞
2019-04-301 - bubble想问下老师 为什么只有模拟器可以 而真机不可以呢?
作者回复: 针对 arm64 芯片写的
2019-03-2521 - 刘儒勇历尽千辛万苦,终于可以用了✌️
作者回复: 👍🏻
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 - drunkenMouseClone一下代码弄得有点懵,不知道怎么克隆。然后我用了另一种方式使用了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-23131
- Danielios10之后由于沙盒的限制 应用无法加载自身bundle之外的动态库 这个工具只能在模拟器上使用2019-04-1020
收起评论