2020-10-23 17:59:08 +03:00
#!/bin/bash -e -o pipefail
2023-11-28 02:25:03 +01:00
################################################################################
## File: install-android-sdk.sh
## Desc: Install Android SDK, NDK and tools
################################################################################
2020-09-10 14:34:08 +03:00
source ~/utils/utils.sh
2024-03-14 10:53:11 +01:00
add_filtered_installation_components() {
2024-01-09 14:47:31 +01:00
local minimum_version = $1
2020-09-29 18:19:26 +03:00
shift
2024-01-09 14:47:31 +01:00
local tools_array =( " $@ " )
2020-09-29 18:19:26 +03:00
2024-01-09 14:47:31 +01:00
for item in ${ tools_array [@] } ; do
2025-10-23 22:31:30 +03:00
# Take the last version number that appears after the last '-' or ';'
item_version = $( echo " $item " | grep -oE '[-;][0-9.]+' | grep -oE '[0-9.]+' )
if [[ " $( printf " ${ minimum_version } \n ${ item_version } \n" | sort -V | head -n1) " == " $minimum_version " ]] ; then
2020-10-05 10:57:58 +03:00
components +=( $item )
2020-09-29 18:19:26 +03:00
fi
done
}
2024-01-09 14:47:31 +01:00
get_full_ndk_version() {
local majorVersion = $1
2021-02-01 12:56:44 +03:00
2024-01-09 14:47:31 +01:00
ndkVersion = $( ${ SDKMANAGER } --list | grep "ndk; ${ majorVersion } .*" | awk '{gsub("ndk;", ""); print $1}' | sort -V | tail -n1)
2021-02-01 12:56:44 +03:00
echo " $ndkVersion "
}
2020-10-05 10:57:58 +03:00
components =()
2024-01-09 14:47:31 +01:00
android_platform = $( get_toolset_value '.android.platform_min_version' )
android_build_tool = $( get_toolset_value '.android.build_tools_min_version' )
android_extra_list =( $( get_toolset_value '.android."extras"[]' ) )
android_addon_list =( $( get_toolset_value '.android."addons"[]' ) )
android_additional_tools =( $( get_toolset_value '.android."additional_tools"[]' ) )
android_ndk_major_versions =( $( get_toolset_value '.android.ndk."versions"[]' ) )
android_ndk_major_default = $( get_toolset_value '.android.ndk.default' )
android_ndk_major_latest = $( get_toolset_value '.android.ndk."versions"[-1]' )
2021-07-07 15:16:23 +03:00
# Get the latest command line tools from https://developer.android.com/studio#cmdline-tools
2023-01-23 18:54:13 +03:00
# Newer version(s) require Java 11 by default
# See https://github.com/actions/runner-images/issues/6960
2020-09-10 14:34:08 +03:00
ANDROID_HOME = $HOME /Library/Android/sdk
2023-10-17 11:23:09 +02:00
# Download the latest command line tools so that we can accept all of the licenses.
# See https://developer.android.com/studio/#command-tools
cmdlineToolsVersion = $( get_toolset_value '.android."cmdline-tools"' )
if [[ $cmdlineToolsVersion == "latest" ]] ; then
2023-11-30 13:39:32 +01:00
repository_xml_url = "https://dl.google.com/android/repository/repository2-1.xml"
repository_xml_path = $( download_with_retry $repository_xml_url )
2023-10-17 11:23:09 +02:00
cmdlineToolsVersion = $(
yq -p= xml \
'.sdk-repository.remotePackage[] | select(."+@path" == "cmdline-tools;latest" and .channelRef."+@ref" == "channel-0").archives.archive[].complete.url | select(contains("commandlinetools-mac"))' \
2023-11-30 13:39:32 +01:00
" $repository_xml_path "
2023-10-17 11:23:09 +02:00
)
if [[ -z $cmdlineToolsVersion ]] ; then
echo "Failed to parse latest command-line tools version"
exit 1
fi
fi
2020-09-10 14:34:08 +03:00
2021-07-07 15:16:23 +03:00
echo "Downloading android command line tools..."
2023-11-30 13:39:32 +01:00
archive_path = $( download_with_retry "https://dl.google.com/android/repository/ ${ cmdlineToolsVersion } " )
2020-09-10 14:34:08 +03:00
2021-07-07 15:16:23 +03:00
echo "Uncompressing android command line tools..."
2023-11-30 13:39:32 +01:00
mkdir -p " $ANDROID_HOME "
unzip -q " $archive_path " -d " $ANDROID_HOME /cmdline-tools"
# Command line tools need to be placed in $ANDROID_HOME/cmdline-tools/latest to function properly
mv " $ANDROID_HOME /cmdline-tools/cmdline-tools" " $ANDROID_HOME /cmdline-tools/latest"
2020-09-10 14:34:08 +03:00
2023-11-30 13:39:32 +01:00
echo ANDROID_HOME is " $ANDROID_HOME "
2021-07-07 15:16:23 +03:00
export PATH = $PATH :$ANDROID_HOME /cmdline-tools/latest:$ANDROID_HOME /cmdline-tools/latest/bin
2020-09-10 14:34:08 +03:00
2021-07-07 15:16:23 +03:00
SDKMANAGER = $ANDROID_HOME /cmdline-tools/latest/bin/sdkmanager
2020-09-10 14:34:08 +03:00
echo "Installing latest tools & platform tools..."
echo y | $SDKMANAGER "tools" "platform-tools"
echo "Installing latest ndk..."
2024-01-09 14:47:31 +01:00
for ndk_version in " ${ android_ndk_major_versions [@] } "
2021-09-15 10:14:42 +03:00
do
ndk_full_version = $( get_full_ndk_version $ndk_version )
echo y | $SDKMANAGER "ndk; $ndk_full_version "
done
2022-07-21 11:33:26 +04:00
2024-01-09 14:47:31 +01:00
ndkDefault = $( get_full_ndk_version $android_ndk_major_default )
2022-07-29 10:50:39 +04:00
ANDROID_NDK_HOME = $ANDROID_HOME /ndk/$ndkDefault
2024-01-09 14:47:31 +01:00
ndkLatest = $( get_full_ndk_version $android_ndk_major_latest )
2021-02-01 12:56:44 +03:00
ANDROID_NDK_LATEST_HOME = $ANDROID_HOME /ndk/$ndkLatest
2022-08-10 13:55:34 +01:00
# ANDROID_NDK, ANDROID_NDK_HOME, and ANDROID_NDK_ROOT variables should be set as many customer builds depend on them https://github.com/actions/runner-images/issues/5879
2022-07-29 10:50:39 +04:00
echo "export ANDROID_NDK= $ANDROID_NDK_HOME " >> " ${ HOME } /.bashrc"
echo "export ANDROID_NDK_HOME= $ANDROID_NDK_HOME " >> " ${ HOME } /.bashrc"
echo "export ANDROID_NDK_ROOT= $ANDROID_NDK_HOME " >> " ${ HOME } /.bashrc"
2021-02-01 12:56:44 +03:00
echo "export ANDROID_NDK_LATEST_HOME= $ANDROID_NDK_LATEST_HOME " >> " ${ HOME } /.bashrc"
2020-09-10 14:34:08 +03:00
2021-10-29 01:16:26 +03:00
availablePlatforms =( $( $SDKMANAGER --list | grep "platforms;android-[0-9]" | cut -d"|" -f 1 | sort -u) )
2024-03-14 10:53:11 +01:00
add_filtered_installation_components $android_platform " ${ availablePlatforms [@] } "
2020-10-05 10:57:58 +03:00
2021-07-07 15:16:23 +03:00
allBuildTools =( $( $SDKMANAGER --list --include_obsolete | grep "build-tools;" | cut -d"|" -f 1 | sort -u) )
2020-10-05 10:57:58 +03:00
availableBuildTools = $( echo ${ allBuildTools [@]//*rc[0-9]/ } )
2024-03-14 10:53:11 +01:00
add_filtered_installation_components $android_build_tool " ${ availableBuildTools [@] } "
2020-10-05 10:57:58 +03:00
2021-07-07 15:16:23 +03:00
echo "y" | $SDKMANAGER ${ components [@] }
2020-09-10 14:34:08 +03:00
2024-01-09 14:47:31 +01:00
for extra_name in " ${ android_extra_list [@] } "
2020-09-10 14:34:08 +03:00
do
echo "Installing extra $extra_name ..."
echo y | $SDKMANAGER "extras; $extra_name "
done
2024-01-09 14:47:31 +01:00
for addon_name in " ${ android_addon_list [@] } "
2020-09-10 14:34:08 +03:00
do
echo "Installing add-on $addon_name ..."
echo y | $SDKMANAGER "add-ons; $addon_name "
done
2024-01-09 14:47:31 +01:00
for tool_name in " ${ android_additional_tools [@] } "
2020-12-31 13:22:17 +05:00
do
echo "Installing additional tool $tool_name ..."
echo y | $SDKMANAGER " $tool_name "
done
2023-10-18 10:17:43 +02:00
# Download SDK tools to preserve backward compatibility
2023-11-30 13:39:32 +01:00
sdk_tools_version = $( get_toolset_value '.android."sdk-tools"' )
if [ " $sdk_tools_version " != "null" ] ; then
sdk_tools_archive_path = $( download_with_retry "https://dl.google.com/android/repository/ ${ sdk_tools_version } " )
unzip -o -qq " $sdk_tools_archive_path " -d " ${ ANDROID_SDK_ROOT } "
2023-10-18 10:17:43 +02:00
fi
2020-12-31 13:22:17 +05:00
invoke_tests "Android"