| #!/bin/bash |
| |
| # This script requires depot_tools to be on path. |
| |
| print_usage () { |
| echo "Usage:" |
| echo " ./create_cipd_packages.sh <VERSION_TAG> [PATH_TO_SDK_DIR]" |
| echo " Downloads, packages, and uploads Android SDK packages where:" |
| echo " - VERSION_TAG is the tag of the cipd packages, e.g. 28r6 or 31v1. Must contain" |
| echo " only lowercase letters and numbers." |
| echo " - PATH_TO_SDK_DIR is the path to the sdk folder. If omitted, this defaults to" |
| echo " your ANDROID_SDK_ROOT environment variable." |
| echo " ./create_cipd_packages.sh list" |
| echo " Lists the available packages for use in 'packages.txt'" |
| echo "" |
| echo "This script downloads the packages specified in packages.txt and uploads" |
| echo "them to CIPD for linux, mac, and windows." |
| echo "To confirm you have write permissions run 'cipd acl-check flutter/android/sdk/all/ -writer'." |
| echo "" |
| echo "Manage the packages to download in 'packages.txt'. You can use" |
| echo "'sdkmanager --list --include_obsolete' in cmdline-tools to list all available packages." |
| echo "Packages should be listed in the format of <package-name>:<directory-to-upload>." |
| echo "For example, build-tools;31.0.0:build-tools" |
| echo "Multiple directories to upload can be specified by delimiting by additional ':'" |
| echo "" |
| echo "This script expects the cmdline-tools to be installed in your specified PATH_TO_SDK_DIR" |
| echo "and should only be run on linux or macos hosts." |
| } |
| |
| first_argument=$1 |
| # Validate version or argument is provided. |
| if [[ $first_argument == "" ]]; then |
| print_usage |
| exit 1 |
| fi |
| |
| # Validate version contains only lower case letters and numbers. |
| if ! [[ $first_argument =~ ^[[:lower:][:digit:]]+$ ]]; then |
| echo "Version tag can only consist of lower case letters and digits."; |
| print_usage |
| exit 1 |
| fi |
| |
| # Validate environment has cipd installed. |
| if [[ `which cipd` == "" ]]; then |
| echo "'cipd' command not found. depot_tools should be on the path." |
| exit 1 |
| fi |
| |
| sdk_path=${2:-$ANDROID_SDK_ROOT} |
| |
| # Validate directory contains all SDK packages |
| if [[ ! -d "$sdk_path" ]]; then |
| echo "Android SDK at '$sdk_path' not found." |
| print_usage |
| exit 1 |
| fi |
| |
| # Validate caller has cipd. |
| if [[ ! -d "$sdk_path/cmdline-tools" ]]; then |
| echo "SDK directory does not contain $sdk_path/cmdline-tools." |
| print_usage |
| exit 1 |
| fi |
| |
| platforms=("linux" "macosx" "windows") |
| package_file_name="packages.txt" |
| |
| # Find the sdkmanager in cmdline-tools. We default to using latest if available. |
| sdkmanager_path="$sdk_path/cmdline-tools/latest/bin/sdkmanager" |
| find_results=() |
| while IFS= read -r line; do |
| find_results+=("$line") |
| done < <(find "$sdk_path/cmdline-tools" -name sdkmanager) |
| i=0 |
| while [ ! -f "$sdkmanager_path" ]; do |
| if [ $i -ge ${#find_results[@]} ]; then |
| echo "Unable to find sdkmanager in the SDK directory. Please ensure cmdline-tools is installed." |
| exit 1 |
| fi |
| sdkmanager_path="${find_results[$i]}" |
| echo $sdkmanager_path |
| ((i++)) |
| done |
| |
| # list available packages |
| if [ $first_argument == "list" ]; then |
| $sdkmanager_path --list --include_obsolete |
| exit 0 |
| fi |
| |
| # We create a new temporary SDK directory because the default working directory |
| # tends to not update/re-download packages if they are being used. This guarantees |
| # a clean install of Android SDK. |
| temp_dir=`mktemp -d -t android_sdkXXXX` |
| |
| for platform in "${platforms[@]}"; do |
| sdk_root="$temp_dir/sdk_$platform" |
| upload_dir="$temp_dir/upload_$platform" |
| echo "Creating temporary working directory for $platform: $sdk_root" |
| mkdir $sdk_root |
| mkdir $upload_dir |
| mkdir $upload_dir/sdk |
| export REPO_OS_OVERRIDE=$platform |
| |
| # Download all the packages with sdkmanager. |
| for package in $(cat $package_file_name); do |
| echo $package |
| split=(${package//:/ }) |
| echo "Installing ${split[0]}" |
| yes "y" | $sdkmanager_path --sdk_root=$sdk_root ${split[0]} |
| |
| # We copy only the relevant directories to a temporary dir |
| # for upload. sdkmanager creates extra files that we don't need. |
| array_length=${#split[@]} |
| for (( i=1; i<${array_length}; i++ )); do |
| cp -r "$sdk_root/${split[$i]}" "$upload_dir/sdk" |
| done |
| done |
| |
| # Special treatment for NDK to move to expected directory. |
| # Instead of the ndk being in `sdk/ndk/<major>.<minor>.<patch>/`, it will be |
| # in `ndk/`. |
| # This simplifies the build scripts, and enables version difference between |
| # the Dart and Flutter build while reusing the same build rules. |
| # See https://github.com/flutter/flutter/issues/136666#issuecomment-1805467578 |
| mv $upload_dir/sdk/ndk $upload_dir/ndk-bundle |
| ndk_sub_paths=`find $upload_dir/ndk-bundle -maxdepth 1 -type d` |
| ndk_sub_paths_arr=($ndk_sub_paths) |
| mv ${ndk_sub_paths_arr[1]} $upload_dir/ndk |
| rm -rf $upload_dir/ndk-bundle |
| |
| if [[ ! -d "$upload_dir/ndk" ]]; then |
| echo "Failure to bundle ndk for platform" |
| exit 1 |
| fi |
| |
| # Accept all licenses to ensure they are generated and uploaded. |
| yes "y" | $sdkmanager_path --licenses --sdk_root=$sdk_root |
| cp -r "$sdk_root/licenses" "$upload_dir/sdk" |
| |
| archs=("amd64") |
| if [[ $platform == "macosx" ]]; then |
| # Upload an arm64 version for M1 macs |
| archs=("amd64" "arm64") |
| fi |
| for arch in "${archs[@]}"; do |
| # Mac uses a different sdkmanager name than the platform name used in gn. |
| cipd_name="$platform-$arch" |
| if [[ $platform == "macosx" ]]; then |
| cipd_name="mac-$arch" |
| fi |
| |
| echo "Uploading $upload_dir as $cipd_name to CIPD" |
| cipd create -in $upload_dir -name "flutter/android/sdk/all/$cipd_name" -install-mode copy -tag version:$first_argument |
| done |
| |
| rm -rf $sdk_root |
| rm -rf $upload_dir |
| |
| # This variable changes the behvaior of sdkmanager. |
| # Unset to clean up after script. |
| unset REPO_OS_OVERRIDE |
| done |
| rm -rf $temp_dir |