iOS原生項(xiàng)目擁有熱重載極速調(diào)試--InjectionIII

1. Mac的App Store上下載安裝InjectionIII.

1891642388398_.pic.jpg

2. 打開(kāi)InjectionIII, Open Project, 選擇你的項(xiàng)目目錄.

1911642388527_.pic.jpg

3. 選擇的項(xiàng)目會(huì)在Open Recent中出現(xiàn), 保持File Watcher的選項(xiàng)勾選.

  • 支持選擇多個(gè)項(xiàng)目。切換項(xiàng)目的同時(shí)必須去Open Recent再次點(diǎn)擊,文件順序會(huì)隨之變化


    1931642388629_.pic.jpg

4. 在AppDelegate的DidFinishLaunchingWithOptions配置InjectionIII的路徑

/// Object -C
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
#ifdef DEBUG

    //InjectionIII 注入
    [[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"] load];

#else

#endif
    return YES;
}

/// Swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle")?.load()
        return true
    }

5. 在需要?jiǎng)討B(tài)調(diào)試的頁(yè)面控制器中寫上injected方法, 把需要操作的UI方法添加到injected中執(zhí)行

  • injected 方法內(nèi)可以調(diào)用view的生命周期或者視圖初始化和 其他操作扁瓢,cmd + s 即可看到效果
// Objective-C:
- (void)injected {
    #ifdef DEBUG
        NSLog(@"I've been injected: %@", self);
        self.view.backColor = xxxxx;
    #endif    
}


// Swift
@objc func injected() { 
    #if DEBUG 
        print("I've been injected: \(self)")
        self.view.backColor = xxxxx
    #endif 
}

6. 重新編譯項(xiàng)目, 控制臺(tái)可以看到

  • 下面的只是警告, 作者在Issue中已經(jīng)解釋, 不耽誤正常使用.
  • 先在Xcode Command+R運(yùn)行一下你的項(xiàng)目了赵,控制臺(tái)提示如下信息旧烧,即表示InjectionIII連接成功,連接成功的話InjectionIII標(biāo)志會(huì)由藍(lán)變橙(可能不同InjectionIII版本顏色不太一樣)。


    1941642389193_.pic.jpg

7. 修改完UI, 直接cmd + S就能看到效果, 部分頁(yè)面可能耗時(shí)比較久或無(wú)法使用, 正常頁(yè)面均能使用.

8. 注意點(diǎn):

  • InjectionIII工具只對(duì)模擬器有效,真機(jī)無(wú)效牛柒。
  • 在injected方法里面修改的代碼堪簿,再次Command+R運(yùn)行時(shí)不會(huì)起作用。因?yàn)榇a里面只聲明了injected方法皮壁,并沒(méi)有去調(diào)用椭更,所以不會(huì)生效;我們Command+S保存代碼后生效蛾魄,是因?yàn)樵诒4婧笸ㄟ^(guò)InjectionIII工具讀取injected方法里面修改的代碼虑瀑,“告訴”模擬器哪兒修改了,是InjectionIII起的作用滴须。因此我們需要把修改的代碼放到合適的位置舌狗,讓程序一運(yùn)行就會(huì)執(zhí)行。

9. Flutter Hot Reload介紹

  • Flutter是Google開(kāi)發(fā)的一個(gè)跨平臺(tái)開(kāi)發(fā)框架, 調(diào)試也是快速實(shí)時(shí)的.
  • 在Flutter編輯器中修改文字代碼后, 點(diǎn)擊reload, App不用重啟, 模擬器的內(nèi)容就會(huì)立刻改變.
    Flutter實(shí)現(xiàn)實(shí)時(shí)編譯的原理
  • Flutter會(huì)在點(diǎn)擊reload時(shí)取查看上次編譯以后改動(dòng)過(guò)的代碼, 重新編譯涉及到的代碼庫(kù).
  • 重新編譯過(guò)的庫(kù)會(huì)轉(zhuǎn)換成內(nèi)核文件發(fā)到Dart VM里, DartVM會(huì)重新加載新的內(nèi)核文件,
  • 加載后會(huì)讓Flutter framework觸發(fā)所有的Widgets和Render Objects進(jìn)行重建描馅、重布局把夸、重繪.
  • Flutter為了能夠支持跨平臺(tái)開(kāi)發(fā), 使用了自研的Dart語(yǔ)言配合在App內(nèi)集成Dart VM的方式運(yùn)行Flutter程序.

10. iOS原生項(xiàng)目擁有Flutter熱重載的原理

  • Injection工具可以動(dòng)態(tài)地將iOS代碼在已運(yùn)行的程序中執(zhí)行, 不用重啟.
  • Injection會(huì)監(jiān)聽(tīng)源代碼文件的變化, 如果文件被改動(dòng)了,
  • Injection Server就會(huì)執(zhí)行rebuildClass重新進(jìn)行編譯而线、打包成動(dòng)態(tài)庫(kù).dylib文件,
  • 編譯铭污、打包成動(dòng)態(tài)庫(kù)后, 使用writeString方法通過(guò)Socket通知運(yùn)行的App.
- (BOOL)writeString:(NSString *)string {
    const char *utf8 = string.UTF8String;
    uint32_t length = (uint32_t)strlen(utf8);
    if (write(clientSocket, &length, sizeof length) != sizeof length ||
        write(clientSocket, utf8, length) != length)
        return FALSE;
    return TRUE;
}
  • Server會(huì)在后臺(tái)發(fā)送和監(jiān)聽(tīng)Socket消息, Client也會(huì)開(kāi)啟一個(gè)后臺(tái)去發(fā)送和監(jiān)聽(tīng)Socket消息.
  • Client接收到消息后會(huì)調(diào)用inject(tmpfile: String)方法, 運(yùn)行時(shí)進(jìn)行類的動(dòng)態(tài)替換(新類動(dòng)態(tài)替換舊類).
  • dlopen會(huì)把tmpfile動(dòng)態(tài)庫(kù)文件載入運(yùn)行的App里, 返回指針dl.
  • 接下來(lái), dlsym會(huì)得到tmpfile動(dòng)態(tài)庫(kù)的符號(hào)地址, 然后就可以處理類的替換工作了.
  • 當(dāng)類的方法都被替換后, 我們就可以開(kāi)始重新繪制界面了.
  • 使用動(dòng)態(tài)庫(kù)方式極速調(diào)試, 整個(gè)過(guò)程無(wú)需重新編譯和重啟App.


    a6533a7dca644f8792d5fef0c05bcd3f~tplv-k3u1fbpfcp-watermark.image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市膀篮,隨后出現(xiàn)的幾起案子嘹狞,更是在濱河造成了極大的恐慌,老刑警劉巖誓竿,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磅网,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡筷屡,警方通過(guò)查閱死者的電腦和手機(jī)涧偷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)毙死,“玉大人燎潮,你說(shuō)我怎么就攤上這事《筇龋” “怎么了确封?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)再菊。 經(jīng)常有香客問(wèn)我爪喘,道長(zhǎng),這世上最難降的妖魔是什么纠拔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任秉剑,我火速辦了婚禮,結(jié)果婚禮上稠诲,老公的妹妹穿的比我還像新娘侦鹏。我一直安慰自己候址,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布种柑。 她就那樣靜靜地躺著岗仑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪聚请。 梳的紋絲不亂的頭發(fā)上荠雕,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音驶赏,去河邊找鬼炸卑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛煤傍,可吹牛的內(nèi)容都是我干的盖文。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蚯姆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼五续!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起龄恋,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤疙驾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后郭毕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體它碎,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年显押,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扳肛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乘碑,死狀恐怖挖息,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝉仇,我是刑警寧澤旋讹,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站轿衔,受9級(jí)特大地震影響沉迹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜害驹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一鞭呕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宛官,春花似錦葫松、人聲如沸瓦糕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)咕娄。三九已至,卻和暖如春珊擂,著一層夾襖步出監(jiān)牢的瞬間圣勒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工摧扇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留圣贸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓扛稽,卻偏偏與公主長(zhǎng)得像吁峻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子在张,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容