Skip to content

Commit e6cd4fd

Browse files
author
zhangzhao.a
committed
Java & Cpp code are fully open sourced
1. java & cpp code release 2. custom event bugfix 3. compatible with Android14 4. code Refactoring
1 parent 7ce0787 commit e6cd4fd

File tree

161 files changed

+65903
-52
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

161 files changed

+65903
-52
lines changed

README.md

+24-12
Original file line numberDiff line numberDiff line change
@@ -8,43 +8,50 @@
88
***More detail see at [Fastbot architecture](https://mp.weixin.qq.com/s/QhzqBFZygkIS6C69__smyQ)
99

1010
## Features
11-
* Fastbot is compatible with multiple Android OS systems, including original Android, Android 5-13 and a variation of modified Andriod-based system by domestic manufacturers.
11+
* Fastbot is compatible with multiple Android OS systems, including original Android, Android 5-14 and a variation of modified Andriod-based system by domestic manufacturers.
1212
* Inherited from original Monkey, Fastbot allows for fast action insertion as high as 12 actions per second.
1313
* Expert system is equipped with the ability to customize deeply based on needs from different business lines.
1414
* Fastbot is a model-based-testing tool. Model is build via graph transition with the consideration of high reward choice selection.
15-
* Fastbot supports non-standard widgets by computer vision techniques such as YOLOv3, ocr and cv segmentation.
15+
16+
**update 2023.8**
17+
* Java & Cpp code are fully open sourced, build fastbot on your own.
1618

1719
**update 2023.3**
1820
* support android 13
1921

2022
**update 2022.1**
2123
* update Fastbot Revised License
22-
* release AnyTrace, the Fastbot test management assistant: supports one-click Fastbot test start, crash analysis, etc. ([AnyTrace User Manual](https://www.volcengine.com/docs/6431/82895))
2324

2425
**update 2021.11**
2526
* support android 12
2627
* add some new GUI fuzzing & mutation features (inspired/supported by [Themis](https://github.com/the-themis-benchmarks/home))
2728

2829
**update 2021.09**
2930
* Fastbot supports model reuse: see at `/sdcard/fastbot_[packagename].fbm`. This file is loaded by default if it exists when Fastbot starts. During execution, it is overwritten every 10 minutes. The user can delete or copy this file based on their needs.
30-
31+
3132

3233
## Usage
3334
### Environment preparation
34-
* Make sure Android version on your device or emulator is Android 5, 6, 7, 8, 9, 10, 11, 12
35-
* Push `framework.jar fastbot-thirdpart.jar monkeyq.jar` into your device, most likely /sdcard, push `libs/* ` to `/data/local/tmp/`
35+
* Clone this repo, cd this repo and build monkeyq.jar, and please make sure the ndk and cmake are all well configured in your environment.
36+
```shell
37+
./gradlew clean makeJar
38+
sh ./build_native.sh
39+
~/Library/Android/sdk/build-tools/28.0.3/dx --dex --output=monkeyq.jar monkey/build/libs/monkey.jar
40+
```
41+
* Push artifacts into your device.
3642
```shell
37-
adb push *.jar /sdcard
43+
adb push monkey/build/libs/monkeyq.jar /sdcard/monkeyq.jar
44+
adb push fastbot-thirdpart.jar /sdcard/fastbot-thirdpart.jar
3845
adb push libs/* /data/local/tmp/
46+
adb push framework.jar /sdcard/framework.jar
3947
```
4048

4149
### Run Fastbot with shell command
4250
`
43-
adb -s device_vendor_id shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar:/sdcard/fastbot-thirdpart.jar exec app_process /system/bin
44-
com.android.commands.monkey.Monkey -p package_name --agent reuseq --running-minutes duration(min) --throttle delay(ms) -v -v
51+
adb -s device_vendor_id shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar:/sdcard/fastbot-thirdpart.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p package_name --agent reuseq --running-minutes duration(min) --throttle delay(ms) -v -v
4552
`
4653
* before run the command,user can push the strings in apk to `/sdcard/` to improve the model
47-
* `aapt2` or `aapt` depends your android sdk, a sample aapt path is ``` ${ANDROID_HOME}/build-tools/28.0.2/aapt2```
54+
* `aapt2` or `aapt` depends your android sdk, a sample aapt path is ``` ${ANDROID_HOME}/build-tools/28.0.2/aapt2```
4855

4956
```shell
5057
aapt2 dump --values strings [testApp_path.apk] > max.valid.strings
@@ -88,9 +95,9 @@ adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:
8895

8996

9097
## Acknowledgement
91-
* We appreciate the insights and code contribution from project APE by Dr. Tianxiao Gu and Prof. Zhendong Su (ETH Zurich) etc.
98+
* We appreciate the insights and code contribution by Prof. Ting Su (East China Normal University)、Dr. Tianxiao Gu and Prof. Zhendong Su (ETH Zurich) etc.
9299
* We thank the useful discussions with Prof. Yao Guo (PKU) on Fastbot.
93-
* We want to express our gratitude to Prof. Zhenhua Li (THU), Dr. Liangyi Gong (THU) and Prof. Ting Su (East China Normal University) for their helpful opinions on Fastbot.
100+
* We want to express our gratitude to Prof. Zhenhua Li (THU) and Dr. Liangyi Gong (THU) for their helpful opinions on Fastbot.
94101
* We are also grateful for valuable advices from Prof. Jian Zhang (Chinese Academy of Sciences).
95102

96103

@@ -131,3 +138,8 @@ If you use our work in your research, please kindly cite us as:
131138
year={2020}
132139
}
133140
```
141+
142+
## Contributors
143+
Zhao Zhang, Jianqiang Guo, Yuhui Su, Tianxiao Gu, Zhengwei Lv, Tianqin Cai, Chao Peng, Bao Cao, Shanshan Shao, Dingchun Wang, Jiarong Fu, Ting Su, Mengqian Xu
144+
145+
Welcome more one to become contributors

build.gradle

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
buildscript {
2+
repositories {
3+
google()
4+
mavenCentral()
5+
}
6+
dependencies {
7+
classpath 'com.android.tools.build:gradle:4.2.2'
8+
}
9+
}
10+
11+
allprojects {
12+
gradle.projectsEvaluated {
13+
tasks.withType(JavaCompile).tap {
14+
configureEach {
15+
options.compilerArgs.add('-Xbootclasspath/p:monkey/libs/framework.jar')
16+
}
17+
}
18+
}
19+
20+
repositories {
21+
google()
22+
mavenCentral()
23+
}
24+
}
25+
26+
tasks.register('clean', Delete) {
27+
delete rootProject.buildDir
28+
}

build_native.sh

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
cd "native"
2+
3+
rm -r CMakeFiles/
4+
cmake -DCMAKE_TOOLCHAIN_FILE=$NDK_ROOT/build/cmake/android.toolchain.cmake -DANDROID_ABI=armeabi-v7a -DCMAKE_BUILD_TYPE=Release
5+
make
6+
rm -r CMakeFiles/
7+
8+
cmake -DCMAKE_TOOLCHAIN_FILE=$NDK_ROOT/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DCMAKE_BUILD_TYPE=Release
9+
make
10+
rm -r CMakeFiles/
11+
12+
cmake -DCMAKE_TOOLCHAIN_FILE=$NDK_ROOT/build/cmake/android.toolchain.cmake -DANDROID_ABI=x86 -DCMAKE_BUILD_TYPE=Release
13+
make
14+
rm -r CMakeFiles/
15+
16+
cmake -DCMAKE_TOOLCHAIN_FILE=$NDK_ROOT/build/cmake/android.toolchain.cmake -DANDROID_ABI=x86_64 -DCMAKE_BUILD_TYPE=Release
17+
make
18+
rm -r CMakeFiles/

doc/Fastbot arch.png

474 KB
Loading

doc/formula1.png

62.8 KB
Loading

doc/formula2.png

48.4 KB
Loading

doc/formula3.png

15.2 KB
Loading

framework.jar

100755100644
File mode changed.

gradlew

+244
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
#!/bin/sh
2+
3+
#
4+
# Copyright © 2015-2021 the original authors.
5+
#
6+
# Licensed under the Apache License, Version 2.0 (the "License");
7+
# you may not use this file except in compliance with the License.
8+
# You may obtain a copy of the License at
9+
#
10+
# https://www.apache.org/licenses/LICENSE-2.0
11+
#
12+
# Unless required by applicable law or agreed to in writing, software
13+
# distributed under the License is distributed on an "AS IS" BASIS,
14+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
# See the License for the specific language governing permissions and
16+
# limitations under the License.
17+
#
18+
19+
##############################################################################
20+
#
21+
# Gradle start up script for POSIX generated by Gradle.
22+
#
23+
# Important for running:
24+
#
25+
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
26+
# noncompliant, but you have some other compliant shell such as ksh or
27+
# bash, then to run this script, type that shell name before the whole
28+
# command line, like:
29+
#
30+
# ksh Gradle
31+
#
32+
# Busybox and similar reduced shells will NOT work, because this script
33+
# requires all of these POSIX shell features:
34+
# * functions;
35+
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
36+
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
37+
# * compound commands having a testable exit status, especially «case»;
38+
# * various built-in commands including «command», «set», and «ulimit».
39+
#
40+
# Important for patching:
41+
#
42+
# (2) This script targets any POSIX shell, so it avoids extensions provided
43+
# by Bash, Ksh, etc; in particular arrays are avoided.
44+
#
45+
# The "traditional" practice of packing multiple parameters into a
46+
# space-separated string is a well documented source of bugs and security
47+
# problems, so this is (mostly) avoided, by progressively accumulating
48+
# options in "$@", and eventually passing that to Java.
49+
#
50+
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
51+
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
52+
# see the in-line comments for details.
53+
#
54+
# There are tweaks for specific operating systems such as AIX, CygWin,
55+
# Darwin, MinGW, and NonStop.
56+
#
57+
# (3) This script is generated from the Groovy template
58+
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
59+
# within the Gradle project.
60+
#
61+
# You can find Gradle at https://github.com/gradle/gradle/.
62+
#
63+
##############################################################################
64+
65+
# Attempt to set APP_HOME
66+
67+
# Resolve links: $0 may be a link
68+
app_path=$0
69+
70+
# Need this for daisy-chained symlinks.
71+
while
72+
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
73+
[ -h "$app_path" ]
74+
do
75+
ls=$( ls -ld "$app_path" )
76+
link=${ls#*' -> '}
77+
case $link in #(
78+
/*) app_path=$link ;; #(
79+
*) app_path=$APP_HOME$link ;;
80+
esac
81+
done
82+
83+
# This is normally unused
84+
# shellcheck disable=SC2034
85+
APP_BASE_NAME=${0##*/}
86+
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
87+
88+
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
89+
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
90+
91+
# Use the maximum available, or set MAX_FD != -1 to use that value.
92+
MAX_FD=maximum
93+
94+
warn () {
95+
echo "$*"
96+
} >&2
97+
98+
die () {
99+
echo
100+
echo "$*"
101+
echo
102+
exit 1
103+
} >&2
104+
105+
# OS specific support (must be 'true' or 'false').
106+
cygwin=false
107+
msys=false
108+
darwin=false
109+
nonstop=false
110+
case "$( uname )" in #(
111+
CYGWIN* ) cygwin=true ;; #(
112+
Darwin* ) darwin=true ;; #(
113+
MSYS* | MINGW* ) msys=true ;; #(
114+
NONSTOP* ) nonstop=true ;;
115+
esac
116+
117+
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
118+
119+
120+
# Determine the Java command to use to start the JVM.
121+
if [ -n "$JAVA_HOME" ] ; then
122+
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
123+
# IBM's JDK on AIX uses strange locations for the executables
124+
JAVACMD=$JAVA_HOME/jre/sh/java
125+
else
126+
JAVACMD=$JAVA_HOME/bin/java
127+
fi
128+
if [ ! -x "$JAVACMD" ] ; then
129+
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
130+
131+
Please set the JAVA_HOME variable in your environment to match the
132+
location of your Java installation."
133+
fi
134+
else
135+
JAVACMD=java
136+
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
137+
138+
Please set the JAVA_HOME variable in your environment to match the
139+
location of your Java installation."
140+
fi
141+
142+
# Increase the maximum file descriptors if we can.
143+
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
144+
case $MAX_FD in #(
145+
max*)
146+
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
147+
# shellcheck disable=SC3045
148+
MAX_FD=$( ulimit -H -n ) ||
149+
warn "Could not query maximum file descriptor limit"
150+
esac
151+
case $MAX_FD in #(
152+
'' | soft) :;; #(
153+
*)
154+
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
155+
# shellcheck disable=SC3045
156+
ulimit -n "$MAX_FD" ||
157+
warn "Could not set maximum file descriptor limit to $MAX_FD"
158+
esac
159+
fi
160+
161+
# Collect all arguments for the java command, stacking in reverse order:
162+
# * args from the command line
163+
# * the main class name
164+
# * -classpath
165+
# * -D...appname settings
166+
# * --module-path (only if needed)
167+
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
168+
169+
# For Cygwin or MSYS, switch paths to Windows format before running java
170+
if "$cygwin" || "$msys" ; then
171+
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
172+
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
173+
174+
JAVACMD=$( cygpath --unix "$JAVACMD" )
175+
176+
# Now convert the arguments - kludge to limit ourselves to /bin/sh
177+
for arg do
178+
if
179+
case $arg in #(
180+
-*) false ;; # don't mess with options #(
181+
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
182+
[ -e "$t" ] ;; #(
183+
*) false ;;
184+
esac
185+
then
186+
arg=$( cygpath --path --ignore --mixed "$arg" )
187+
fi
188+
# Roll the args list around exactly as many times as the number of
189+
# args, so each arg winds up back in the position where it started, but
190+
# possibly modified.
191+
#
192+
# NB: a `for` loop captures its iteration list before it begins, so
193+
# changing the positional parameters here affects neither the number of
194+
# iterations, nor the values presented in `arg`.
195+
shift # remove old arg
196+
set -- "$@" "$arg" # push replacement arg
197+
done
198+
fi
199+
200+
# Collect all arguments for the java command;
201+
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
202+
# shell script including quotes and variable substitutions, so put them in
203+
# double quotes to make sure that they get re-expanded; and
204+
# * put everything else in single quotes, so that it's not re-expanded.
205+
206+
set -- \
207+
"-Dorg.gradle.appname=$APP_BASE_NAME" \
208+
-classpath "$CLASSPATH" \
209+
org.gradle.wrapper.GradleWrapperMain \
210+
"$@"
211+
212+
# Stop when "xargs" is not available.
213+
if ! command -v xargs >/dev/null 2>&1
214+
then
215+
die "xargs is not available"
216+
fi
217+
218+
# Use "xargs" to parse quoted args.
219+
#
220+
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
221+
#
222+
# In Bash we could simply go:
223+
#
224+
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
225+
# set -- "${ARGS[@]}" "$@"
226+
#
227+
# but POSIX shell has neither arrays nor command substitution, so instead we
228+
# post-process each arg (as a line of input to sed) to backslash-escape any
229+
# character that might be a shell metacharacter, then use eval to reverse
230+
# that process (while maintaining the separation between arguments), and wrap
231+
# the whole thing up as a single "set" statement.
232+
#
233+
# This will of course break if any of these variables contains a newline or
234+
# an unmatched quote.
235+
#
236+
237+
eval "set -- $(
238+
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
239+
xargs -n1 |
240+
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
241+
tr '\n' ' '
242+
)" '"$@"'
243+
244+
exec "$JAVACMD" "$@"

0 commit comments

Comments
 (0)