美文网首页
android log分析

android log分析

作者: 良人_Coder | 来源:发表于2019-12-20 11:49 被阅读0次

    date: 2019-12-19
    email: panzh8266@163.com
    github: https://github.com/Jess-Pan


    coffe.jpg

    1. monkey 跑测常见问题

    monkey跑测一般会发生在硬件更换物料(内存、存储)后,需要进行一次跑测来确认物料的稳定性,提供该料是否可以用于生产的依据。作为系统软件开发,需要协助测试分析log文件内容,着重关注系统核心服务的存活状态、输出log是否为乱码、kernel层的报错等等会导致系统关机、重启、卡死等现象的问题

    1.1 手机断电

    • kernel_log 中会有如下报错
    <12>[22737.747509]  (2)[278:health@2.0-serv]healthd: battery l=0 v=3084 t=37.0 h=2 st=2 c=2042 fc=1397000 cc=0 chg=u
    

    1.2 大量核心服务死亡

    • main_log 中可以看到大段的核心服务死亡,一般为系统进程崩溃,watchdog自发的重启服务,伴随着有预兆的重启

      01-01 16:46:23.909   203   203 I ServiceManager: service 'sim_manager' died
      01-01 16:46:23.909   203   203 I ServiceManager: service 'content' died
      01-01 16:46:23.909   203   203 I ServiceManager: service 'powerguru' died
      01-01 16:46:23.909   203   203 I ServiceManager: service 'sensorservice' died
      01-01 16:46:23.909   203   203 I ServiceManager: service 'power' died
      01-01 16:46:23.909   203   203 I ServiceManager: service 'gfxinfo' died
      01-01 16:46:23.909   203   203 I ServiceManager: service 'permission' died
      01-01 16:46:23.909   203   203 I ServiceManager: service 'telephony.registry' died
      01-01 16:46:23.909   203   203 I ServiceManager: service 'telephony.registry0' died
      01-01 16:46:23.909   203   203 I ServiceManager: service 'procstats' died
      01-01 16:46:23.909   203   203 I ServiceManager: service 'bluetooth_manager' died
      

    1.3 异常掉电

    • 所谓异常掉电就是电池在操作过程中突然掉落,或者电源接线处本身接触不良
    • 测试现象突兀,使用过程中突然黑屏(关机 / 黑屏卡死 / 重启),重启的主要原因为硬件可能做了掉电保护,让系统重启;若是没有做掉电保护现象一般不包括重启,不同的测试人员对该现象描述不同,还需要进行现场确认
    • 判断方式
      1. main_log 中没有关机预兆,没有系统服务大量死亡现象
      2. kernel_log 同样没有关机预兆,没有panic,没有error

    1.4 watchdog 引起的系统重启

    watchdog 本身分为硬件看门狗和软件看门狗,我们正常看到的属于软件看门狗的范畴,它会在system_server发生死锁、程序跑飞时,杀死系统进程,然后重新启动system_server,让系统从不正常的状态回到工作状态中。这个过程我们称为软件重启,这个过程会输出一些制式的log

    当然,偶尔也会看到硬件看门狗,log输出信息类似,但是会明显看到有关于内存地址的报错,出现这样的问题需要联系硬件确定问题报错点。

    软件重启:重启核心服务,不涉及kernel层,上层应用重新启动但是下层依然在运行

    硬件重启:kernel层重启,断电重启

    • kernel_log 中可以找到类似log

      04ECE5 01-02 13:02:55.657  1813  2072 W Watchdog: *** WATCHDOG KILLING SYSTEM PROCESS: Blocked in handler on PackageManager (PackageManager)
      04ECE6 01-02 13:02:55.657  1813  2072 W Watchdog: PackageManager stack trace:
      04ECE7 01-02 13:02:55.658  1813  2072 W Watchdog:     at android.os.BinderProxy.transactNative(Native Method)
      04ECE8 01-02 13:02:55.658  1813  2072 W Watchdog:     at android.os.BinderProxy.transact(Binder.java:790)
      

    1.5 kernel 层报错

    • kernel_log / last_kmsg 会找到类似log
    [29125.251579] -(2)[95:hps_main]---[ end trace f42e54c6cd9c9843 ]---
    [29125.809523] -(2)[95:hps_main]Kernel panic - not syncing: Fatal exception
    [29128.972461] -(2)[95:hps_main]SMP: failed to stop secondary CPUs
    

    这种报错属于驱动层面报错,需要联系驱动定位报错位置

    1.6 log中出现大量乱码

    • 这个判断条件需要首先排除
      1. 异常断电造成的乱码,一般乱码位置为文件末尾
      2. 网络数据传输输出的乱码,因为输出传输一般为字节流,输出即为乱码
      3. 一些加密的log输出

    1.7 monkey启动关机流程

    • 一般我们可以在monkey_log中看到 log
    // Allowing start of Intent { act=com.android.internal.intent.action.REQUEST_SHUTDOWN cmp=android/com.android.internal.app.ShutdownActivity } in package android
    //[calendar_time:2019-01-01 23:36:25.452  system_uptime:40971637]
    

    2. 手动测试常见问题

    2.1 硬件功能问题

    • 确认跑测前该功能是否正常
    • 确认硬件是否安装

    2.2 重载测试,应用失去响应

    • 小内存手机,重载anr属于正常现象
    • 从log中需要观察发生anr时间段的后台任务

    3.3 突然关机

    • 异常掉电

    3. 附上测试常用的monkey命令

    3.1 monkey 系统跑测 (忽略报错)

    adb shell "monkey 
    -p com.google.android.calendar
    -p com.mediatek.camera 
    -p com.android.chrome
    -p com.android.deskclock 
    -p com.android.contacts 
    -p com.facebook.katana 
    -p com.google.android.apps.nbu.files
    -p com.android.gallery3d 
    -p com.google.android.gm.lite
    -p com.google.android.talk 
    -p com.instagram.android 
    -p jp.naver.line.android 
    -p com.google.android.apps.mapslite
    -p com.google.android.apps.messaging
    -p com.android.music 
    -p com.android.dialer 
    -p com.android.vending 
    -p com.tencent.mobileqq 
    -p com.android.settings 
    -p com.skype.raider 
    -p com.tencent.mm 
    -p com.whatsapp 
    -p com.twitter.android 
    -p com.google.android.apps.youtube.mango
    -p com.android.soundrecorder 
    -p com.google.android.play.games
     --throttle 200 --ignore-crashes --ignore-timeouts --ignore-security-exceptions -v 10000000 > /sdcard/monkey.log"
    
    

    3.2 单个应用跑测(不忽略错误)

    adb shell "monkey -p com.mediatek.camera --throttle 200 -v 10000000 > /sdcard/monkey.log"
    

    3.3 个人常用跑monkey脚本

    #!/bin/bash
    readonly time=$(date "+%Y%m%d%H%M")
    readonly defaultCount=100000
    readonly defaultTypeOne="--throttle 200 --ignore-crashes --ignore-timeouts --ignore-security-exceptions"
    readonly defaultTypeTwo="--throttle 200"
    readonly defaultlogUrl="${HOME}/Desktop/${time}"
    readonly defaultlogUrl_SDcard="/sdcard/monkey_log.txt"
    
    read -p "please input packages name: " packages
    if [[ -z ${packages} ]]; then
        # null
        echo "未指定跑测应用包名"
        exit
    fi
    echo "packages : ${packages}"
    echo 
    
    read -p "please input monkey count: " inputCount
    if [[ -z ${inputCount} ]]; then
        count=${defaultCount}
        echo "default count : ${defaultCount}"
    else 
        count=${inputCount}
        echo "count : ${count}"
    fi
    
    echo 
    
    read -p "please choose monkey test type \
    1. ${defaultTypeOne} \
    2. ${defaultTypeTwo} : " inputType
    if [[ -z ${inputType} ]]; then
        type=${defaultTypeOne}
        echo "default type : ${type}"
    elif [[ ${inputType} -eq 1 ]]; then
        type=${defaultTypeOne}
        echo "default type : ${type}"
    elif [[ ${inputType} -eq 2 ]]; then
        type=${defaultTypeTwo}
        echo "default type : ${type}"
    else
        echo "error !"
    fi
    
    echo
    
    read -p "please choose space for monkey_log \
    1. ${defaultlogUrl} \
    2. ${defaultlogUrl_SDcard}: " logUrl
    
    if [[ ${logUrl} -eq 1 ]]; then
        logUrl=${defaultlogUrl}
    
    elif [[ logUrl -eq 2 ]]; then
            logUrl=${defaultlogUrl_SDcard}
            echo "logUrl : ${defaultlogUrl-SDcard}"
            read -p "Are you sure to continue? [y/n] " continue
            case ${continue} in
                [yY]*)
                    adb shell "monkey ${packages} ${type} -v ${count} > ${logUrl}"
                    exit
    
                    ;;
                [nN]*)
                    echo exit
                    ;;
                *)
                    echo "Just"
                    exit
                    ;;
            esac
            
    else
        echo "input error!"
        exit
    fi
    
    echo "logUrl = ${logUrl}"
    echo
    
    read -p "Are you sure to continue? [y/n] " continue
    case $continue in
        [yY]*)
            if [ ! -d ${logUrl} ]; then
                mkdir -p ${logUrl}
                echo "目标文件夹不存在,创建目录 : ${logUrl}"
            else
                echo "目标文件夹存在"
            fi
    
            adb shell monkey -p ${packages} ${type} -v ${count} 2>&1 | tee ${logUrl}/monkey_log.txt 
            ;;
        [nN]*)
            echo exit
            ;;
        *)
            echo "Just input n(N) or y(Y)"
            exit
            ;;
    esac
    

    3.4 打断monkey脚本

    #!/bin/bash
    monkey_pid=`adb shell ps -ef | grep monkey | grep -v "grep" | awk '{print $2}'`
    echo "monkey_pid = ${monkey_pid}"
    if [[ -z ${monkey_pid} ]]; then
        echo "没有monkey在执行"
    else
        adb shell kill ${monkey_pid}
        echo "kill sucessfully"
    fi
    

    相关文章

      网友评论

          本文标题:android log分析

          本文链接:https://www.haomeiwen.com/subject/rmgbnctx.html