#!/bin/bash # Copyright (C) 2021 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. readme() { echo ''' Install apps in an app bundle release directory to the device via adb, e.g. ./batch_install_app.sh /path/to/app_bundle /path/to/report Note: aapt is needed to get the metadata from APKs. ''' } SECONDS=0 MY_NAME=$0 SCRIPT_NAME="${MY_NAME##*/}" SCRIPT_DIR="${MY_NAME%/$SCRIPT_NAME}" echo Running from $SCRIPT_DIR if [[ -z $OUT_DIR ]]; then OUT_DIR="${HOME}/Downloads" fi INPUT_DIR=$1 if [[ ! -d ${INPUT_DIR} ]]; then echo "Error: ${INPUT_DIR} is not a directory." readme exit fi echo "LOG=${LOG}" log() { if [[ -n ${LOG} ]]; then echo $1 fi } # check an app/package version via adb, e.g. # checkAppVersion package_name checkAppVersion() { pkg=$1 cmd="adb shell dumpsys package ${pkg}" dump=$(${cmd}) log "$dump" echo "${dump}" | grep versionName } echo "Process all APKs in ${INPUT_DIR}" # apkDic[apk_name]=apk_path declare -A apkDic="$(${SCRIPT_DIR}/get_file_dir.sh ${INPUT_DIR} apk)" echo "Found: ${#apkDic[@]} apks" screenshotDir="/data/local/tmp/screenshots" echo "Removig the following screenshots from the device" adb shell ls -l ${screenshotDir} adb shell rm -r ${screenshotDir} adb shell mkdir -p ${screenshotDir} # apkBadgingDic[apk_name]=aapt_badging_output_string declare -A apkBadgingDic # manifestDic[apk_name]=AndroidManifest_xml_content_string declare -A manifestDic i=1 for apk in "${!apkDic[@]}"; do path="${apkDic[${apk}]}" badging=$(aapt dump badging ${path}) apkBadgingDic[${apk}]="\"${badging}\"" log "${apkBadgingDic[${apk}]}" # Get package name from the aapt badging output string # ... package: name='com.google.android.gsf' versionCode... pkg0=${badging#package: name=\'} pkg=${pkg0%\' versionCode*} echo "$i,${pkg},${apk},${path}" checkAppVersion ${pkg} ${SCRIPT_DIR}/install_apk.sh ${path} checkAppVersion ${pkg} echo # Get the 1st launchable activity # ... launchable-activity: name='com.google.android.maps.MapsActivity' label... if [[ "$badging" == *"launchable-activity: name="* ]]; then activity0=${badging#*launchable-activity: name=\'} activity=${activity0%%\' label=*} echo "Launching an activity: ${activity}" adb shell am start -n "${pkg}/${activity}" sleep 5 adb shell screencap "${screenshotDir}/${pkg}.png" echo "grep screen" fi i=$(($i + 1)) done adb shell ls -l ${screenshotDir} adb pull ${screenshotDir} ${OUT_DIR} echo "Took ${SECONDS} seconds"