1*b32fbb63SXin Li#!/bin/bash 2*b32fbb63SXin Li 3*b32fbb63SXin Li# Copyright (C) 2021 The Android Open Source Project 4*b32fbb63SXin Li# 5*b32fbb63SXin Li# Licensed under the Apache License, Version 2.0 (the "License"); 6*b32fbb63SXin Li# you may not use this file except in compliance with the License. 7*b32fbb63SXin Li# You may obtain a copy of the License at 8*b32fbb63SXin Li# 9*b32fbb63SXin Li# http://www.apache.org/licenses/LICENSE-2.0 10*b32fbb63SXin Li# 11*b32fbb63SXin Li# Unless required by applicable law or agreed to in writing, software 12*b32fbb63SXin Li# distributed under the License is distributed on an "AS IS" BASIS, 13*b32fbb63SXin Li# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*b32fbb63SXin Li# See the License for the specific language governing permissions and 15*b32fbb63SXin Li# limitations under the License. 16*b32fbb63SXin Li 17*b32fbb63SXin Lireadme() { 18*b32fbb63SXin Li echo ''' 19*b32fbb63SXin LiInstall apps in an app bundle release directory to the device via adb, e.g. 20*b32fbb63SXin Li./batch_install_app.sh /path/to/app_bundle /path/to/report 21*b32fbb63SXin Li 22*b32fbb63SXin LiNote: aapt is needed to get the metadata from APKs. 23*b32fbb63SXin Li''' 24*b32fbb63SXin Li} 25*b32fbb63SXin Li 26*b32fbb63SXin LiSECONDS=0 27*b32fbb63SXin LiMY_NAME=$0 28*b32fbb63SXin LiSCRIPT_NAME="${MY_NAME##*/}" 29*b32fbb63SXin LiSCRIPT_DIR="${MY_NAME%/$SCRIPT_NAME}" 30*b32fbb63SXin Liecho Running from $SCRIPT_DIR 31*b32fbb63SXin Li 32*b32fbb63SXin Liif [[ -z $OUT_DIR ]]; then 33*b32fbb63SXin Li OUT_DIR="${HOME}/Downloads" 34*b32fbb63SXin Lifi 35*b32fbb63SXin Li 36*b32fbb63SXin LiINPUT_DIR=$1 37*b32fbb63SXin Liif [[ ! -d ${INPUT_DIR} ]]; then 38*b32fbb63SXin Li echo "Error: ${INPUT_DIR} is not a directory." 39*b32fbb63SXin Li readme 40*b32fbb63SXin Li exit 41*b32fbb63SXin Lifi 42*b32fbb63SXin Li 43*b32fbb63SXin Liecho "LOG=${LOG}" 44*b32fbb63SXin Lilog() { 45*b32fbb63SXin Li if [[ -n ${LOG} ]]; then 46*b32fbb63SXin Li echo $1 47*b32fbb63SXin Li fi 48*b32fbb63SXin Li} 49*b32fbb63SXin Li 50*b32fbb63SXin Li# check an app/package version via adb, e.g. 51*b32fbb63SXin Li# checkAppVersion package_name 52*b32fbb63SXin LicheckAppVersion() { 53*b32fbb63SXin Li pkg=$1 54*b32fbb63SXin Li cmd="adb shell dumpsys package ${pkg}" 55*b32fbb63SXin Li dump=$(${cmd}) 56*b32fbb63SXin Li log "$dump" 57*b32fbb63SXin Li echo "${dump}" | grep versionName 58*b32fbb63SXin Li} 59*b32fbb63SXin Li 60*b32fbb63SXin Liecho "Process all APKs in ${INPUT_DIR}" 61*b32fbb63SXin Li# apkDic[apk_name]=apk_path 62*b32fbb63SXin Lideclare -A apkDic="$(${SCRIPT_DIR}/get_file_dir.sh ${INPUT_DIR} apk)" 63*b32fbb63SXin Liecho "Found: ${#apkDic[@]} apks" 64*b32fbb63SXin Li 65*b32fbb63SXin LiscreenshotDir="/data/local/tmp/screenshots" 66*b32fbb63SXin Liecho "Removig the following screenshots from the device" 67*b32fbb63SXin Liadb shell ls -l ${screenshotDir} 68*b32fbb63SXin Liadb shell rm -r ${screenshotDir} 69*b32fbb63SXin Liadb shell mkdir -p ${screenshotDir} 70*b32fbb63SXin Li 71*b32fbb63SXin Li# apkBadgingDic[apk_name]=aapt_badging_output_string 72*b32fbb63SXin Lideclare -A apkBadgingDic 73*b32fbb63SXin Li# manifestDic[apk_name]=AndroidManifest_xml_content_string 74*b32fbb63SXin Lideclare -A manifestDic 75*b32fbb63SXin Lii=1 76*b32fbb63SXin Lifor apk in "${!apkDic[@]}"; do 77*b32fbb63SXin Li path="${apkDic[${apk}]}" 78*b32fbb63SXin Li badging=$(aapt dump badging ${path}) 79*b32fbb63SXin Li apkBadgingDic[${apk}]="\"${badging}\"" 80*b32fbb63SXin Li log "${apkBadgingDic[${apk}]}" 81*b32fbb63SXin Li 82*b32fbb63SXin Li # Get package name from the aapt badging output string 83*b32fbb63SXin Li # ... package: name='com.google.android.gsf' versionCode... 84*b32fbb63SXin Li pkg0=${badging#package: name=\'} 85*b32fbb63SXin Li pkg=${pkg0%\' versionCode*} 86*b32fbb63SXin Li 87*b32fbb63SXin Li echo "$i,${pkg},${apk},${path}" 88*b32fbb63SXin Li checkAppVersion ${pkg} 89*b32fbb63SXin Li ${SCRIPT_DIR}/install_apk.sh ${path} 90*b32fbb63SXin Li checkAppVersion ${pkg} 91*b32fbb63SXin Li echo 92*b32fbb63SXin Li 93*b32fbb63SXin Li # Get the 1st launchable activity 94*b32fbb63SXin Li # ... launchable-activity: name='com.google.android.maps.MapsActivity' label... 95*b32fbb63SXin Li if [[ "$badging" == *"launchable-activity: name="* ]]; then 96*b32fbb63SXin Li activity0=${badging#*launchable-activity: name=\'} 97*b32fbb63SXin Li activity=${activity0%%\' label=*} 98*b32fbb63SXin Li echo "Launching an activity: ${activity}" 99*b32fbb63SXin Li adb shell am start -n "${pkg}/${activity}" 100*b32fbb63SXin Li sleep 5 101*b32fbb63SXin Li adb shell screencap "${screenshotDir}/${pkg}.png" 102*b32fbb63SXin Li echo "grep screen" 103*b32fbb63SXin Li fi 104*b32fbb63SXin Li 105*b32fbb63SXin Li i=$(($i + 1)) 106*b32fbb63SXin Lidone 107*b32fbb63SXin Li 108*b32fbb63SXin Liadb shell ls -l ${screenshotDir} 109*b32fbb63SXin Liadb pull ${screenshotDir} ${OUT_DIR} 110*b32fbb63SXin Liecho "Took ${SECONDS} seconds" 111