This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
#sudo apt-get install libxml2-utils | |
GetGoogleSourceFile () { | |
[ "-$1" == "-" ] && return 1 | |
curl -s --compressed -G -d "format=text" --url "$GOOGLE_SOURCE_URL/${3:-platform/frameworks/base}/${2:-+/master}/$1" | base64 -d | |
} | |
GetRepositoryXmlURL () { | |
local VARS=(NS_LATEST_VERSION URL_GOOGLE_SDK_SITE URL_FILENAME_PATTERN) | |
local VARPATTERN=$(echo -n "\\(";for V in ${VARS[@]}; do echo -n $V; echo -n "\\|"; done; echo -n "DONE\\)") #" | |
local REPOCONSTANTS=$(GetGoogleSourceFile "sdklib/src/main/java/com/android/sdklib/repository/SdkRepoConstants.java" "+/master" "platform/tools/base") | |
eval $(echo "$REPOCONSTANTS" | tr '\n;' ' \n' | sed -e "s/${VARPATTERN}/\n\1/g" -e "s/%1\$d/\$${VARS[0]}/" | tr -d ' ' | sed -ne "/${VARPATTERN}=/p") | |
eval echo \$${VARS[1]}\$${VARS[2]} | |
} | |
GetPackageURL () { | |
[ "-$1" == "-" ] && return 1 | |
local OS="linux" # "macosx" "windows" | |
local NAMESPACE="sdk" | |
local RELEASE="revision[not(preview)]/.." # "revision[boolean(preview)]/.." "" | |
local XPATH="(/sdk-repository/$1/$RELEASE/archives/archive/host-os[text()='$OS'])[last()]/../url/text()" | |
echo -n "${REPOXMLURL%/*}/" | |
curl -s --compressed --url $REPOXMLURL | sed 's/\(<\/\?\)$NAMESPACE:/\1/g' | xmllint --xpath "$XPATH" - | |
return 0 | |
} | |
PackageNeedsUpdating () { | |
PREVIOUS_URL_FILE="$ANDROID_HOME/.$PACKAGE.url" | |
[ -f $PREVIOUS_URL_FILE ] && PREVIOUS_URL=$(<$PREVIOUS_URL_FILE) | |
[ "-$PREVIOUS_URL" == "-$PACKAGE_URL" ] && return 1 | |
return 0 | |
} | |
DownloadAndUzip () { | |
local TMP=$(mktemp) | |
curl -s --url $PACKAGE_URL -o $TMP && unzip -qo $TMP -d $ANDROID_HOME && echo -n $PACKAGE_URL > $PREVIOUS_URL_FILE | |
[ -f $TMP ] && rm $TMP | |
} | |
GOOGLE_SOURCE_URL="https://android.googlesource.com" | |
ANDROID_HOME="/opt/android" | |
REPOXMLURL=$(GetRepositoryXmlURL) | |
PACKAGE="platform-tool" | |
PACKAGE_URL=$(GetPackageURL $PACKAGE) | |
PackageNeedsUpdating && DownloadAndUzip | |
exit 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# REQUIRES: curl, unzip, xmlstarlet | |
# sudo apt-get install xmlstarlet # to install xmlstarlet on Debian/Ubuntu | |
Log () { | |
[ -t 1 ] && echo -e "$1" 1>&2 && return 0 | |
echo -e $(date +"[%D %T] ")"$1" >> /var/log/android_sdk_update.log | |
} | |
GetRepositoryXML () { | |
curl -s --compressed --url "${URL_GOOGLE_SDK_SITE}${URL_DEFAULT_FILENAME}" -R -o $REPOSITORYXML -z $REPOSITORYXML --create-dirs | |
} | |
GetPackageURL () { | |
[[ -z $PKG ]] && return 1 | |
[[ $PKG == "lldb" ]] && local SORT="-s D:T:U ." | |
local OS="(not(host-os) or host-os='linux') and (not(host-bits) or host-bits='64')" | |
local REV=" and channelRef[@ref='channel-0']" # set this to "" to get the release candidates as well as final releases | |
local XPATH="//remotePackage[(@path='$PKG' or starts-with(@path,'$PKG;'))$REV]/archives/archive[$OS]/complete/url" | |
PKG_URL=${URL_GOOGLE_SDK_SITE}$(xmlstarlet sel -t -m "$XPATH" $SORT -v "." -n "$REPOSITORYXML" | head -n 1) | |
[[ $PKG_URL == $URL_GOOGLE_SDK_SITE ]] && return 1 | |
return 0 | |
} | |
CheckIfPackageNeedsUpdating () { | |
[[ -z $PKG ]] && return 1 | |
[[ $PKG_URL == $URL_GOOGLE_SDK_SITE ]] && return 1 | |
PREV_URL_FILE="$ANDROID_HOME/.$PKG.url" | |
[[ -f $PREV_URL_FILE ]] && PREV_URL=$(<$PREV_URL_FILE) | |
[[ $PREV_URL != $PKG_URL ]] && return 0 | |
Log "No update needed. $PKG_URL is already installed." | |
return 1 | |
} | |
UnzipPackage () { | |
[[ -f $PKG_ZIP ]] || return 1 | |
local ZIP_ROOT=$(unzip -l "$PKG_ZIP" | awk 'NR>3 && NF==4 {split($4,s,"/"); print s[1]}' | sort -u) | |
local DEST="$ANDROID_HOME" | |
[[ $(echo "$ZIP_ROOT" | wc -l) -gt 1 ]] && DEST="${DEST}/${PKG}" && [ -d "$DEST" ] && rm -rf "$DEST" | |
[[ $DEST == $ANDROID_HOME ]] && [ -d "$DEST/$ZIP_ROOT" ] && rm -rf "$DEST/$ZIP_ROOT" | |
mkdir -p "$DEST" | |
unzip -qo "$PKG_ZIP" -d "$DEST" | |
} | |
DownloadAndUnzip () { | |
[[ -z $PKG ]] && return 1 | |
[[ $PKG_URL == $URL_GOOGLE_SDK_SITE ]] && return 1 | |
Log "Downloading $PKG_URL" | |
PKG_ZIP="$ANDROID_HOME/.zip/"$(basename $PKG_URL) | |
curl -s --url "$PKG_URL" -R -o "$PKG_ZIP" -z "$PKG_ZIP" --create-dirs && UnzipPackage && echo -n "$PKG_URL" > "$PREV_URL_FILE" | |
} | |
URL_GOOGLE_SDK_SITE="https://dl.google.com/android/repository/" | |
URL_DEFAULT_FILENAME="repository2-1.xml" | |
ANDROID_HOME="${ANDROID_HOME:-/opt/android}" | |
REPOSITORYXML="$ANDROID_HOME/.$URL_DEFAULT_FILENAME" | |
GetRepositoryXML | |
#PACKAGES_TO_UPDATE=(build-tools cmake docs lldb ndk-bundle patcher platforms platform-tools sources tools) | |
PACKAGES_TO_UPDATE=(build-tools cmake platform-tools tools) | |
for PKG in ${PACKAGES_TO_UPDATE[@]}; do | |
GetPackageURL && CheckIfPackageNeedsUpdating && DownloadAndUnzip | |
done | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment