1
0
mirror of https://github.com/ARM-software/devlib.git synced 2025-01-31 02:00:45 +00:00
devlib/tools/android/install_base.sh
Metin Kaya d8a09e895c tools/android: Remove emulator skins
Apparently skins are just nice to have. Also devlib uses emulated
devices in command line (no GUI), so skins are unnecessary. Removing
skins will also reduce the disparity in install_base.sh scripts of LISA
and devlib.

Signed-off-by: Metin Kaya <metin.kaya@arm.com>
2024-06-26 15:27:07 -05:00

334 lines
11 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# SPDX-License-Identifier: Apache-2.0
#
# Copyright (C) 2024, ARM Limited and contributors.
#
# 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.
# Script to install Android SDK tools for LISA & devlib on an Ubuntu-like
# system.
# shellcheck disable=SC2317
ANDROID_HOME="$(dirname "${BASH_SOURCE[0]}")/android-sdk-linux"
export ANDROID_HOME
export ANDROID_USER_HOME="${ANDROID_HOME}/.android"
ANDROID_CMDLINE_VERSION=${ANDROID_CMDLINE_VERSION:-"11076708"}
# Android SDK is picky on Java version, so we need to set JAVA_HOME manually.
# In most distributions, Java is installed under /usr/lib/jvm so use that.
# according to the distribution
ANDROID_SDK_JAVA_VERSION=17
# Read standard /etc/os-release file and extract the needed field lsb_release
# binary is not installed on all distro, but that file is found pretty much
# anywhere.
read_os_release() {
local field_name=${1}
# shellcheck source=/etc/os-release
(source /etc/os-release &> /dev/null && printf "%s" "${!field_name}")
}
# Test the value of a field in /etc/os-release
test_os_release() {
local field_name=${1}
local value=${2}
if [[ "$(read_os_release "${field_name}")" == "${value}" ]]; then
return 0
fi
return 1
}
get_android_sdk_host_arch() {
# Default to Google ABI type for Arm platforms
local arch="arm64-v8a"
local machine
machine=$(uname -m)
if [[ "${machine}" == "x86"* ]]; then
arch=${machine}
fi
echo "${arch}"
}
# No need for the whole SDK for this one
install_android_platform_tools() {
echo "Installing Android Platform Tools ..."
local url="https://dl.google.com/android/repository/platform-tools-latest-linux.zip"
echo "Downloading Android Platform Tools from: ${url}"
wget -qO- "${url}" | bsdtar -xf- -C "${ANDROID_HOME}/"
}
cleanup_android_home() {
echo "Cleaning up Android SDK: ${ANDROID_HOME}"
rm -rf "${ANDROID_HOME}"
mkdir -p "${ANDROID_HOME}/cmdline-tools"
}
install_android_sdk_manager() {
echo "Installing Android SDK manager ..."
# URL taken from "Command line tools only": https://developer.android.com/studio
local url="https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_CMDLINE_VERSION}_latest.zip"
echo "Downloading Android SDK manager from: $url"
wget -qO- "${url}" | bsdtar -xf- -C "${ANDROID_HOME}/cmdline-tools"
echo "Moving commandlinetools to cmdline-tools/latest..."
# First, clear cmdline-tools/latest if it exists.
rm -rf "${ANDROID_HOME}/cmdline-tools/latest"
mv "${ANDROID_HOME}/cmdline-tools/cmdline-tools" "${ANDROID_HOME}/cmdline-tools/latest"
chmod +x -R "${ANDROID_HOME}/cmdline-tools/latest/bin"
yes | (call_android_sdkmanager --licenses || true)
}
find_java_home() {
_JAVA_BIN=$(find -L /usr/lib/jvm -path "*${ANDROID_SDK_JAVA_VERSION}*/bin/java" -not -path '*/jre/bin/*' -print -quit)
_JAVA_HOME=$(dirname "${_JAVA_BIN}")/../
echo "Found JAVA_HOME=${_JAVA_HOME}"
}
call_android_sdk() {
local tool="${ANDROID_HOME}/cmdline-tools/latest/bin/${1}"
shift
JAVA_HOME=${_JAVA_HOME} "${tool}" "$@"
}
call_android_sdkmanager() {
call_android_sdk sdkmanager "$@"
}
call_android_avdmanager() {
call_android_sdk avdmanager "$@"
}
# Needs install_android_sdk_manager first
install_android_tools() {
local android_sdk_host_arch
android_sdk_host_arch=$(get_android_sdk_host_arch)
yes | call_android_sdkmanager --verbose --channel=0 --install "platform-tools"
yes | call_android_sdkmanager --verbose --channel=0 --install "platforms;android-31"
yes | call_android_sdkmanager --verbose --channel=0 --install "platforms;android-33"
yes | call_android_sdkmanager --verbose --channel=0 --install "platforms;android-34"
yes | call_android_sdkmanager --verbose --channel=0 --install "system-images;android-31;google_apis;${android_sdk_host_arch}"
yes | call_android_sdkmanager --verbose --channel=0 --install "system-images;android-33;android-desktop;${android_sdk_host_arch}"
yes | call_android_sdkmanager --verbose --channel=0 --install "system-images;android-34;google_apis;${android_sdk_host_arch}"
}
create_android_vds() {
local android_sdk_host_arch
android_sdk_host_arch=$(get_android_sdk_host_arch)
local vd_name
vd_name="devlib-p6-12"
echo "Creating virtual device \"${vd_name}\" (Pixel 6 - Android 12)..."
echo no | call_android_avdmanager -s create avd -n "${vd_name}" -k "system-images;android-31;google_apis;${android_sdk_host_arch}" -b "${android_sdk_host_arch}" -f
vd_name="devlib-p6-14"
echo "Creating virtual device \"${vd_name}\" (Pixel 6 - Android 14)..."
echo no | call_android_avdmanager -s create avd -n "${vd_name}" -k "system-images;android-34;google_apis;${android_sdk_host_arch}" -b "${android_sdk_host_arch}" -f
vd_name="devlib-chromeos"
echo "Creating virtual device \"${vd_name}\" (ChromeOS - Android 13, Pixel tablet)..."
echo no | call_android_avdmanager -s create avd -n "${vd_name}" -k "system-images;android-33;android-desktop;${android_sdk_host_arch}" -b "${android_sdk_host_arch}" -f
}
install_apt() {
echo "Installing apt packages..."
local apt_cmd=(DEBIAN_FRONTEND=noninteractive apt-get)
sudo "${apt_cmd[@]}" update
if [[ $unsupported_distro == 1 ]]; then
for package in "${apt_packages[@]}"; do
if ! sudo "${apt_cmd[@]}" install -y "$package"; then
echo "Failed to install $package on that distribution" >&2
fi
done
else
sudo "${apt_cmd[@]}" install -y "${apt_packages[@]}" || exit $?
fi
}
install_pacman() {
echo "Installing pacman packages..."
sudo pacman -Sy --needed --noconfirm "${pacman_packages[@]}" || exit $?
}
# APT-based distributions like Ubuntu or Debian
apt_packages=(
cpu-checker
libarchive-tools
qemu-user-static
wget
)
# pacman-based distributions like Archlinux or its derivatives
pacman_packages=(
coreutils
libarchive
qemu-user-static
wget
)
# Detection based on the package-manager, so that it works on derivatives of
# distributions we expect. Matching on distro name would prevent that.
if which apt-get &>/dev/null; then
install_functions+=(install_apt)
package_manager='apt-get'
expected_distro="Ubuntu"
elif which pacman &>/dev/null; then
install_functions+=(install_pacman)
package_manager="pacman"
expected_distro="Arch Linux"
else
echo "The package manager of distribution $(read_os_release NAME) is not supported, will only install distro-agnostic code"
fi
if [[ -n "${package_manager}" ]] && ! test_os_release NAME "${expected_distro}"; then
unsupported_distro=1
echo -e "\nINFO: the distribution seems based on ${package_manager} but is not ${expected_distro}, some package names might not be right\n"
else
unsupported_distro=0
fi
usage() {
echo "Usage: ${0} [--help] [--cleanup-android-sdk] [--install-android-tools]
[--install-android-platform-tools] [--create-avds] [--install-all]"
cat << EOF
Install distribution packages and other bits required by Android emulator.
Archlinux and Ubuntu are supported, although derivative distributions will
probably work as well.
--install-android-platform-tools is not needed when using
--install-android-tools, but has the advantage of not needing a Java
installation and is quicker to install.
EOF
}
# Defaults to --install-all if no option is given
if [[ -z "$*" ]]; then
args=("--install-all")
else
args=("$@")
fi
# Use conditional fall-through ;;& to all matching all branches with
# --install-all
for arg in "${args[@]}"; do
# We need this flag since *) does not play well with fall-through ;;&
handled=0
case "$arg" in
"--cleanup-android-sdk")
install_functions+=(cleanup_android_home)
handled=1
;;&
# Not part of --install-all since that is already satisfied by
# --install-android-tools The advantage of that method is that it does not
# require the Java JDK/JRE to be installed, and is a bit quicker. However,
# it will not provide the build-tools which are needed by devlib.
"--install-android-platform-tools")
install_functions+=(install_android_platform_tools)
handled=1
;;&
"--install-android-tools" | "--install-all")
install_functions+=(
find_java_home
install_android_sdk_manager
install_android_tools
)
apt_packages+=(openjdk-"${ANDROID_SDK_JAVA_VERSION}"-jre openjdk-"${ANDROID_SDK_JAVA_VERSION}"-jdk)
pacman_packages+=(jre"${ANDROID_SDK_JAVA_VERSION}"-openjdk jdk"${ANDROID_SDK_JAVA_VERSION}"-openjdk)
handled=1
;;&
"--create-avds" | "--install-all")
install_functions+=(
find_java_home
install_android_sdk_manager
install_android_tools
create_android_vds
)
handled=1
;;&
"--help")
usage
exit 0
;;&
*)
if [[ ${handled} != 1 ]]; then
echo "Unrecognised argument: ${arg}"
usage
exit 2
fi
;;
esac
done
# In order in which they will be executed if specified in command line
ordered_functions=(
# Distro package managers before anything else, so all the basic
# pre-requisites are there
install_apt
install_pacman
find_java_home
# cleanup must be done BEFORE installing
cleanup_android_home
install_android_sdk_manager
install_android_tools
create_android_vds
)
# Remove duplicates in the list
# shellcheck disable=SC2207
install_functions=($(echo "${install_functions[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))
mkdir -p "${ANDROID_HOME}/cmdline-tools"
# Call all the hooks in the order of available_functions
ret=0
for f in "${ordered_functions[@]}"; do
for func in "${install_functions[@]}"; do
if [[ ${func} == "${f}" ]]; then
# If one hook returns non-zero, we keep going but return an overall failure code.
${func}; _ret=$?
if [[ $_ret != 0 ]]; then
ret=${_ret}
echo "Stage ${func} failed with exit code ${ret}" >&2
else
echo "Stage ${func} succeeded" >&2
fi
fi
done
done
exit $ret
# vim: set tabstop=4 shiftwidth=4 textwidth=80 expandtab: