應用場景
作爲一名Android開發者,肯定有不少如下的經歷:
1 新接手一個項目,需要熟悉某一個頁面的實現代碼,但不知道從哪裏開始;
2 用戶點擊某一個控件時候app運行異常,修復bug時候發現對這部分代碼不熟,無法快速切入。
這些問題有一個共性,那就是跟用戶界面UI關聯比較密切。如何能夠快速知道這個頁面是哪一個activity或者fragment,如何快速找到這些UI操作背後的邏輯代碼所在位置?本文就這種問題跟大家進行探討。如有好的方法或者點子,歡迎在評論區流。
UI代碼塊定位
一 快速定位到控件ID
工具:Android Studio 3.0以上版本
步驟一: USB連接手機;
步驟二: 打開需要定位的頁面;
步驟三: Android Studio -》Tools-》Layout Inspector;
步驟四: 選擇進程,進程名就是你的應用名稱 ,可以去AndroidManifest查看;
步驟五: 選擇Window如果不知道選哪個可以用ADB命令(adb shell "dumpsys activity | grep mFocusedActivity")看下當前Activity是哪一個,一般我們選最下面的(棧頂Activity)。
步驟六: 查找控件Id,點擊右側控件,便可以在左側看到該控件對應的Resource Id和相關屬性;
步驟七: 根據ResourceId 全局搜索(Android 默認搜索ctrl+shift+R)
步驟八: 我們找到了兩個地方用到該ID
1佈局XML中用的 ,2 java代碼中調用;點進去便可以看到修改密碼的邏輯。
二 快速定位當前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。
其他方案
搜索字符串快速定位方法
工具:Android Studio
一般每個UI控件都有字符串,比如上面的“修改密碼”Button
步驟一: 全局搜這個字符串“修改密碼”、查找到它的資源ID;
步驟二: 然後逐個查看調用這個字符串和它的資源Id的位置、並判斷是否是我們當前的頁面。
步驟三:反覆通過全局搜+findUsage最終找到界面代碼塊位置。
這種方法也是一種很通用的方法,但是有時間會遇到調用地方過多、不好判斷。
特殊log定位
工具 Android studio
在開發過程中發現了、很多應用集成了Bugly,該三方庫會打出Activity生命週期。在Android Studio logcat中用關鍵字“CrashReport”過濾log,當我們操作連接好的手機時候便可以看到集成了bugly應用的一些log,從下面log可以看到我們每個操作頁面對應的Activity的生命週期。
關於定位問題的設想
接上面我們一旦定位到是哪一個代碼塊運行,便可以打斷點,利用Debuger一步步去逼近錯誤代碼,也可以通過打log和trace去逼近錯誤代碼。Trace Log 類似這種:Log.d(TAG, "onCreate"+Log.getStackTraceString(new Throwable()))。
關於未來:是否有一種無需斷點,當我們開啓調試時候直接操作頁面就可以看到哪裏的代碼在運行,從上面看把定位代碼塊+斷點調試結合起來便可以實現,哪位大神能提供一些實現思路?歡迎各位在評論區提供思路。