通过 "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. adb、monkey常用命令

    adb.monkey常用命令 1.查看连接设备 adb devices 2.连接android模拟器 adb connect 127.0.0.1:62001 3.安装软件 adb install 这个 ...

  2. 用户认证--auth模块实现

    转载文章,如有不妥之处请谅解 相关介绍 auth auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和admin模块配合使用, 快速建立网站的管 ...

  3. 主机性能监控之wmi 获取磁盘信息

    标 题: 主机性能监控之wmi 获取磁盘信息作 者: itdef链 接: http://www.cnblogs.com/itdef/p/3990541.html 欢迎转帖 请保持文本完整并注明出处 仅 ...

  4. 工具SQL

    1.数据库设计文档维护SQL SELECT COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, ...

  5. python_day1_程序交互

    程序交互 在编写程序过程中总会有程序与用户交互的场景出现,这里面提到python会使用一个方法:input 用法: 例如:请用户输入一个账号 input"Please input your ...

  6. Bootstrap方法为页面添加一个弹出框

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. okhttp 调用相机 上传服务器

    MainActivity package com.bwie.lianxi1; import android.content.Intent; import android.database.Cursor ...

  8. Nginx+Tomcat反向代理利用certbot实现https

    一.利用Let's Encrypt 免费生成HTTPS证书 1.下载安装certbot(Let's Encrypt ) 2.利用certbot生成证书 3.配置nginx的https证书 安装cerb ...

  9. 用 Docker 构建、运行、发布来一个 Spring Boot 应用

    本文演示了如何用 Docker 构建.运行.发布来一个 Spring Boot 应用. Docker 简介 Docker 是一个 Linux 容器管理工具包,具备“社交”方面,允许用户发布容器的 im ...

  10. AddTransient,AddScope和AddSingleton 有什么不同?

    我们先来创建几个接口using System; namespace DependencyInjectionSample.Interfaces{ public interface IOperation ...