En mi caso, yo sólo quería cambiar algunos valores en strings.xml
entre las diferentes versiones.
En primer lugar tengo que cargar la biblioteca ant-contrib
, para definir la tarea for
bucle:
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="lib/ant-contrib-1.0b5-SNAPSHOT.jar" />
</classpath>
</taskdef>
pongo mi lista de configuraciones, config.names
, en un archivo properties
:
config.url.root=http://projectserver.aptivate.org/
config.names=student-production, teacher-production, student-testing, teacher-testing
y definir un objetivo build-all
, que recorre el config.names
:
<target name="build-all">
<for param="config.name" trim="true" list="${config.names}">
<sequential>
La definición de un directorio personalizado resources
para cada uno, ahorrando el nombre del directorio en el config.resources
propiedad:
<var name="config.resources" unset="true" />
<property name="config.resources" value="bin/res-generated/@{config.name}" />
eliminarlo, y copiar los recursos globales de res
en él:
<delete dir="${config.resources}" />
<copy todir="${config.resources}">
<fileset dir="res"/>
</copy>
Cambio -
a /
en el nombre de la configuración, para que sea una ruta en el parámetro de la URL:
<var name="config.path" unset="true" />
<propertyregex property="config.path"
input="@{config.name}" regexp="-"
replace="/" casesensitive="true" />
Ejecutar una transformación XSLT para modificar el archivo 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>
Esta es la hoja de estilo XSLT que utilizo:
<?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>
Y de vuelta a custom_rules.xml
donde luego extraer el app_version
del original (sin modificar) res/values/strings.xml
:
<xpath input="res/values/strings.xml"
expression="/resources/string[@name='app_version']"
output="resources.strings.app_version" />
Y utilizar la tarea antcall
a llamar a la debug
construcción:
<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 dos valores de propiedad modificados:
resource.absolute.dir
le indica a debug
usar mi res
directorio modificado, que se define en la propiedad config.resources
arriba;
out.final.file
indica que debe producir una APK con un nombre diferente, incluido el nombre de la configuración (por ejemplo, student-testing
) y el número de versión extraído de strings.xml
.
Y luego, finalmente, puedo ejecutar ant build-all
desde la línea de comandos y construir los cuatro objetivos. Un poco más de la escritura, justo antes del final del objetivo build-all
, muestra los archivos APK compilado juntos para referencia:
<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>
posible duplicado de [Android - múltiples versiones personalizadas de la misma aplicación] (http: // stackoverflow .com/questions/1222302/android - multiple-custom-versions-of-the-same-app) – EboMike
Ninguna de las soluciones se integra muy bien con Eclipse hasta donde yo sé. De hecho, no estoy seguro de por qué una tarea tan simple parece tan complicada.No para iniciar una guerra de llama, pero he echado un vistazo al desarrollador de iPhone de nuestro desarrollador de iPhone, y es muy trivial pasarle parámetros a su aplicación desde el exterior. Esto me pone triste. –
Sé cómo hacer esto con maven-android-plugin, en realidad es bastante fácil. sin embargo, requiere atar su aplicación con maven, además, parece haber algunas incompatibilidades con la última versión de Android SDK (r14 y r15) en maven-android-plugin/m2e-android, probablemente no es lo que quiere. – yorkw