Shell脚本 | 健壮性测试之空指针检查
通过 "adb shell am start" 遍历安卓应用所有的 Activity,可以检查是否存在空指针的情况。
以下为梳理后的测试流程:
- 通过 apktool 反编译 apk(输入参数 apk 路径)
- 得到反编译后的 AndroidManifest.xml 文件
- 通过 FindActivity.py 得到 Activity_List(activity 列表)
- 删除 Activity_List 中含有 "loader.a.ActivityN1/loader.a.ActivityP0/loader.a.ActivityP1/loader.a.ActivityP2" 的 activity(部分 App 反编译后的 activity 列表中有类似名字的无意义 activity,可以删除)
- 运行 NullPointer.py,输出 log 在指定文件夹
- 手动分析 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脚本 | 健壮性测试之空指针检查的更多相关文章
- shell脚本57问
[1]交互方式.非交互方式.Shell脚本是什么? 经常与linux打交道,肯定对shell这个词不陌生.不明白shell意思的,可以自行翻译:外壳.去壳. 这个翻译结果怎么可以与计算机系统联系起来呢 ...
- shell脚本加密方式
--作者:飞翔的小胖猪 --创建时间:2021年5月17日 --修改时间:2021年5月17日 说明 shell作为Linux操作系统中原生的语言环境,由于其简单.便捷.可以移植等特性常被运维人员作为 ...
- Shell脚本 | 性能测试之启动流量
安卓应用的流量统计有多种方式,点击「阅读原文」可以看到一篇别人写的文章,关于安卓流量数据的获取,写的挺全的,列举了几种不同方式的优劣.(见文末参考链接) 今天我要分享的是通过脚本一键获取应用的启动流量 ...
- Shell学习---Shell脚本的静态检查工具shellcheck
Shell脚本的静态检查工具shellcheck ubuntu下 apt install shellcheck ,即可安装shellcheck.写完shell脚本,记得用它检查一下,能给你点建议的.要 ...
- shell脚本检查域名证书是否过期
最近公司的域名准备过期了,防止用户访问的时候出现异常,所以最近我们准备替换相关网站证书为最新的. (一般HTTPS证书有效期为1年,证书过期后或者该证书不是该域名的有效证书时,在浏览器中访问会出现如下 ...
- 小白日记7:kali渗透测试之主动信息收集-发现(一)--二层发现:arping/shell脚本,Netdiscover,scapy
主动信息收集 被动信息收集可能不准确,可以用主动信息收集验证 特点:直接与目标系统交互通信,无法避免留下访问痕迹 解决方法:1.使用受控的第三方电脑进行探测,使用代理 (做好被封杀的准备) 2 ...
- web站点检查简易shell脚本
1.web样式 <h4>THE STATUS OF RS:</h4> <meta http-equiv="> <table border=" ...
- Linux shell脚本编程(一)
Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...
- 一个不错的shell 脚本教程 入门级
一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行s ...
随机推荐
- ubuntu桌面环境安装中文环境
apt install language-pack-zh-hans* language-pack-gnome-zh-hans* language-pack-kde-zh-hans* apt insta ...
- centos7 smplayer 安装 安装视频播放器
# yum -y install http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noar ...
- 快速创建IIS站点并设置权限
net user WebSiteUser WebSiteUserWebSiteUser /add /yWMIC Path Win32_UserAccount Where Name="Web ...
- 学习Hibernate的体会
这个学期老师让我们做一个系统(服务器和客户端),语言自选,我也随大家开始学习java web 和android . 下面是我自学的一些体会和遇到的问题. 关于jar包. jsds.jar javasi ...
- c++ 计算cpu占用率
计算CPU占用率就是获取系统总的内核时间 用户时间及空闲时间 其中空闲时间就是内核空转 所以内核时间包含空闲时间 然后计算 运行时间 = 内核时间 加 用户时间 减去 空闲时间 间隔时间 = 内核时 ...
- 通过JDBC进行简单的增删改查(以MySQL为例) 目录
通过JDBC进行简单的增删改查(以MySQL为例) 目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操 ...
- mui.fire()触发自定义事件
导读:添加自定义事件监听操作和标准js事件监听类似,可直接通过window对象添加,通过mui.fire()方法可触发目标窗口的自定义事件. 监听自定义事件 添加自定义事件监听操作和标准js事件监听类 ...
- 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)
传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...
- android activity之间用广播传输数据
发送者: Intent intent = new Intent("com.BroadcastAction"); intent.putExtra("result" ...
- EF6 学习笔记(二):操练 CRUD 增删改查
EF6学习笔记总目录 ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 接上篇: EF6 学习笔记(一):Code First 方式生成数据库及初始化数据库实际操作 本篇原文链接: I ...