`

iOS开发者的福利 Injection Plugin For Xcode

阅读更多

       Injection Plugin For Xcode github上的开源项目,Xcode插件。
       对于iOS开发者来说,XCode有个另人十分难耐的特性——编译时长的问题。也许工作的时候你能够为自己找到一个闲下来喝杯咖啡的正当的借口,然而,多次的调试编译过程足以让你喝上好多杯咖啡了。应该说,Injection是iOS开发者的福音,它在很大程度上优化了XCode的性能,提升了开发者的工作效率。

       Injection能够在app运行时动态地向Swift或者OC文件注入新代码并且即时地呈现在运行中的模拟器的app上,从而达到提高程序编译速度,提高开发效率的目的。开发者不需要重新编译重新运行整个项目,这样的优化使得编译周期从7秒缩短至1秒。从XCode的输出台来看,每次在进行代码注入之后都只会编译被注入了代码的文件。这么一听有点类似于增量编译。

       设想这样一个场景,对于一个编译启动需要10分钟的项目,如果你想对某个功能的动画效果进行微调,是否意味着你需要以至少10分钟为一个调试周期去对你的改动进行测试,而injection则能够在程序运行时动态的改动方法实现,并呈现在模拟器上。

       如果你会科学上网,可以到这里去看看injection 的  https://github.com/johnno1962/injectionforxcode ;

       或者到这里去看看他的演示:https://www.youtube.com/watch?v=uftvtmyZ8TM;

       对于Injection的安装使用,可以到第一个链接里下载package。Injection团队为开发者准备了一套傻瓜式的配置流程,基本上都是单击continue就行了,然后重启你的Xcode。装成功后你会看到product > injection plugin。此时你应该已经装成功了。点击 Product  >Injection Plugin > Patch Project for Injection 选项, 之后插件会在main.m 中插入两段代码。

#ifdef DEBUG

static char _inMainFilePath[] = __FILE__;

static const char *_inIPAddresses[] = {"10.12.1.67", "127.0.0.1", 0};

#define INJECTION_ENABLED

#import "/tmp/injectionforxcode/BundleInjection.h"

#endif

 

          这不会影响程序原有代码,如果要还原,随时可以通过点击 Revert Injection’s Changes 选项来还原。你可以开搞了。

          用一个demo做实验,将project运行起来,在运行时对你的代码进行改动,可以使用快捷键Ctrl + =快速运行。也可以在 product > injection plugin > inject and reset app。 你会发现你改动的代码所在类的左上角有一个蓝色的进度条,一秒不到的时间就能够完成注入并运行在你的app上。当然,你也能够在你改动的代码的方法里边加上一个断点,快捷键Ctrl + = ,你会发现运行时会停在你设定的breakpoint上。

        对于Swift文件injection好像还不能做到完美支持,github上有相关的解释,我还没有深入的尝试,有兴趣的童鞋可以去看看,顺便交流交流。

        injection是Xcode IDE的一个扩展,允许你去对类的一个方法实现打补丁而不需要重启app。官方的原理如下:

It performs this by parsing the build logs of the application to determine how a source file was last compiled. With this it wraps the result of re-compiling into a bundle which is injected into the application using the dynamic loader. At this point there are two versions of a class in the app, the original and a new modified version from the bundle. The modified version is then "swizzled" onto the original class so changes take effect.

(个人翻译)它通过解析程序的编译日志来确定最后一次编译的源文件。通过动态加载程序把重新编译的结果打包到被注入代码的app中。此时有两个版本的类应用,最初的和一个新的修改版本的包。这个修改后的版本,被“swizzled到”原始类中而生效。

          除此之外,injection插件还有一个参数调节器Tunable Parameters,对于UI开发来说是个利器。比如对颜色的确定,对字体大小的界定等等。运行app,然后对参数进行修改就能够动态的进行调试了。直观而且方便。

 
         对于 Tunable Parameters的使用我还没有涉足,它的使用目前仅限于Swift项目,还需要在项目中进行一些诸如添加头部代码的配置,有兴趣的童鞋可以到这里了解:https://github.com/johnno1962/injectionforxcode/blob/master/documentation/tunable_parameters.md 其实也不复杂,就是在新建一个main.m文件之后加上几行代码。

          在使用injection时,一个新的Xcode项目文件将会在原本项目的文件里生成(iOSInjectionProject或OSXInjectionProject)。这个文件是用于存放那些被injecte的项目文件的,建议将其加入到.gitignore 中,直接忽略。

          每一次的项目文件被injected,在injection项目目录里的injectionCount.txt中的数字就会增加。它可以很直观的告诉你节省了多少时间。

        如果你想在真机或Appcode上进行测试:

        你需要做一些轻量级的配置:在你的main.m文件加上如下几行代码:

#ifdef DEBUG

static char _inMainFilePath[] = __FILE__;

static const char *_inIPAddresses[] = {"10.12.1.67", "127.0.0.1", 0};

#define INJECTION_ENABLED

#import "/tmp/injectionforxcode/BundleInjection.h"

#endif

 
         这个配置也可以通过Product > Injection Plugin > Patch Project For Injection 来进行自动配置。对于Swift文件,你需要添加一个空的main.m文件来完成配置。

        至于使用Appcode的盆友,可以上github上看看教程:https://github.com/johnno1962/injectionforxcode 

         当然,injection并不是万能的,在某些情景下是不能起作用的。如下:


 
      关于injection的局限性,在进行研究分析后我将会另开一篇进行论述。

         对于某些童鞋的疑问:injection的编译效率与XCode自身的增量编译有什么优势?我已经在github上Issue了作者并得到了如下回复:

 

  • 大小: 30.2 KB
  • 大小: 133.1 KB
  • 大小: 15.7 KB
1
1
分享到:
评论

相关推荐

    Bookmark Plugin for Xcode.zip

    "Bookmark Plugin for Xcode.zip" 是一个专为Xcode设计的开源书签插件,适用于Xcode 8.x和7.x版本。通过这个插件,开发者可以方便地在代码中添加、管理和访问书签,无需再通过滚动或搜索来找到之前标记的重要位置。 ...

    LDC D Plugin for XCode-开源

    LDC D Plugin for Xcode的出现,旨在为D语言开发者提供在Xcode中的便捷开发环境,使他们能在苹果平台上利用D语言进行软件开发。 **开源软件** 开源软件意味着源代码对公众开放,允许用户查看、修改和分发代码。...

    injectionforxcode是一个Xcode插件

    作者johnno1962,代码...介绍:Injection for Xcode 是一个Xcode插件(可以通过Alcatraz获得),它可以向正在运行的app动态插入一段新的Swift/Objective-C代码,从而加速创建进程。它不会对你的项目做任何的改变。

    GTM-Xcode-Plugin.xcplugin.10.0.6.zip_xcode

    【标题】"GTM-Xcode-Plugin.xcplugin.10.0.6.zip_xcode" ...总之,"GTM-Xcode-Plugin.xcplugin.10.0.6.zip_xcode"是一个旨在提升iOS日历功能开发体验的工具,对开发者而言,既是实用的开发辅助,也是宝贵的教育资源。

    iOS开发者的Weex伪最佳实践指南

    然而,对于iOS开发者,依然推荐使用Xcode的Archive功能进行常规打包,原有流程不受影响。 总结起来,Weex作为一款跨平台框架,为iOS开发者提供了新的选择。理解其与React Native的差异,熟练掌握官方文档和工具,...

    Google Plugin for Eclipse 4.2

    Google Plugin for Eclipse 4.2正是这样一款专为Eclipse IDE定制的插件,旨在提升开发者在使用谷歌相关服务时的开发效率。 Eclipse 4.2,也被称为Juno,是Eclipse项目的一个重要版本,它带来了许多新特性与改进,以...

    cocoapods-xcode-plugin-master

    Xcode 插件则是在 Xcode 开发环境中扩展功能的一种方式,"cocoapods-xcode-plugin-master" 正是这样一个专门针对 CocoaPods 的 Xcode 插件,旨在提升开发者的生产力。 该插件的安装通常通过 Alcatraz 进行,...

    Reveal-Plugin-for-Xcode, Xcode插件,将显示应用集成到你的项目自动化.zip

    Reveal-Plugin-for-Xcode, Xcode插件,将显示应用集成到你的项目自动化 Reveal-Plugin-for-Xcode Xcode插件将显示应用集成到你的项目自动( 。没有对你的项目进行任何修改) 中。请注意,Xcode 8不支持插件。 有关更多...

    Unity Bluetooth LE Plugin for Android.pdf

    Unity Bluetooth LE Plugin for Android允许开发者通过Unity创建低功耗蓝牙中心设备(Central),并且在文档发布的时候,Android平台还不支持成为外围设备(Peripheral)。这表明该插件主要关注于实现应用程序作为...

    Xcode配置iOS14.3开发包DeviceSupport

    将Xcode适配可以调试、编译、运行、打包系统版本号为iOS 14.3 版本的设备,解决"Could not find Developer Disk Image"问题 使用详情 请前往https://blog.csdn.net/u010731949/article/details/52576792

    Unity Bluetooth LE Plugin for iOS.pdf

    根据给定的文件信息,本文将详细解读标题为"Unity Bluetooth LE Plugin for iOS.pdf"的文档内容,涵盖的知识点包括Unity蓝牙低功耗(BLE)插件在iOS平台的应用、技术细节以及与该插件相关的重要概念和版本更新历史。...

    Google Plugin for Eclipse 4.3

    **谷歌Eclipse插件4.3...总的来说,Google Plugin for Eclipse 4.3是Android和Google App Engine开发者的强大工具,它极大地简化了项目管理,提升了开发效率,并且随着版本的更新,持续为开发者带来更多的便利和功能。

    google plugin for eclipse

    "Google Plugin for Eclipse" 是一款由Google开发的集成开发环境(IDE)插件,专为Eclipse设计,目的是为了方便开发者在Eclipse中进行Google相关的应用开发,如Android应用、Google App Engine应用等。这款插件提供了...

    Dash-Plugin-for-Xcode, 用于集成Dash文档查看器应用程序的Xcode插件.zip

    Dash-Plugin-for-Xcode, 用于集成Dash文档查看器应用程序的Xcode插件 8 通知这里插件对Xcode或者更高版本不工作。 新的Xcode 8扩展API是不可靠的,。 因为它不会添加任何不存在的功能,所以 Xcode 8扩展不会被释放。...

    Qt Creating C++ Plugins for QML on iOS (static plugin)

    Qt是跨平台的应用程序开发框架,而QML则是Qt的一个重要组成部分,它允许开发者用JSON语法来定义用户界面和逻辑。在iOS环境下,创建静态插件可以确保应用的轻量化和更高效的性能。 首先,理解“静态插件”意味着插件...

    cocoapods-xcode-plugin插件

    CocoaPods Xcode 插件是一款针对iOS和macOS开发者设计的强大工具,它扩展了Xcode的功能,使得管理CocoaPods库变得更加便捷。CocoaPods是Objective-C和Swift项目的依赖管理器,它允许开发者通过简单的命令行界面来...

    Google Plugin for Eclipse 4.2(GPE)

    《Google Plugin for Eclipse 4.2...总的来说,Google Plugin for Eclipse 4.2是GWT开发者不可或缺的工具,它将Eclipse的强大功能与GWT的灵活性相结合,提供了一站式的解决方案,助力开发者打造出高效、优质的Web应用。

    可视化XCode插件开发者编码工具

    可视化XCode插件开发者编码工具,源码ColorSense for Xcode,开发者编码工具ColorSense for Xcode,ColorSense是一款Xcode插件,能让开发者视觉化地使用UIColor (and NSColor),方便开发者定义颜色。该插件的编辑...

    xcode-maven-plugin-1.4.1.zip

    【标题】"xcode-maven-plugin-1.4.1.zip" 涉及的知识点主要是Xcode Maven插件的版本管理和Maven在iOS开发中的应用。Xcode Maven插件是一个用于集成Maven构建系统与Apple的Xcode IDE的工具。版本1.4.1可能包含了一些...

    google web toolkit developer plugin for firefox20.0

    总的来说,"google web toolkit developer plugin for firefox20.0"是为那些使用GWT框架开发Web应用的程序员准备的,它提供了一个在Firefox 20.0版本中高效调试和测试代码的环境。这个插件简化了开发流程,提高了...

Global site tag (gtag.js) - Google Analytics