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 LiCreate an AVD. e.g. 20*b32fbb63SXin Li AVD_IMG_NAME="sdk_gcar" \ 21*b32fbb63SXin Li API_LEVEL=30 \ 22*b32fbb63SXin Li DEFAULT_DEVICE_XML="./resource/devices.xml" \ 23*b32fbb63SXin Li ./create_avd.sh 24*b32fbb63SXin Li''' 25*b32fbb63SXin Li} 26*b32fbb63SXin Li 27*b32fbb63SXin Li# Export a variable=default_value if it's empty, e.g. 28*b32fbb63SXin Li# exportVar "VAR" "defaultValue" 29*b32fbb63SXin LiexportVar() 30*b32fbb63SXin Li{ 31*b32fbb63SXin Li var=$1 32*b32fbb63SXin Li defaultValue=$2 33*b32fbb63SXin Li if [[ -z "${!var}" ]]; then 34*b32fbb63SXin Li export "${var}=$defaultValue" 35*b32fbb63SXin Li echo "${var}=$defaultValue" 36*b32fbb63SXin Li fi 37*b32fbb63SXin Li} 38*b32fbb63SXin Li 39*b32fbb63SXin Li# Export a variable with the value of an XML element in a file as, e.g. 40*b32fbb63SXin Li# getValue "TAG_ID" "d:id" "./resource/devices.xml" 41*b32fbb63SXin LigetValue() { 42*b32fbb63SXin Li var=$1 43*b32fbb63SXin Li elementTag=$2 44*b32fbb63SXin Li file=$3 45*b32fbb63SXin Li #e.g. <d:id>aosp_car_10_landscape</d:id> 46*b32fbb63SXin Li value=$(sed -n -e "s/.*<${elementTag}>\(.*\)<\/${elementTag}>.*/\1/p" "${file}") 47*b32fbb63SXin Li export "${var}=${value}" 48*b32fbb63SXin Li echo "${var}=${value}" 49*b32fbb63SXin Li} 50*b32fbb63SXin Li 51*b32fbb63SXin Liif [[ -z "${AVD_IMG_NAME}" || -z "${API_LEVEL}" ]]; then 52*b32fbb63SXin Li readme 53*b32fbb63SXin Li exit 54*b32fbb63SXin Lifi 55*b32fbb63SXin Li 56*b32fbb63SXin LiMY_NAME=$0 57*b32fbb63SXin LiSCRIPT_NAME="${MY_NAME##*/}" 58*b32fbb63SXin LiSCRIPT_DIR="${MY_NAME%/$SCRIPT_NAME}" 59*b32fbb63SXin Liecho "Running from ${SCRIPT_DIR}" 60*b32fbb63SXin Li 61*b32fbb63SXin Li# set up for Linux or macOS 62*b32fbb63SXin LiOS="$(uname -s)" 63*b32fbb63SXin Liecho "Running on $OS" 64*b32fbb63SXin Liif [[ $OS == "Linux" ]]; then 65*b32fbb63SXin Li export ANDROID_SDK_ROOT="${HOME}/Android/Sdk" 66*b32fbb63SXin Li SED_I_CMD="sed -i " 67*b32fbb63SXin Lielif [[ $OS == "Darwin" ]]; then 68*b32fbb63SXin Li export ANDROID_SDK_ROOT="${HOME}/Library/Android/sdk" 69*b32fbb63SXin Li SED_I_CMD="sed -i ''" 70*b32fbb63SXin Lielse 71*b32fbb63SXin Li echo "ERROR: this does not work on $OS" 72*b32fbb63SXin Li exit 73*b32fbb63SXin Lifi 74*b32fbb63SXin Liecho "ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT}" 75*b32fbb63SXin Li 76*b32fbb63SXin Liif [[ -z ${AVD_IMG_DIR} ]]; then 77*b32fbb63SXin Li AVD_IMG_DIR="${ANDROID_SDK_ROOT}/system-images/android-${API_LEVEL}/${AVD_IMG_NAME}" 78*b32fbb63SXin Lifi 79*b32fbb63SXin Liecho "AVD_IMG_DIR=${AVD_IMG_DIR}" 80*b32fbb63SXin Li 81*b32fbb63SXin Liif [[ ! -e "${AVD_IMG_DIR}" ]]; then 82*b32fbb63SXin Li echo "ERROR: no AVD image found at ${AVD_IMG_DIR}" 83*b32fbb63SXin Li exit 84*b32fbb63SXin Lifi 85*b32fbb63SXin Li 86*b32fbb63SXin LiABI=$(ls "${AVD_IMG_DIR}") 87*b32fbb63SXin Liif [[ "${ABI}" != "x86" && "${ABI}" != "x86_64" && "${ABI}" != "arm64" && "${ABI}" != "arm64-v8a" ]]; then 88*b32fbb63SXin Li echo "ERROR: AVD image zip file format incorrect as ${AVD_DIR} should contain x86, x86_64, arm64 or arm64-v8a as: https://source.android.com/devices/automotive/start/avd#pack-an-avd-image-zip-file " 89*b32fbb63SXin Li exit 90*b32fbb63SXin Lifi 91*b32fbb63SXin Liecho "ABI=${ABI}" 92*b32fbb63SXin Li 93*b32fbb63SXin Li# sdk_gcar_30 94*b32fbb63SXin LiAVD_NAME="${AVD_IMG_NAME}_${API_LEVEL}" 95*b32fbb63SXin LiAVD_INI="${HOME}/.android/avd/${AVD_NAME}.ini" 96*b32fbb63SXin LiAVD_PATH_REL="avd/${AVD_NAME}.avd" 97*b32fbb63SXin LiAVD_PATH="${HOME}/.android/${AVD_PATH_REL}" 98*b32fbb63SXin LiAVD_CONFIG_INI="${AVD_PATH}/config.ini" 99*b32fbb63SXin Li 100*b32fbb63SXin Liif [[ -e "${AVD_PATH}" ]]; then 101*b32fbb63SXin Li echo "NOTE: ${AVD_PATH} exists. Delete them if to recreate, e.g." 102*b32fbb63SXin Li echo "rm -r ${AVD_PATH} || rm ${AVD_INI}" 103*b32fbb63SXin Li exit 104*b32fbb63SXin Lifi 105*b32fbb63SXin Li 106*b32fbb63SXin Li# It should be aligned with avdmanager. 107*b32fbb63SXin Li# May use https://developer.android.com/studio/command-line/avdmanager, but 108*b32fbb63SXin Li# 1. more setup steps required for users & 2. slow on parsing image folders 109*b32fbb63SXin Li# So here just add the bare minimum set up. 110*b32fbb63SXin Liecho "Create ${AVD_INI}" 111*b32fbb63SXin Liecho "avd.ini.encoding=UTF-8 112*b32fbb63SXin Lipath=${AVD_PATH} 113*b32fbb63SXin Lipath.rel=${AVD_PATH_REL} 114*b32fbb63SXin Litarget=android-${API_LEVEL}" >> "${AVD_INI}" 115*b32fbb63SXin Li 116*b32fbb63SXin Liecho 117*b32fbb63SXin Limkdir -p "${AVD_PATH}" 118*b32fbb63SXin LiUSERDATA_DIR="${AVD_PATH}/userdata.img" 119*b32fbb63SXin Liecho "Create Avd Userdata at ${USERDATA_DIR}" 120*b32fbb63SXin Licp "${AVD_IMG_DIR}/${ABI}/userdata.img" "${USERDATA_DIR}" 121*b32fbb63SXin Li 122*b32fbb63SXin LiDEVICE_XML="${AVD_IMG_DIR}/${ABI}/devices.xml" 123*b32fbb63SXin Liif [[ ! -e "${DEVICE_XML}" ]]; then 124*b32fbb63SXin Li echo "NOTE: No ${DEVICE_XML} in the AVD image." 125*b32fbb63SXin Li if [[ ! -e "${DEFAULT_DEVICE_XML}" ]]; then 126*b32fbb63SXin Li echo "ERROR: Need to set DEFAULT_DEVICE_XML at least." 127*b32fbb63SXin Li exit 128*b32fbb63SXin Li else 129*b32fbb63SXin Li echo "COPY: ${DEFAULT_DEVICE_XML} ${DEVICE_XML}" 130*b32fbb63SXin Li cp "${DEFAULT_DEVICE_XML}" "${DEVICE_XML}" 131*b32fbb63SXin Li echo "NOTE: Please restart Android Studio, so the new devics.xml will be properly loaded." 132*b32fbb63SXin Li fi 133*b32fbb63SXin Lifi 134*b32fbb63SXin Liecho "DEVICE_XML=${DEVICE_XML}" 135*b32fbb63SXin LigetValue "DEVICE_PROFILE_NAME" "d:id" "${DEVICE_XML}" 136*b32fbb63SXin LigetValue "MANUFACTURER" "d:manufacturer" "${DEVICE_XML}" 137*b32fbb63SXin LigetValue "ORIENTATION" "d:screen-orientation" "${DEVICE_XML}" 138*b32fbb63SXin LigetValue "TAG_ID" "d:tag-id" "${DEVICE_XML}" 139*b32fbb63SXin LigetValue "SKIN" "d:skin" "${DEVICE_XML}" 140*b32fbb63SXin Li 141*b32fbb63SXin Li 142*b32fbb63SXin Liif [[ "${ORIENTATION}" == "land" ]]; then 143*b32fbb63SXin Li ORIENTATION="landscape" 144*b32fbb63SXin Lifi 145*b32fbb63SXin Li 146*b32fbb63SXin Liecho "Create ${AVD_CONFIG_INI}" 147*b32fbb63SXin LiexportVar "TAG_ID" "android-automotive" 148*b32fbb63SXin Li# MANUFACTURER & DEVICE_PROFILE_NAME need to match those in devices.xml 149*b32fbb63SXin LiexportVar "MANUFACTURER" "Android" 150*b32fbb63SXin LiexportVar "DEVICE_PROFILE_NAME" "aosp_car_10_landscape" 151*b32fbb63SXin LiexportVar "ORIENTATION" "landscape" 152*b32fbb63SXin LiexportVar "NCORE" 4 153*b32fbb63SXin LiexportVar "RAM" "4096" 154*b32fbb63SXin LiexportVar "HEAP" "576" 155*b32fbb63SXin LiexportVar "DATA" "6G" 156*b32fbb63SXin Li 157*b32fbb63SXin Liif [[ "${ABI}" == "arm64-v8a" ]]; then 158*b32fbb63SXin Li HW_ARCH="arm64" 159*b32fbb63SXin Lielse 160*b32fbb63SXin Li HW_ARCH=${ABI} 161*b32fbb63SXin Lifi 162*b32fbb63SXin Li 163*b32fbb63SXin Liecho "avd.ini.encoding=UTF-8 164*b32fbb63SXin LiAvdId=${AVD_NAME} 165*b32fbb63SXin Liavd.ini.displayname=${AVD_NAME} 166*b32fbb63SXin Litag.display=${AVD_NAME} 167*b32fbb63SXin Litag.id=${TAG_ID} 168*b32fbb63SXin Liimage.sysdir.1=system-images/android-${API_LEVEL}/${AVD_IMG_NAME}/${ABI}/ 169*b32fbb63SXin Liabi.type=${ABI} 170*b32fbb63SXin Lihw.arc=false 171*b32fbb63SXin Lihw.device.manufacturer=${MANUFACTURER} 172*b32fbb63SXin Lihw.device.name=${DEVICE_PROFILE_NAME} 173*b32fbb63SXin Lihw.cpu.arch=${HW_ARCH} 174*b32fbb63SXin Lihw.cpu.ncore=${NCORE} 175*b32fbb63SXin Lihw.gpu.enabled=yes 176*b32fbb63SXin Lihw.gpu.mode=auto 177*b32fbb63SXin Lihw.keyboard=yes 178*b32fbb63SXin Lihw.initialOrientation=${ORIENTATION} 179*b32fbb63SXin Lihw.ramSize=${RAM} 180*b32fbb63SXin Livm.heapSize=${HEAP} 181*b32fbb63SXin Lidisk.dataPartition.size=${DATA}" > "${AVD_CONFIG_INI}" 182*b32fbb63SXin Li 183*b32fbb63SXin Liif [[ -z "${SKIN}" ]]; then 184*b32fbb63SXin Li skinSettings="showDeviceFrame=no" 185*b32fbb63SXin Lielse 186*b32fbb63SXin Li skinSettings="showDeviceFrame=yes 187*b32fbb63SXin Liskin.dynamic=yes 188*b32fbb63SXin Liskin.name=${SKIN} 189*b32fbb63SXin Liskin.path=${AVD_IMG_DIR}/${ABI}/skins/${SKIN}" 190*b32fbb63SXin Lifi 191*b32fbb63SXin Liecho "${skinSettings}" >> "${AVD_CONFIG_INI}" 192