В моем случае я просто хотел изменить несколько значений в strings.xml
между различными версиями.
Сначала я должен загрузить библиотеку ant-contrib
, чтобы определить задачу цикла for
:
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="lib/ant-contrib-1.0b5-SNAPSHOT.jar" />
</classpath>
</taskdef>
Я поместил свой список конфигураций config.names
в properties
file:
config.url.root=http://projectserver.aptivate.org/
config.names=student-production, teacher-production, student-testing, teacher-testing
И определите цель build-all
, которая зацикливается на config.names
:
<target name="build-all">
<for param="config.name" trim="true" list="${config.names}">
<sequential>
Определение пользовательского каталога resources
для каждого, сохраняяимя каталога в свойстве config.resources
:
<var name="config.resources" unset="true" />
<property name="config.resources" value="bin/res-generated/@{config.name}" />
Удалите его и скопируйте в него глобальные ресурсы из res
:
<delete dir="${config.resources}" />
<copy todir="${config.resources}">
<fileset dir="res"/>
</copy>
Измените -
на /
в имени конфигурации, чтобы указать путь в параметре URL:
<var name="config.path" unset="true" />
<propertyregex property="config.path"
input="@{config.name}" regexp="-"
replace="/" casesensitive="true" />
Запустите преобразование XSLT, чтобы изменить файл strings.xml
:
<xslt in="res/values/strings.xml"
out="${config.resources}/values/strings.xml"
style="ant/create_xml_configs.xslt"
force="true">
<param name="config.url.root" expression="${config.url.root}" />
<param name="config.name" expression="@{config.name}" />
<param name="config.path" expression="${config.path}" />
</xslt>
Это таблица стилей XSLTчто я использую:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="config.url.root" />
<xsl:param name="config.name" />
<xsl:param name="config.path" />
<!-- http://my.safaribooksonline.com/book/xml/9780596527211/creating-output/xslt-id-4.6 -->
<xsl:template match="/">
<!--
This file is automatically generated from res/values/strings.xml
by ant/custom_rules.xml using ant/create_xml_configs.xslt.
Do not modify it by hand; your changes will be overwritten.
-->
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:for-each select="@*">
<xsl:copy/>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- the value of update_server_url must end with a slash! -->
<xsl:template match="string[@name='update_server_url']/text()">
<xsl:value-of select="$config.url.root" /><xsl:value-of select="$config.path" />/
</xsl:template>
<xsl:template match="string[@name='app_version']/text()">
<xsl:value-of select="." />-<xsl:value-of select="$config.name" />
</xsl:template>
</xsl:stylesheet>
И обратно к custom_rules.xml
, где я затем извлекаю app_version
из оригинала (неизмененного) res/values/strings.xml
:
<xpath input="res/values/strings.xml"
expression="/resources/string[@name='app_version']"
output="resources.strings.app_version" />
И использую *Задача 1046 * для вызова debug
сборки:
<antcall target="debug">
<param name="resource.absolute.dir" value="${config.resources}" />
<param name="out.final.file" value="${out.absolute.dir}/${ant.project.name}-${resources.strings.app_version}-@{config.name}.apk" />
</antcall>
с двумя измененными значениями свойств:
resource.absolute.dir
указывает цели debug
использовать мою модифицированную res
каталог, определенный вconfig.resources
свойство выше; out.final.file
говорит ему о необходимости создать APK с другим именем, включая имя конфигурации (например, student-testing
) и номер версии, извлеченный из strings.xml
.
И, наконец, я могу запустить ant build-all
из командной строки и построить все четыре цели.Немного больше скрипта, непосредственно перед концом цели build-all
, перечисляет скомпилированные файлы APK вместе для справки:
<echo message="Output packages:" />
<for param="config.name" trim="true" list="${config.names}">
<sequential>
<echo message="${out.absolute.dir}/${ant.project.name}-${resources.strings.app_version}-@{config.name}.apk" />
</sequential>
</for>