You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
5.2 KiB
186 lines
5.2 KiB
#!/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 '''
|
|
Create an AVD. e.g.
|
|
AVD_IMG_NAME="sdk_gcar" \
|
|
API_LEVEL=30 \
|
|
DEFAULT_DEVICE_XML="./resource/devices.xml" \
|
|
./create_avd.sh
|
|
'''
|
|
}
|
|
|
|
# Export a variable=default_value if it's empty, e.g.
|
|
# exportVar "VAR" "defaultValue"
|
|
exportVar()
|
|
{
|
|
var=$1
|
|
defaultValue=$2
|
|
if [[ -z "${!var}" ]]; then
|
|
export "${var}=$defaultValue"
|
|
echo "${var}=$defaultValue"
|
|
fi
|
|
}
|
|
|
|
# Export a variable with the value of an XML element in a file as, e.g.
|
|
# getValue "TAG_ID" "d:id" "./resource/devices.xml"
|
|
getValue() {
|
|
var=$1
|
|
elementTag=$2
|
|
file=$3
|
|
#e.g. <d:id>aosp_car_10_landscape</d:id>
|
|
value=$(sed -n -e "s/.*<${elementTag}>\(.*\)<\/${elementTag}>.*/\1/p" "${file}")
|
|
export "${var}=${value}"
|
|
echo "${var}=${value}"
|
|
}
|
|
|
|
if [[ -z "${AVD_IMG_NAME}" || -z "${API_LEVEL}" ]]; then
|
|
readme
|
|
exit
|
|
fi
|
|
|
|
MY_NAME=$0
|
|
SCRIPT_NAME="${MY_NAME##*/}"
|
|
SCRIPT_DIR="${MY_NAME%/$SCRIPT_NAME}"
|
|
echo "Running from ${SCRIPT_DIR}"
|
|
|
|
# set up for Linux or macOS
|
|
OS="$(uname -s)"
|
|
echo "Running on $OS"
|
|
if [[ $OS == "Linux" ]]; then
|
|
export ANDROID_SDK_ROOT="${HOME}/Android/Sdk"
|
|
SED_I_CMD="sed -i "
|
|
elif [[ $OS == "Darwin" ]]; then
|
|
export ANDROID_SDK_ROOT="${HOME}/Library/Android/sdk"
|
|
SED_I_CMD="sed -i ''"
|
|
else
|
|
echo "ERROR: this does not work on $OS"
|
|
exit
|
|
fi
|
|
echo "ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT}"
|
|
|
|
if [[ -z ${AVD_IMG_DIR} ]]; then
|
|
AVD_IMG_DIR="${ANDROID_SDK_ROOT}/system-images/android-${API_LEVEL}/${AVD_IMG_NAME}"
|
|
fi
|
|
echo "AVD_IMG_DIR=${AVD_IMG_DIR}"
|
|
|
|
if [[ ! -e "${AVD_IMG_DIR}" ]]; then
|
|
echo "ERROR: no AVD image found at ${AVD_IMG_DIR}"
|
|
exit
|
|
fi
|
|
|
|
ABI=$(ls "${AVD_IMG_DIR}")
|
|
if [[ "${ABI}" != "x86" && "${ABI}" != "x86_64" ]]; then
|
|
echo "ERROR: AVD image zip file format incorrect as ${AVD_DIR} should contain x86 or x86_64 as: https://source.android.com/devices/automotive/start/avd#pack-an-avd-image-zip-file "
|
|
exit
|
|
fi
|
|
echo "ABI=${ABI}"
|
|
|
|
# sdk_gcar_30
|
|
AVD_NAME="${AVD_IMG_NAME}_${API_LEVEL}"
|
|
AVD_INI="${HOME}/.android/avd/${AVD_NAME}.ini"
|
|
AVD_PATH_REL="avd/${AVD_NAME}.avd"
|
|
AVD_PATH="${HOME}/.android/${AVD_PATH_REL}"
|
|
AVD_CONFIG_INI="${AVD_PATH}/config.ini"
|
|
|
|
if [[ -e "${AVD_PATH}" ]]; then
|
|
echo "NOTE: ${AVD_PATH} exists. Delete them if to recreate, e.g."
|
|
echo "rm -r ${AVD_PATH} || rm ${AVD_INI}"
|
|
exit
|
|
fi
|
|
|
|
# It should be aligned with avdmanager.
|
|
# May use https://developer.android.com/studio/command-line/avdmanager, but
|
|
# 1. more setup steps required for users & 2. slow on parsing image folders
|
|
# So here just add the bare minimum set up.
|
|
echo "Create ${AVD_INI}"
|
|
echo "avd.ini.encoding=UTF-8
|
|
path=${AVD_PATH}
|
|
path.rel=${AVD_PATH_REL}
|
|
target=android-${API_LEVEL}" >> "${AVD_INI}"
|
|
|
|
echo
|
|
mkdir -p "${AVD_PATH}"
|
|
USERDATA_DIR="${AVD_PATH}/userdata.img"
|
|
echo "Create Avd Userdata at ${USERDATA_DIR}"
|
|
cp "${AVD_IMG_DIR}/${ABI}/userdata.img" "${USERDATA_DIR}"
|
|
|
|
DEVICE_XML="${AVD_IMG_DIR}/${ABI}/devices.xml"
|
|
if [[ ! -e "${DEVICE_XML}" ]]; then
|
|
echo "NOTE: No ${DEVICE_XML} in the AVD image."
|
|
if [[ ! -e "${DEFAULT_DEVICE_XML}" ]]; then
|
|
echo "ERROR: Need to set DEFAULT_DEVICE_XML at least."
|
|
exit
|
|
else
|
|
echo "COPY: ${DEFAULT_DEVICE_XML} ${DEVICE_XML}"
|
|
cp "${DEFAULT_DEVICE_XML}" "${DEVICE_XML}"
|
|
echo "NOTE: Please restart Android Studio, so the new devics.xml will be properly loaded."
|
|
fi
|
|
fi
|
|
echo "DEVICE_XML=${DEVICE_XML}"
|
|
getValue "DEVICE_PROFILE_NAME" "d:id" "${DEVICE_XML}"
|
|
getValue "MANUFACTURER" "d:manufacturer" "${DEVICE_XML}"
|
|
getValue "ORIENTATION" "d:screen-orientation" "${DEVICE_XML}"
|
|
getValue "TAG_ID" "d:tag-id" "${DEVICE_XML}"
|
|
getValue "SKIN" "d:skin" "${DEVICE_XML}"
|
|
|
|
|
|
if [[ "${ORIENTATION}" == "land" ]]; then
|
|
ORIENTATION="landscape"
|
|
fi
|
|
|
|
echo "Create ${AVD_CONFIG_INI}"
|
|
exportVar "TAG_ID" "android-automotive"
|
|
# MANUFACTURER & DEVICE_PROFILE_NAME need to match those in devices.xml
|
|
exportVar "MANUFACTURER" "Android"
|
|
exportVar "DEVICE_PROFILE_NAME" "aosp_car_10_landscape"
|
|
exportVar "ORIENTATION" "landscape"
|
|
exportVar "NCORE" 4
|
|
exportVar "RAM" "4096"
|
|
exportVar "HEAP" "576"
|
|
exportVar "DATA" "6G"
|
|
|
|
echo "avd.ini.encoding=UTF-8
|
|
AvdId=${AVD_NAME}
|
|
avd.ini.displayname=${AVD_NAME}
|
|
tag.display=${AVD_NAME}
|
|
tag.id=${TAG_ID}
|
|
image.sysdir.1=system-images/android-${API_LEVEL}/${AVD_IMG_NAME}/${ABI}/
|
|
abi.type=${ABI}
|
|
hw.arc=false
|
|
hw.device.manufacturer=${MANUFACTURER}
|
|
hw.device.name=${DEVICE_PROFILE_NAME}
|
|
hw.cpu.arch=${ABI}
|
|
hw.cpu.ncore=${NCORE}
|
|
hw.gpu.enabled=yes
|
|
hw.gpu.mode=auto
|
|
hw.keyboard=yes
|
|
hw.initialOrientation=${ORIENTATION}
|
|
hw.ramSize=${RAM}
|
|
vm.heapSize=${HEAP}
|
|
disk.dataPartition.size=${DATA}" > "${AVD_CONFIG_INI}"
|
|
|
|
if [[ -z "${SKIN}" ]]; then
|
|
skinSettings="showDeviceFrame=no"
|
|
else
|
|
skinSettings="showDeviceFrame=yes
|
|
skin.dynamic=yes
|
|
skin.name=${SKIN}
|
|
skin.path=${AVD_IMG_DIR}/${ABI}/skins/${SKIN}"
|
|
fi
|
|
echo "${skinSettings}" >> "${AVD_CONFIG_INI}"
|