+
+
+
+
+
+
+
+
+
+
+
+
+ Permalink
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cannot retrieve contributors at this time
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 131 lines (109 sloc)
+
+ 4.74 KB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + | #!/bin/bash | +
+ | + | +
+ | APK_FILE=$1 # e.g., xx.apk | +
+ | AVD_SERIAL=$2 # e.g., emulator-5554 | +
+ | AVD_NAME=$3 # e.g., base | +
+ | OUTPUT_DIR=$4 | +
+ | TEST_TIME=$5 # e.g., 10s, 10m, 10h | +
+ | HEADLESS=$6 # e.g., -no-window | +
+ | LOGIN_SCRIPT=$7 # the script for app login via uiautomator2 | +
+ | + | +
+ | FASTBOT-TOOL=../tools/fastbot-bin | +
+ | + | +
+ | # wait for the target device | +
+ | function wait_for_device(){ | +
+ | avd_serial=$1 | +
+ | timeout 5s adb -s $avd_serial wait-for-device | +
+ | OUT=`adb -s $avd_serial shell getprop init.svc.bootanim` | +
+ | i=0 | +
+ | while [[ ${OUT:0:7} != 'stopped' ]]; do | +
+ | echo " Waiting for emulator (${avd_serial}) to fully boot (#${i} times) ..." | +
+ | sleep 5 | +
+ | i=$(expr $i + 1) | +
+ | if [[ $i == 10 ]] | +
+ | then | +
+ | echo "Cannot connect to the device: (${avd_serial}) after (#${i} times)..." | +
+ | break | +
+ | fi | +
+ | OUT=`adb -s $avd_serial shell getprop init.svc.bootanim` | +
+ | done | +
+ | } | +
+ | + | +
+ | RETRY_TIMES=5 | +
+ | for i in $(seq 1 $RETRY_TIMES); | +
+ | do | +
+ | echo "try to start the emulator (${AVD_SERIAL})..." | +
+ | sleep 5 | +
+ | # start the emulator | +
+ | avd_port=${AVD_SERIAL:9:13} | +
+ | emulator -port $avd_port -avd $AVD_NAME -read-only $HEADLESS & | +
+ | sleep 5 | +
+ | # wait for the emulator | +
+ | wait_for_device $AVD_SERIAL | +
+ | + | +
+ | # check whether the emualtor is online | +
+ | OUT=`adb -s $avd_serial shell getprop init.svc.bootanim` | +
+ | if [[ ${OUT:0:7} != 'stopped' ]] | +
+ | then | +
+ | adb -s $avd_serial emu kill | +
+ | echo "try to restart the emulator (${AVD_SERIAL})..." | +
+ | if [[ $i == RETRY_TIMES ]] | +
+ | then | +
+ | echo "we give up the emulator (${AVD_SERIAL})..." | +
+ | exit | +
+ | fi | +
+ | else | +
+ | break | +
+ | fi | +
+ | done | +
+ | + | +
+ | echo " emulator (${AVD_SERIAL}) is booted!" | +
+ | adb -s ${AVD_SERIAL} root | +
+ | + | +
+ | current_date_time="`date "+%Y-%m-%d-%H-%M-%S"`" | +
+ | apk_file_name=`basename $APK_FILE` | +
+ | result_dir=$OUTPUT_DIR/$apk_file_name.fastbot.result.$AVD_SERIAL.$AVD_NAME\#$current_date_time | +
+ | mkdir -p $result_dir | +
+ | echo "** CREATING RESULT DIR (${AVD_SERIAL}): " $result_dir | +
+ | + | +
+ | # login if necessary | +
+ | if [[ $LOGIN_SCRIPT != "" ]] | +
+ | then | +
+ | echo "** APP LOGIN (${AVD_SERIAL})" | +
+ | + | +
+ | # enable if use the login script | +
+ | # adb -s $AVD_SERIAL install -g $APK_FILE &> $result_dir/install.log | +
+ | # echo "** INSTALL APP (${AVD_SERIAL})" | +
+ | # python3 $LOGIN_SCRIPT ${AVD_SERIAL} 2>&1 | tee $result_dir/login.log | +
+ | + | +
+ | # enable if use the snapshot (already login, do not need to install the app) | +
+ | echo " *** Login SUCCESS ****" >> $result_dir/login.log | +
+ | + | +
+ | else | +
+ | # install the app | +
+ | adb -s $AVD_SERIAL install -g $APK_FILE &> $result_dir/install.log | +
+ | echo "** INSTALL APP (${AVD_SERIAL})" | +
+ | fi | +
+ | + | +
+ | sleep 20 | +
+ | # install Fastbot | +
+ | adb -s $AVD_SERIAL push $FASTBOT_TOOL/monkeyq.jar /sdcard | +
+ | adb -s $AVD_SERIAL push $FASTBOT_TOOL/framework.jar /sdcard | +
+ | + | +
+ | echo "** INSTALL Fastbot (${AVD_SERIAL})" | +
+ | + | +
+ | # get app package | +
+ | app_package_name=`aapt dump badging $APK_FILE | grep package | awk '{print $2}' | sed s/name=//g | sed s/\'//g` | +
+ | echo "** PROCESSING APP (${AVD_SERIAL}): " $app_package_name | +
+ | + | +
+ | # start logcat | +
+ | echo "** START LOGCAT (${AVD_SERIAL}) " | +
+ | adb -s $AVD_SERIAL logcat -c | +
+ | adb -s $AVD_SERIAL logcat AndroidRuntime:E CrashAnrDetector:D System.err:W CustomActivityOnCrash:E ACRA:E WordPress-EDITOR:E *:F *:S > $result_dir/logcat.log & | +
+ | + | +
+ | # start coverage dumping | +
+ | echo "** START COVERAGE (${AVD_SERIAL}) " | +
+ | bash dump_coverage.sh $AVD_SERIAL $app_package_name $result_dir & | +
+ | + | +
+ | # run fastbot | +
+ | echo "** RUN FASTBOT (${AVD_SERIAL})" | +
+ | adb -s $AVD_SERIAL shell date "+%Y-%m-%d-%H:%M:%S" >> $result_dir/fastbot_testing_time_on_emulator.txt | +
+ | timeout $TEST_TIME adb -s $AVD_SERIAL shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p $app_package_name --agent robot --running-minutes 360 --throttle 200 -v -v --output-directory /sdcard/log --bugreport 1000000 2>&1 | tee $result_dir/fastbot.log | +
+ | #timeout $TEST_TIME adb -s device_vendor_id shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p $app_package_name --agent robot --running-minutes duration(min) --throttle delay(ms) -v -v --output-directory /sdcard/xxx # folder for output directory --bugreport 1000000 2>&1 | tee $result_dir/fastbot.log # log printed when crash occurs | +
+ | adb -s $AVD_SERIAL shell date "+%Y-%m-%d-%H:%M:%S" >> $result_dir/fastbot_testing_time_on_emulator.txt | +
+ | + | +
+ | # pull Fastbot's results | +
+ | echo "** PULL FASTBOT RESULTS (${AVD_SERIAL})" | +
+ | adb -s $AVD_SERIAL pull /sdcard/crash-dump.log $result_dir/ | +
+ | + | +
+ | # stop coverage dumping | +
+ | echo "** STOP COVERAGE (${AVD_SERIAL})" | +
+ | kill `ps aux | grep "dump_coverage.sh ${AVD_SERIAL}" | grep -v grep | awk '{print $2}'` | +
+ | + | +
+ | # stop logcat | +
+ | echo "** STOP LOGCAT (${AVD_SERIAL})" | +
+ | kill `ps aux | grep "${AVD_SERIAL} logcat" | grep -v grep | awk '{print $2}'` | +
+ | + | +
+ | # stop and kill the emulator | +
+ | sleep 5 | +
+ | adb -s $AVD_SERIAL emu kill | +
+ | + | +
+ | echo "@@@@@@ Finish (${AVD_SERIAL}): " $app_package_name "@@@@@@@" | +