应用场景
作为一名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()))。
关于未来:是否有一种无需断点,当我们开启调试时候直接操作页面就可以看到哪里的代码在运行,从上面看把定位代码块+断点调试结合起来便可以实现,哪位大神能提供一些实现思路?欢迎各位在评论区提供思路。