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