通过 "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. ubuntu桌面环境安装中文环境

    apt install language-pack-zh-hans* language-pack-gnome-zh-hans* language-pack-kde-zh-hans* apt insta ...

  2. centos7 smplayer 安装 安装视频播放器

    # yum -y install http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noar ...

  3. 快速创建IIS站点并设置权限

     net user WebSiteUser WebSiteUserWebSiteUser /add /yWMIC Path Win32_UserAccount Where Name="Web ...

  4. 学习Hibernate的体会

    这个学期老师让我们做一个系统(服务器和客户端),语言自选,我也随大家开始学习java web 和android . 下面是我自学的一些体会和遇到的问题. 关于jar包. jsds.jar javasi ...

  5. c++ 计算cpu占用率

    计算CPU占用率就是获取系统总的内核时间 用户时间及空闲时间 其中空闲时间就是内核空转 所以内核时间包含空闲时间 然后计算 运行时间 = 内核时间 加 用户时间 减去 空闲时间 间隔时间 =  内核时 ...

  6. 通过JDBC进行简单的增删改查(以MySQL为例) 目录

    通过JDBC进行简单的增删改查(以MySQL为例) 目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操 ...

  7. mui.fire()触发自定义事件

    导读:添加自定义事件监听操作和标准js事件监听类似,可直接通过window对象添加,通过mui.fire()方法可触发目标窗口的自定义事件. 监听自定义事件 添加自定义事件监听操作和标准js事件监听类 ...

  8. 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)

    传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...

  9. android activity之间用广播传输数据

    发送者: Intent intent = new Intent("com.BroadcastAction"); intent.putExtra("result" ...

  10. EF6 学习笔记(二):操练 CRUD 增删改查

    EF6学习笔记总目录 ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 接上篇: EF6 学习笔记(一):Code First 方式生成数据库及初始化数据库实际操作 本篇原文链接: I ...