App调试的几个命令实践

App调试的几个命令实践

在Android的应用开发中,我们会用到各种代码调试;其实在Android的开发之后,我们可能会碰到一些随机的问题,如cpu过高,内存泄露等,我们无法简单的进行代码调试,我们需要一个系统日志等等,下面我把握工作中碰到的几个常用命令和方法给大家演示实践一下。

  1. logcat命令

    这个命令最简单常用,可查看帮助,我不多说,如果需要打印时间,加参数-v time

    adb logcat -v time

  2. bugreport命令

    这个命令也非常简单,但是在实际应用中非常有用,会有从开机之后详细的dumpsys,dumpstate和logcat信息,是一份完整的日志记录。对分析用户行为,异常信息,系统状态有很大的参考作用。一般我们会把bugreport导出到电脑上分析。

    adb bugreport > xxx.log

  3. dumpsys命令

    这个查看系统信息,用的还是比较多的。

    dumpsys [options]
                   meminfo 显示内存信息
                   cpuinfo 显示CPU信息
                   account 显示accounts信息
                   activity 显示所有的activities的信息
                   window 显示键盘,窗口和它们的关系
                   wifi 显示wifi信息
    

    例如查看某个程序内存信息:

    #查看应用com.tianxia.test的内存使用情况
    adb shell dumpsys meminfo com.tianxia.test
    

    效果图如下:
    dumpsys
    里面的信息很有价值,尤其对于分析内存泄露,内存溢出都有极大的作用。

  4. top命令

    这个查看cpu信息太方便了。

    top -m 5 -t
    我们看看效果图,其中按cpu大小列出5个进程列表: top
    com.tianxia.test的cpu过高,会导致手机发烫。同时利用这个信息,可以监控应用cpu的使用,以调整优化代码。

  5. 配置文件local.prop

    目前网上没有查到local.prop的配置使用,工作中本人只使用过如下:

    log.tag.SQLiteStatements=VERBOSE log.tag.SQLiteTime=VERBOSE
    把上述文本加到/data/local.prop中,如果没有这个文件自行创建。然后重启手机,就能看到每个应用详细的查询数据库的sql语句信息,对于调试数据库,分析和优化数据库sql异常非常有用。

  6. 分析手机发烫

    下面我们来实践一个例子,手机发烫太厉害,怎么找出问题?
    首先我们写一个程序com.tianxia.test,死循环,核心代码如下:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        while(true) {
            System.currentTimeMillis();
        }
    }
    

    这个应用打开后会一直获取系统时间,因为在主线程,肯定导致应用ANR,也会一直浪费系统cpu,手机发热,我们运行它。
    假设我们不知道上述代码,我们来找到这个问题:

    1. 找到发烫的应用

      使用top命令:

      top -m 5 -t
      top
      一看是com.tianxia.test占用85%的cpu,原来是这家伙在捣鬼。进程ID是644,这个后面我们有用。

    2. 分析发烫的应用进程在干嘛

      需要用到linux下的strace命令,但是android是没有集成这个命令的,自行下载:

      下载完成后,上传到手机中:

      我们adb push strace /system/bin,在模拟器上是上传到/system/bin会报out of memory错误,我们也可以上传到/data目录下,如果没有执行权限,还需要chmod 777 strace.
      strace命令有很多参数,直接执行strace会显示使用说明:

      strace

      其中-p参数输入的就是进程号,第一步中我们找到com.tianxia.test的进程ID是644,我们看看这个应用占用这么高的cpu在干嘛?

      strace -p 644

      输出如下:
      strace -p结果
      它的系统调用一直是gettimeofday,一直输出这个,显然哪里一定进入死循环了,而且是获取时间的死循环,然后结合logcat和代码,定位这段代码(就是前面我们给出的那段代码了)解决这个bug。

  7. 采集手机的cpu运行情况.

    有时使用日志我们很难针对性的获取我们想要的信息,我们可能需要写一些最简单的脚本放在手机里面执行。
    如监控cpu占用的记录cpu_log.sh:

    # !/system/bin/sh
    #这个脚步比较粗糙,是这么个意思
    file=/sdcard/cpu/cpu_info.log
    rm $file
    until [ 1 -gt 10000 ]
    do
    echo -e "\n\n\n\n\n---------------">>$file
    date >> $file
    top -m 5 -n 1 >> $file
    sleep 3
    done
    

    每隔3s中就会把手机的cpu的信息写到sdcard的cpu目录下的cpu_info.log文件中,方便我们后续分析。
    ps:使用方法是 push到data目录下,赋予可执行权限,在shell下执行即可。

  8. 采集某个应用的内存数据

    这个实践和上面的脚本类似,只是命令不一样我另外单独列出来,因为这个有时候很有用。
    比如,我们要采集com.tianxia.test的内存使用情况,分析它是不是会内存泄露,脚本类似:

    # !/system/bin/sh
    #这个脚步比较粗糙,是这么个意思
    file=/sdcard/cpu/mem_info.log
    rm $file
    until [ 1 -gt 10000 ]
    do
    echo -e "\n\n\n\n\n---------------">>$file
    date >> $file
    dumpsys meminfo com.tianxia.test >> $file
    sleep 3
    done
    

    使用方法也是一样。

原文地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值