兩分鐘定位到UI相關問題程式碼塊
應用場景
作為一名 Android 開發者,肯定有不少如下的 經歷:
1 新接手一個專案,需要熟悉某一個頁面的實現程式碼,但不知道從哪裡開始;
2 使用者點選某一個控制元件時候app執行異常,修復bug時候發現對這部分程式碼不熟,無法快速切入。
這些問題有一個共性,那就是跟 使用者介面UI 關聯比較密切。如何能夠快速知道這個頁面是哪一個activity或者fragment,如何快速找到這些UI操作背後的邏輯程式碼所在位置?本文就這種問題跟大家進行探討。如有好的方法或者點子,歡迎在評論區流。
UI程式碼塊定位
一 快速定位到控制元件ID
工具:Android Studio 3.0以上版本
步驟一:USB連線手機;
步驟二:開啟需要定位的頁面;
步驟三:Android Studio -》Tools-》Layout Inspector;

picture1.png
步驟四:選擇程序,程序名就是你的應用名稱 ,可以去AndroidManifest檢視;

picture2.png
步驟五:選擇Window如果不知道選哪個可以用ADB命令(adb shell "dumpsys activity | grep mFocusedActivity")看下當前Activity是哪一個,一般我們選最下面的(棧頂Activity)。

picture3.png
步驟六:查詢控制元件Id,點選右側控制元件,便可以在左側看到該控制元件對應的Resource Id和相關屬性;

picture4.png
步驟七:根據ResourceId 全域性搜尋(Android 預設搜尋ctrl+shift+R)

picture5.png
步驟七:我們找到了兩個地方用到該ID
1佈局XML中用的 ,2 java程式碼中呼叫;點進去便可以看到修改密碼的邏輯。

picture6.png
二 快速定位當前Fragment
工具:ADB工具
步驟一:USB連線手機;
步驟二:開啟需要定位的頁面;
步驟三:ADB命令列輸入:adb shell dumpsys activity top or adb shell dumpsys activity 你應用的包名。例如:adb shell dumpsys activity com.ecology.view
步驟四:我們把打出來的資訊Copy出來到文字編輯器比如(Notepad++)搜尋關鍵字 Added Fragments、便得到了該Activity相關的Fragment資訊、再根據當前序列號,很容易知道當前是哪個Fragment。

picture7.png
其他方案
搜尋字串快速定位方法
工具:Android Studio
一般每個UI控制元件都有字串,比如上面的“修改密碼”Button
步驟一:全域性搜這個字串“修改密碼”、查詢到它的資源ID;
步驟二:然後逐個檢視呼叫這個字串和它的資源Id的位置、並判斷是否是我們當前的頁面。
步驟三:反覆通過全域性搜+findUsage最終找到介面程式碼塊位置。
這種方法也是一種很通用的方法,但是有時間會遇到呼叫地方過多、不好判斷。
特殊log定位
工具 Android studio
在開發過程中發現了、很多應用集成了Bugly,該三方庫會打出Activity生命週期。在Android Studio logcat中用關鍵字“CrashReport”過濾log,當我們操作連線好的手機時候便可以看到集成了bugly應用的一些log,從下面log可以看到我們每個操作頁面對應的Activity的生命週期。

picture8.png
關於定位問題的設想
接上面我們一旦定位到是哪一個程式碼塊執行,便可以打斷點,利用Debuger一步步去逼近錯誤程式碼,也可以通過打log和trace去逼近錯誤程式碼。Trace Log 類似這種:Log.d(TAG, "onCreate"+Log.getStackTraceString(new Throwable()))。
關於未來:是否有一種無需斷點,當我們開啟除錯時候直接操作頁面就可以看到哪裡的程式碼在執行,從上面看把定位程式碼塊+斷點除錯結合起來便可以實現,哪位大神能提供一些實現思路?歡迎各位在評論區提供思路。