通过 "adb shell am start" 遍历安卓应用所有的 Activity,可以检查是否存在空指针的情况。

以下为梳理后的测试流程:

  1. 通过 apktool 反编译 apk(输入参数 apk 路径)
  2. 得到反编译后的 AndroidManifest.xml 文件
  3. 通过 FindActivity.py 得到 Activity_List(activity 列表)
  4. 删除 Activity_List 中含有 "loader.a.ActivityN1/loader.a.ActivityP0/loader.a.ActivityP1/loader.a.ActivityP2" 的 activity(部分 App 反编译后的 activity 列表中有类似名字的无意义 activity,可以删除)
  5. 运行 NullPointer.py,输出 log 在指定文件夹
  6. 手动分析 log

写了个脚本将以上步骤串了起来。

运行方式:

  • sh +x check_nullpointer.sh

前提条件:

  • MacBook
  • python
  • apktool
  • aapt

运行示例:

脚本如下:

check_nullpointer.sh

#!/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.py

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"

Shell脚本 | 健壮性测试之空指针检查的更多相关文章

  1. shell脚本57问

    [1]交互方式.非交互方式.Shell脚本是什么? 经常与linux打交道,肯定对shell这个词不陌生.不明白shell意思的,可以自行翻译:外壳.去壳. 这个翻译结果怎么可以与计算机系统联系起来呢 ...

  2. shell脚本加密方式

    --作者:飞翔的小胖猪 --创建时间:2021年5月17日 --修改时间:2021年5月17日 说明 shell作为Linux操作系统中原生的语言环境,由于其简单.便捷.可以移植等特性常被运维人员作为 ...

  3. Shell脚本 | 性能测试之启动流量

    安卓应用的流量统计有多种方式,点击「阅读原文」可以看到一篇别人写的文章,关于安卓流量数据的获取,写的挺全的,列举了几种不同方式的优劣.(见文末参考链接) 今天我要分享的是通过脚本一键获取应用的启动流量 ...

  4. Shell学习---Shell脚本的静态检查工具shellcheck

    Shell脚本的静态检查工具shellcheck ubuntu下 apt install shellcheck ,即可安装shellcheck.写完shell脚本,记得用它检查一下,能给你点建议的.要 ...

  5. shell脚本检查域名证书是否过期

    最近公司的域名准备过期了,防止用户访问的时候出现异常,所以最近我们准备替换相关网站证书为最新的. (一般HTTPS证书有效期为1年,证书过期后或者该证书不是该域名的有效证书时,在浏览器中访问会出现如下 ...

  6. 小白日记7:kali渗透测试之主动信息收集-发现(一)--二层发现:arping/shell脚本,Netdiscover,scapy

    主动信息收集 被动信息收集可能不准确,可以用主动信息收集验证   特点:直接与目标系统交互通信,无法避免留下访问痕迹 解决方法:1.使用受控的第三方电脑进行探测,使用代理 (做好被封杀的准备)   2 ...

  7. web站点检查简易shell脚本

    1.web样式 <h4>THE STATUS OF RS:</h4> <meta http-equiv="> <table border=" ...

  8. Linux shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  9. 一个不错的shell 脚本教程 入门级

    一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂     建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行s ...

随机推荐

  1. java_14 Date

    1.Date类的构造方法 Date是表示时间的类 空参构造 public Date() public class Demo { public static void main(String[] arg ...

  2. Annotation 标注

    1.画出基本图 当图线中某些特殊地方需要标注时,我们可以使用 annotation. matplotlib 中的 annotation 有两种方法, 一种是用 plt 里面的 annotate,一种是 ...

  3. python 2与python3 区别

    源码区别 python3:python2 a) py3 优美简单清晰. b) py2:源码重复,混乱,不规范,冗(rong)余(不需要特多,啰嗦). test a)    py3:可以中文也可以英文( ...

  4. 网络传输 buf 封装 示例代码

    网络传输 buf 封装 示例代码 使用boost库 asio // BufferWrapTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h&quo ...

  5. zeromq学习记录(六)C语言示例

    考虑到官方的示例c语言是最多的 官方未使用C++语言演示的例子就使用VC编译C语言例子 记录在此 /************************************************** ...

  6. docker日志设置定期清理

    1.新建/etc/docker/daemon.json,若有就不用新建了 2.添加log-dirver和log-opts参数,样例如下 "log-driver":"jso ...

  7. python_day8_socket

    目录 客户端/服务器架构 socket逻辑结构 socket概念 套接字的概念 TCP与UDP套接字应用 recv与recvfrom的区别 粘包现象及处理 认证客户端的链接合法性 socktserve ...

  8. 【MySQL】-2 函数、分组、子查询、联合查询

    函数 Mysql的函数特性没有SQL可移植性强. 大多数情况下支持的函数: 处理文本串的函数: RTrim():处理列值右边的空格 LTrim():处理列值左边的空格   Trim():处理列值的左右 ...

  9. HQL数据查询基础

    HQL定义 1.Hibernate Query Language, Hibernate查询语言 2.HQL是面向对象的查询语言(HQL查询的主体是映射配置的持久化类及其属性而SQL查询主体是数据库表) ...

  10. java web+模板

    这次测试需要在java web的基础上套入模板,在测试的过程中我遇到了许多问题,现在我可以使用模板来美化网页的许多格式.但是模板的许多代码我还是看不懂,其中有jquery的许多代码.在今后我会学习相关 ...