Android Studio进阶调试技巧

2020-08-23 00:09:36 浏览数 (1)

| 导语 Android Studio是一个很强大的IDE,有些很牛逼的功能却不太为人所知,这里总结了一些我所知道的进阶调试技巧。

以下内容基于Android Studio 3.5!

一. 实用功能

第一部分先介绍几个实用的功能。

1. Analyze Stack Trace

平时我们拿到用户或者测试提供的Crash堆栈时,我们是怎么定位代码呢?一般我们是人肉找代码,其实有个更快速的方法,即Android Studio提供的Analyze Stack Trace,路径如下:

点击进入,建议先复制堆栈再打开这里,他会自动读剪切板的内容:

然后点OK,如下:

直接就能定位到对应的代码位置,是不是很方便!

当然这里有个前提,如果拿到的堆栈是代码混淆过的,或者工程的代码已经修改过了,定位的代码位置肯定就不准了,其实你人肉搜索代码也一样不准。

2. Run inspection

此功能是Android Studio提供的分析检测功能,即以前的lint,可以分析出工程里无用的资源和引用,路径如下:

然后在弹框里输入要检查的选项即可,选项有很多,这里演示一下无用资源,如下:

耐心等待后,应该可以看到检查结果,如下:

还有其他不少检查的选项可以自己探索一下。

3. Log收折

有时我们为了方便,会在类似getView这样的频繁调用方法打log,如下:

很容易一整屏都是这种log,但又不想代码里把他去掉,这时候就可以用收折功能把这些log 收折起来,如下:

选中想要收折的log里相同的字段,右键选择Fold Lines Like This,如下:

点ok就行,后面log就会自动收折,控制台显示如下:

留意一下这里,除了我们这次新增的关键字外,前面还有一大堆已经帮我们加好的关键字,不出意外的话,平时在控制台看到的系统log里有些是自动收折的,他应该就在这里面,如下:

4. 自动代码提示

假设你写了下面这样的代码:

你的Activity并没有实现ClickListener接口,所以报错很正常,这时你可以自己去完善代码,也有更快的方法,鼠标放在红线的地方,Alt Enter试试,Android Studio会自动出现代码提示:

选择对应的方案,Android Studio就会自动帮你补充需要的代码。

5. Analyze Apk

如果你想看一下最终打包的Apk结构,可以使用Analyze Apk,路径如下:

然后选择对应文件夹下的Apk包即可,如果是通过gradle自动编译出包,Android Studio会自动定位到出包的文件夹下,分析图如下:

这里可以看到dex和资源最终在压缩包里的大小和占比。

如果是外面下的Apk包,可以直接拖到Android Studio,他会自动解析。

6. Layout Inspector

这个工具可以用来抓取当前UI的布局,包括View的当前属性和参数,平时主要有两种用途,一是找陌生页面的某些控件代码,对于一个陌生页面,如果需要在上面修改UI,有时不知道从哪入手,可以通过这个工具找到具体View的id,搜索一下就可以找到布局和代码位置了;二是可以分析View的大小和间距等属性,如果一个View显示不符合预期,代码又看不出啥问题,通过看布局的各属性或许可以找到原因。

这个工具的路径如下:

然后根据提示,选取对应的进程和Activity,就可以显示出结果了,如下:

二. 断点调试

断点调试相信每个开发日常都在用,除了最基本的断点,单步调试等操作,Android Studio的断点调试功能还不止这些,感兴趣请往下看。

秘诀如下,右键一个断点,会出现高级面板,从上往下依次是,Enabled(开关),Suspend(线程挂起),Condition(条件断点),More(断点管理),Enabled很简单,就是启动或暂用一个断点,下面介绍其他几个实用的技巧。

1. Suspend

即线程挂起规则,如果平时没操作过这里,或者不知道有这个选项,其默认选项就是Thread,即断点到达时,当前线程会挂起,这符合App的运行原理,想象你在一个子线程阻塞了,并不会影响其他线程的运行。All代表当断点到达时,所有线程都会被挂起,即整个app都会停止,想象一下,有时候我们在调试一个断点走了好几分钟,走完时发现其他线程都跑了n轮了,很不方便定位问题,这时候就可以选择All试试了。

2. Condition

即条件断点,代表此断点在某个条件满足时才会触发,这是个很强大的功能,大部分时候用不到,但某些场景下会发现很好用。

举个例子,ListView Adapter我们都用过,如下:

如果我们需要调试getView这个方法时,这个断点会很频繁地触发,如果我只是想调试某个position的场景,这时Condition就派上用场了,直接在Condition处输入条件就行(position==10),断点只会在满足此条件下才会触发,输入时Android Studio会自动联想,其上下文就是当前的代码上下文,变量和方法都可以用来作为条件输入,是不是很强大。

3. More

直接点击More,即可进入断点管理面板,如下:

这里主要介绍两个功能,断点分组和Exception。

  • 断点分组

从上图我们可以看到,默认所有断点都铺开列在一起,如果平时经常打点,上百个断点很正常,这里就会显得很混乱,有时想统一禁用某些类的断点都很费劲,这里有两个技巧,一个是使用顶部提供的分包和分类管理,如下:

这里选的是分类管理,即同个类的断点会显示在一起,前面两个分别是分包和分文件管理,可以自己根据需要选择。

另外一个技巧是自定义分组,如下:

shift选择多个断点后右键,Create new创建一个自定义名字的分组(比如某个bug),然后这几个断点就会单独分到自定义的分组下,如下:

  • Exception

即App运行过程中出现Exception的时候,是否要被Android Studio捕获,如下:

Android Studio默认是关闭这个选项的,猜测可能是考虑到性能问题,一般我们通过log也可以快速定位到Exception的位置,但如果要看一下Exception的现场来定位问题,则可以打开这个选项,Android Studio会自动断点在抛Exception的位置。

三. 总结

总结一下,以上只是Android Studio众多功能中的一小部分,如果用得好,可以大大提高开发和调试效率,期待后续挖掘更多的技巧!

0 人点赞