Skip to content

Instantly share code, notes, and snippets.

@CAMOBAP
Created August 2, 2019 09:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CAMOBAP/b5664b05ce2130de8192516fd4c4b9b0 to your computer and use it in GitHub Desktop.
Save CAMOBAP/b5664b05ce2130de8192516fd4c4b9b0 to your computer and use it in GitHub Desktop.
Android SDK install add-ons from command line
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sdk="http://schemas.android.com/sdk/android/addon/7"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:common="http://schemas.android.com/repository/android/common/01"
xmlns:addon2="http://schemas.android.com/sdk/android/repo/addon2/01">
<xsl:output omit-xml-declaration="no" indent="yes" encoding="UTF-8" standalone="yes"/>
<xsl:template match="/sdk:sdk-addon">
<common:repository>
<xsl:apply-templates />
</common:repository>
</xsl:template>
<xsl:template match="sdk:add-on">
<localPackage obsolete="false">
<xsl:attribute name="path">add-ons;addon-<xsl:value-of select="sdk:name-id" />-<xsl:value-of select="sdk:vendor-id" />-<xsl:value-of select="sdk:api-level" />
</xsl:attribute>
<type-details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="addon2:addonDetailsType">
<api-level><xsl:value-of select="sdk:api-level" /></api-level>
<vendor>
<id><xsl:value-of select="sdk:vendor-id" /></id>
<display><xsl:value-of select="sdk:vendor-display" /></display>
</vendor>
<tag>
<id><xsl:value-of select="sdk:name-id" /></id>
<display><xsl:value-of select="sdk:name-display" /></display>
</tag>
<libraries>
<xsl:for-each select="sdk:libs/sdk:lib">
<xsl:apply-templates select="." />
</xsl:for-each>
</libraries>
</type-details>
<revision>
<major><xsl:value-of select="sdk:revision" /></major>
</revision>
<display-name><xsl:value-of select="name-display" /></display-name>
</localPackage>
</xsl:template>
<xsl:template match="sdk:lib">
<library>
<xsl:attribute name="name">
<xsl:value-of select="sdk:name" />
</xsl:attribute>
<xsl:if test="sdk:localJarPath">
<xsl:attribute name="localJarPath">
<xsl:value-of select="sdk:localJarPath" />
</xsl:attribute>
</xsl:if>
<description><xsl:value-of select="sdk:description" /></description>
</library>
</xsl:template>
<xsl:template match="license|channel">
<xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>
#!/usr/bin/env bash
# validation
if [ -z "${ANDROID_SDK_HOME+x}" ]; then
echo "ANDROID_SDK_HOME not defined! Please make sure that android-ndk installed & ANDROID_SDK_HOME set"
exit 1
fi
REPOSITORY_URL=${1:-missing_url}
echo "REPOSITORY_URL=${REPOSITORY_URL}"
wget "$REPOSITORY_URL/addon.xml" -P "$TMPDIR"
# parse addon-xml
ADDON_XPATH="/*[local-name()='sdk-addon']/*[local-name()='add-on']"
VENDOR_ID=$(xmllint --xpath "${ADDON_XPATH}/*[local-name()='vendor-id']/text()" "$TMPDIR/addon.xml")
NAME_ID=$(xmllint --xpath "${ADDON_XPATH}/*[local-name()='name-id']/text()" "$TMPDIR/addon.xml")
API_LEVEL=$(xmllint --xpath "${ADDON_XPATH}/*[local-name()='api-level']/text()" "$TMPDIR/addon.xml")
ADDON_ZIP=$(xmllint --xpath "${ADDON_XPATH}/*[local-name()='archives']/*[local-name()='archive']/*[local-name()='url']/text()" "$TMPDIR/addon.xml")
ADDON_SDK_PATH="$ANDROID_SDK_HOME/add-ons/addon-${NAME_ID}-${VENDOR_ID}-${API_LEVEL}"
# download
wget "$REPOSITORY_URL/$ADDON_ZIP" -P "$TMPDIR"
# verify
EXPECTED_CHECKSUM=$(xmllint --xpath "${ADDON_XPATH}/*[local-name()='archives']/*[local-name()='archive']/*[local-name()='checksum']/text()" "$TMPDIR/addon.xml")
CHECKSUM_ALG=$(xmllint --xpath "string(${ADDON_XPATH}/*[local-name()='archives']/*[local-name()='archive']/*[local-name()='checksum']/@type)" "$TMPDIR/addon.xml")
ACTUAL_CHECKSUM=$(openssl "$CHECKSUM_ALG" < "$TMPDIR/$ADDON_ZIP")
if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]; then
echo "Checksum verification failed expected:${EXPECTED_CHECKSUM} actual:${ACTUAL_CHECKSUM}"
exit 1
fi
# install
unzip "$TMPDIR/$ADDON_ZIP" -d "$TMPDIR"
mkdir -p "$ADDON_SDK_PATH"
mv "$TMPDIR"/*_addon-*/* "$ADDON_SDK_PATH/"
xsltproc "$(dirname "$0")/addon2package.xslt" "$TMPDIR/addon.xml" > "$ADDON_SDK_PATH/package.xml"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment