Swift之深入解析如何使用Xcode和LLDB v2修改UI元素
生活随笔
收集整理的這篇文章主要介紹了
Swift之深入解析如何使用Xcode和LLDB v2修改UI元素
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、前言
- 在上一篇博客中,已經(jīng)詳細(xì)地介紹如何使用 LLDB 表達(dá)式修改 UI 元素,具體請(qǐng)參考:Swift之深入解析如何將代碼添加為自定義LLDB命令。
- 在這篇博客中,將繼續(xù)討論相同的問(wèn)題需求,并將重點(diǎn)討論如何最大限度地利用 LLDB 表達(dá)式,如果工具太過(guò)復(fù)雜,那么它就無(wú)法工作并獲得用戶(hù)的采用,出于這個(gè)原因,本文將分享一些使 LLDB 表達(dá)式更容易使用的替代方法。
二、命令別名
- 首先,必須輸入(或復(fù)制)這個(gè)長(zhǎng)度的命令(例如 po [[[UIApplication sharedApplication] keyWindow] recursiveDescription])可能會(huì)阻礙開(kāi)發(fā)者使用這些 LLDB 命令。幸運(yùn)的是,這個(gè)問(wèn)題有解決方案,它被稱(chēng)為命令別名,惟一需要做的就是編輯位于 ~/.lldbinit 目錄中的文件,Lldbinit(或者通過(guò)鍵入 touch ~/.lldbinit 創(chuàng)建它),并添加如下命令:
- 前兩個(gè)命令在Swift之深入解析如何將代碼添加為自定義LLDB命令已經(jīng)介紹使用過(guò),第一個(gè)是打印視圖層次結(jié)構(gòu),獲取按鈕的內(nèi)存地址,第二個(gè)是刷新 UI。
- 最后一個(gè)命令演示了如何使用 regex 創(chuàng)建帶參數(shù)的命令,在這個(gè)特定的情況下,需要一個(gè)內(nèi)存地址和顏色的名稱(chēng)(blueColor),結(jié)果按鈕的背景顏色將會(huì)改變。例如,運(yùn)行 change_color 0x7f9f7e40cd70 blueColor 并刷新將導(dǎo)致將按鈕的背景顏色更改為藍(lán)色。
- 使用別名將提高使用此工具的可能性,但在某些情況下需要更高級(jí)的別名。比如說(shuō),如何通過(guò)按鈕標(biāo)簽的文本找到按鈕的內(nèi)存地址。在這種情況下,Python 可以提供可擴(kuò)展性。
三、LLDB 與 Python
- 現(xiàn)在開(kāi)始編寫(xiě) Python 命令的一個(gè)簡(jiǎn)單方法是使用 Xcode 控制臺(tái),輸入命令腳本添加幫助并遵循說(shuō)明:
- 或者,可以創(chuàng)建一個(gè)腳本文件,它可以添加到回收和版本控制系統(tǒng)中,然后在 Xcode 控制臺(tái)上運(yùn)行命令 command script import <script_file_path>,或者更好的方法是將它添加到 ~/.lldbinit 文件中。
- 要寫(xiě)一個(gè) Python 函數(shù)用作新的 LLDB 命令,需要實(shí)現(xiàn)一個(gè)帶有四個(gè)參數(shù)的函數(shù):
- 根據(jù) LLDB python 參考,這些變量的類(lèi)型和描述如下:
-
- debugger (類(lèi)型:lldb.SBDebugger):當(dāng)前調(diào)試器對(duì)象;
-
- command (類(lèi)型:python string):一個(gè)包含命令所有參數(shù)的 Python 字符串,如果需要分割參數(shù),請(qǐng)嘗試使用 shlex 模塊的 shlex.split(命令)來(lái)正確地提取參數(shù);
-
- result (類(lèi)型: lldb.SBCommandReturnObject):一個(gè)返回對(duì)象,它封裝了命令的成功/失敗信息,以及作為命令結(jié)果需要打印的輸出文本,普通的 Python“print” 命令也可以工作,但默認(rèn)情況下文本不會(huì)進(jìn)入結(jié)果(它作為臨時(shí)日志記錄工具很有用);
-
- internal_dict (類(lèi)型:python dict object): 當(dāng)前嵌入腳本會(huì)話的字典,其中包含所有變量和函數(shù)。
- 如果使用命令腳本導(dǎo)入方法,可以像下面這樣定義 __lldb_init_module 函數(shù):
- 其中調(diào)試器和 internal_dict 如上所述,當(dāng)加載模塊時(shí),這個(gè)函數(shù)將被調(diào)用,允許在當(dāng)前調(diào)試器中添加任何想要的命令。debugger.HandleCommand 的參數(shù)描述如下:
-
- command script add:使用 LLDB 命令添加腳本;
-
- -f argument:指定命令將執(zhí)行的 Python 函數(shù)的名稱(chēng),它遵循的格式:{module name}.{function name};如同上面的例子中:
-
-
- filter:是模塊的名稱(chēng)(在 Python 中只是不帶 .py 擴(kuò)展名的文件名);
-
-
-
- filter_button_by_label:命令功能,描述同 command_function(debugger, command, result, internal_dict)) 一致;
-
-
- argument(例如 filter_button_by_label):是 Xcode 控制臺(tái)中用來(lái)調(diào)用此函數(shù)的命令。
- 如下所示,展示了一個(gè)如何從按鈕標(biāo)簽的文本中獲取按鈕內(nèi)存地址的示例:
- 它可以像 filter_button_by_label -n “Press me” 這樣調(diào)用,它會(huì)返回那個(gè)按鈕的內(nèi)存地址。因此改變按鈕顏色的整個(gè)流程就變成:
- 與第一個(gè)實(shí)現(xiàn)相比,代碼更短,更容易記憶,因此更容易使用。
四、Chisel
- 除此之外,Facebook 已經(jīng)提供了一個(gè)名為 Chisel 的開(kāi)源 LLDB 命令集,它提供了大量的命令,可能解決了任何 iOS 開(kāi)發(fā)者可能面臨的大多數(shù)問(wèn)題。
- 如下所示,個(gè)人最喜歡的兩個(gè)命令:
-
- findinstances:可以用來(lái)查找指定 ObjC 類(lèi)的實(shí)例;
-
- pcurl:它可以被用來(lái)打印作為 curl 命令的 NSURLRequest,稍后可以用于調(diào)試目的。
總結(jié)
以上是生活随笔為你收集整理的Swift之深入解析如何使用Xcode和LLDB v2修改UI元素的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Swift之深入解析如何将代码添加为自定
- 下一篇: iOS逆向之Protocol Witne