Nel mio caso ho voluto solo cambiare alcuni valori in strings.xml
tra le diverse versioni.
prima devo caricare la libreria ant-contrib
, per definire il compito for
ciclo:
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="lib/ant-contrib-1.0b5-SNAPSHOT.jar" />
</classpath>
</taskdef>
ho messo il mio elenco di configurazioni, config.names
, in un file properties
:
config.url.root=http://projectserver.aptivate.org/
config.names=student-production, teacher-production, student-testing, teacher-testing
e definire a target build-all
, che scorre su config.names
:
<target name="build-all">
<for param="config.name" trim="true" list="${config.names}">
<sequential>
Definizione di una directory personalizzata resources
per ciascuno di essi, salvare il nome della directory nella config.resources
proprietà:
<var name="config.resources" unset="true" />
<property name="config.resources" value="bin/res-generated/@{config.name}" />
eliminarlo, e copiare le risorse globali da res
in esso:
<delete dir="${config.resources}" />
<copy todir="${config.resources}">
<fileset dir="res"/>
</copy>
Change -
a /
nel nome di configurazione, per renderlo un percorso nel parametro URL:
<var name="config.path" unset="true" />
<propertyregex property="config.path"
input="@{config.name}" regexp="-"
replace="/" casesensitive="true" />
Eseguire una trasformazione XSLT per modificare il file 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>
Questo è il foglio di stile XSLT che uso:
<?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>
e di nuovo a custom_rules.xml
dove ho quindi estrarre il app_version
dall'originale (non modificata) res/values/strings.xml
:
<xpath input="res/values/strings.xml"
expression="/resources/string[@name='app_version']"
output="resources.strings.app_version" />
E utilizzare l'attività antcall
per chiamare il debug
costruzione:
<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}[email protected]{config.name}.apk" />
</antcall>
con due valori di proprietà modificati:
resource.absolute.dir
dice il bersaglio debug
di utilizzare il mio modificato res
directory, definito nella proprietà config.resources
sopra;
out.final.file
indica di generare un APK con un nome diverso, incluso il nome di configurazione (ad esempio student-testing
) e il numero di versione estratto da strings.xml
.
E quindi, finalmente, è possibile eseguire ant build-all
dalla riga di comando e creare tutti e quattro i target. Un po 'più di script, poco prima della fine del build-all
bersaglio, elenca i file APK compilato insieme per riferimento:
<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}[email protected]{config.name}.apk" />
</sequential>
</for>
possibile duplicato di [Android - più versioni personalizzate del stessa applicazione] (http: // StackOverflow .com/questions/1222302/android - versioni multiple-custom-della-stessa-app) – EboMike
Nessuna delle soluzioni si integra bene con Eclipse per quanto posso dire. Sono in realtà abbastanza perplesso sul motivo per cui un compito così semplice sembra così complicato.Non per iniziare un flamewar, ma ho dato un'occhiata allo sviluppatore iPhone del nostro sviluppatore iPhone, ed è piuttosto banale passare i parametri alla tua applicazione dall'esterno. Questo mi rende triste. –
So come farlo con maven-android-plugin, in realtà piuttosto facile. tuttavia, è necessario associare l'applicazione a Maven, inoltre, sembra che ci siano alcune incompatibilità con l'ultimo SDK di Android (r14 e r15) in maven-android-plugin/m2e-android, probabilmente non è ciò che si desidera. – yorkw