xref: /aosp_15_r20/tools/aadevtools/avd/create_avd.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 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