Skip to content

Instantly share code, notes, and snippets.

@ktnr74
Last active January 17, 2018 20:45
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ktnr74/8a927fbfe48cdc6f16b2 to your computer and use it in GitHub Desktop.
Save ktnr74/8a927fbfe48cdc6f16b2 to your computer and use it in GitHub Desktop.
#!/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
#!/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