经过 "adb shell am start" 遍历安卓应用全部的 Activity,能够检查是否存在空指针的状况。node
如下为梳理后的测试流程:python
写了个脚本将以上步骤串了起来。android
运行方式:shell
前提条件:bash
运行示例:
微信
脚本以下:
check_nullpointer.shapp
#!/usr/bin/env bash # 若是有反编译后的文件夹存在,先清空当前环境 if [[ -d "apkFile" ]]; then rm -r AC_list_filter Activity_List apkFile log.txt all_log.txt fi # 当前路径 WORKSPACE=`pwd` # apk地址 echo "Please enter the apk file address:" read apk_address # 经过aapt获取包名 pkg_name=$(aapt dump badging ${apk_address} | grep package: | sed 's/ //g' | tr -d $'\r' | cut -d"'" -f2) # 经过apktool反编译,反编译后的文件输出到apkFile文件夹 apktool d ${apk_address} -o apkFile # 获取安卓manifest文件 ANDROID_MANIFEST=${WORKSPACE}/apkFile/AndroidManifest.xml # 经过FindActivity.py获取Activity列表 python FindActivity.py ${ANDROID_MANIFEST} # 删除包含"loader.a.ActivityN1/loader.a.ActivityP0/loader.a.ActivityP1/loader.a.ActivityP2"的Activity sed '/loader.a.ActivityN1/d;/loader.a.ActivityP0/d;/loader.a.ActivityP1/d;/loader.a.ActivityP2/d' Activity_List > AC_list_filter # 运行NullPointer.py,遍历启动activity,输出log在指定文件夹 echo "Starting..." python NullPointer.py ${pkg_name} # 所有log adb logcat -d -v threadtime > ${WORKSPACE}/all_log.txt # error log adb logcat -d -v long "AndroidRuntime:E" "*:S" > ${WORKSPACE}/log.txt echo "log文件:${WORKSPACE}/log.txt"
FindActivity.pydom
import xml.dom.minidom as minidom import sys def find_activities(filePath): xml = minidom.parse(filePath) root = xml.getElementsByTagName('manifest') appNode = None for node in root[0]._get_childNodes(): if(node._get_localName() == "application"): appNode = node break content = '' for item in appNode._get_childNodes(): if(item._get_localName() == 'activity'): content = content + item.getAttribute("android:name") + '\n' fs = open("Activity_List", 'w') fs.write(content) fs.close() if __name__ == '__main__': filePath = sys.argv[1] find_activities(filePath)
NullPointer.py测试
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys import time import threading # 当前路径 PATH = sys.path[0] # 应用包名 PKG_NAME = sys.argv[1] # 先判断设备是否链接 os.popen("adb wait-for-device") # 遍历文件得到activities 的值 def CheckNullPoint(): f = open(PATH + "/" + "AC_list_filter", "r") for line in f.readlines(): os.popen('adb shell am start -n %s/%s' % (PKG_NAME, line)) # print("adb shell am start -n %s/%s" % (PKG_NAME, line)) time.sleep(3) f.close() # back键退出应用 def quit_app(): os.popen('adb shell input keyevent 4') # 清空log def clear_log(): os.popen('adb logcat -c') clear_log() CheckNullPoint() print "Success" # back键退出应用 for i in range(10): quit_app()
欢迎关注微信公众号"测试开发Stack"ui