xref: /aosp_15_r20/tools/aadevtools/validation/batch_install_app.sh (revision b32fbb6340ee6fe4a25d7b39d84085c084465677)
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