抓取Android APP崩溃和无响应日志的小工具

前言

在Android APP的测试过程中经常遇到crash和anr,开发人员习惯通过eclipse或者eclipse的ddms组件进行捕抓日志,测试人员常通过在dos窗口下adb命令的方式来抓取日志。前者的缺点是启动时非常耗时,后者呢则每次都要写命令也比较麻烦(需要截图时也存在这个问题)。针对这样的情况,本文分享一个通过adb程序与bat命令组合的技巧来抓取日志,只要3~5秒即可获取崩溃日志,非常快捷。

1. 准备工作

一、安装JDK(好像不装也没关系,未实测)和ADB(V1.0.31版本或以上),网上很多指导方法,这里就赘述了。

二、在PATH环境变量中添加ADB路径。这样就能在任意地方调用ADB命令,如adb.exe的位置在c:\adb\adb.exe,则在path中加入c:\adb。

2. 制作捕获日志的批命令

一、制作捕获crash异常的批命令

将以下命令复制,制作成logcat.bat文件。logcat.bat可以放置任意位置(如:桌面)。

@ECHO OFF
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
SET timeStamp=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2%
SET mutID=_mut
@ECHO ON
adb logcat -v time > .\"%mutID%_%timeStamp%_logcat.log"
pause

原理:

该工具的原理是bat文件调用adb工具,将手机运行日志拉到本地,并将实时日志也记录到本地。

用法:

当手机需要重现crash、或者x分钟内已经发生过crash(x≈15~30),点击此bat,logcat命令会将手机的logcat日志拉下来并实时记录,直到你关闭cmd窗口。然后在拉下来的txt中寻找fatal字眼,附近上下文即为crash日志。

二、制作捕获ANR异常的批命令

anr:Application Not Responding -- 程序无响应。

将以下命令复制,制作成“ANR捕获.bat”文件。“ANR捕获.bat”可以放置任意位置(如:桌面)。

@ECHO OFF
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
SET timeStamp=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2%
SET mutID=_mut
@ECHO ON
adb pull data/anr/traces.txt traces_%timeStamp%.txt

原理:

同上,将手机的traces.txt拉到本地。手机发生anr之后可以用,但一般用不上。

三、优点与限制

  1. 手机无需root
  2. 无需eclipse支持
  3. 方便保存、查找日志
  4. 实时日志不能在cmd窗口回显

3. 演示

以抓取crash异常为例:

步骤1:将android手机连接电脑,开启开发者模式并允许usb调试;

步骤2:运行logcat.bat文件,会出现cmd窗口;

步骤3:①如果手机程序已经发生过crash,5秒后关闭cmd窗口;②如果是想重现crash,则在手机端重现后即可关闭cmd窗口。

步骤4:在logcat.bat的同级目录下会生成一份log文件,从文件中搜查FATAL关键字,便可找到崩溃代码。

4. 代码注释

在这个工具里,因为想用“截图+系统当前日期”的格式来命令日志文件,所以采用了bat命令中的一个函数“timeStamp”。

最初的写法:

set timeStamp=%date:/=-%_%time%echo %timeStamp%
>2018-01-23_11:23:44.43

这个语句能实现我们的要求,但这样写会引发两个严重的问题:

1、10点前的timeStamp会出现空格;

2、%date%和%time%都是直接读windows的时间格式(也就是右下角的那个时间格式),会出现不通用的结果。

改进后的方案:

采用wmic来格式化时间,得出YYYYMMDDHHMinSec,这样就不会出现任何格式问题,代码如下:

@echo offfor /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"echo %dt:~0,14%
>20180123112344

然后在此基础上加各种分隔符:

@echo offfor /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"echo %dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2%>2018-01-23_11-23-44

完毕

原文发布于微信公众号 - 软件测试经验与教训(udatest)

原文发表时间:2019-01-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券