** iOS Swift 通过注入动态库的方式实现极速编译调试(InjectionIII、热重载、热编译)原理解析**
一、安装 与 使用
-
直接去App Store 搜
15681676430581.jpg -
运行 InjectionIII
15681678306425.jpg -
在工程中添加代码
在工程中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
添加代码
#if DEBUG
//or oc
[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"] load];
//or swift
Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle")?.load()
//for tvOS:
Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/tvOSInjection.bundle")?.load()
//Or for macOS:
Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/macOSInjection.bundle")?.load()
#endif
- 运行工程
- 会弹出提示框选择工程文件路径,或者手动选择工程路径
- 控制台会出现如下
💉 Injection connected, watching /Users/diaohongrui/wandafilm-movie/**
eg: 当更改背景颜色 刷新 comend + s 保存 就会实现热更新
-
运行原理
InjectionIII 分为server 和 client部分,client部分在你的项目启动的时候会作为 bundle load 进去,server部分在Mac App那边,server 和 client 都会在后台发送和监听 Socket 消息,实现逻辑分别在 InjectionServer.mm 和 InjectionClient.mm 里的 runInBackground 方法里面。InjectionIII 会监听源代码文件的变化,如果文件被改动了,server 就会通过 Socket 通知 client 进行 rebuildClass 重新对该文件进行编译,打包成动态库,也就是 .dylib 文件。然后通过 dlopen 把动态库文件载入运行的 App 里,接下来 dlsym 会得到动态库的符号地址,然后就可以处理类的替换工作。当类的方法被替换后,我们就可以开始重新绘制界面了。整个过程无需重新编译和重载 App,使用动态库方式极速调试的目的就达成了。
运行原理图
15681706419624.jpg
网友评论