tutorial tengo studio saber que programacion minsdkversion como code cambiar android eclipse build settings

android - tengo - minsdkversion



Construye mĂșltiples versiones(test/prod) de APKs de Android en Eclipse (5)

Creo que usar el script de compilación de ant sería la solución más fácil. Eclipse es compatible con ant build, por lo que puede ejecutar el comando ant en eclipse.

Puedes resolver tu problema con hormigas como esta.

  1. preparar dos archivos XML de recursos de Android.
  2. construir un paquete con el recurso # 1
  3. sobrescribir el recurso # 1 con el contenido del recurso # 2
  4. construir otro paquete

xml sería así:

recurso # 1:

<resources> <string name="target">dev</string> </resources>

recurso # 2:

<resources> <string name="target">staging</string> </resources>

y el guión de la hormiga sería así:

<project> <target name="build_all"> <copy file="res1.xml" to="res/values/target.xml"/> <ant antfile="build.xml" target="debug"/> <copy file="res2.xml" to="res/values/target.xml"/> <ant antfile="build.xml" target="debug"/> </target> </project>

Estoy buscando optimizar la generación de APKs ligeramente diferentes de la misma aplicación de Android, la única diferencia es el servidor de API http que está usando (dev / staging / prod).

Lo ideal sería que mi Eclipse compilara 2 APK, uno con el servidor prod y otro con el dev.

Incluso estoy bien con tener 2 configuraciones de ejecución, pero no he podido averiguar cómo pasar parámetros a la aplicación y leerlos desde el código.

Quiero apuntar a 1.5, BTW, y me gustaría usar las herramientas de creación automática de Eclipse, así que estoy buscando la solución más genérica.

Gracias.


En mi caso, solo quería cambiar algunos valores en strings.xml entre diferentes versiones.

Primero tengo que cargar la biblioteca ant-contrib , para definir la tarea de bucle for :

<taskdef resource="net/sf/antcontrib/antcontrib.properties"> <classpath> <pathelement location="lib/ant-contrib-1.0b5-SNAPSHOT.jar" /> </classpath> </taskdef>

config.names mi lista de configuraciones, config.names , en un archivo de properties :

config.url.root=http://projectserver.aptivate.org/ config.names=student-production, teacher-production, student-testing, teacher-testing

Y define un objetivo de build-all , que recorre los config.names :

<target name="build-all"> <for param="config.name" trim="true" list="${config.names}"> <sequential>

Definiendo un directorio de resources personalizado para cada uno, guardando el nombre del directorio en la propiedad config.resources :

<var name="config.resources" unset="true" /> <property name="config.resources" value="bin/res-generated/@{config.name}" />

Elimínelo y copie los recursos globales de la res en él:

<delete dir="${config.resources}" /> <copy todir="${config.resources}"> <fileset dir="res"/> </copy>

Cambie a / en el nombre de configuración, para convertirlo en una ruta en el parámetro de URL:

<var name="config.path" unset="true" /> <propertyregex property="config.path" input="@{config.name}" regexp="-" replace="/" casesensitive="true" />

Ejecute 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 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>

Y volviendo a custom_rules.xml donde luego app_version la app_version de los res/values/strings.xml originales (no modificados):

<xpath input="res/values/strings.xml" expression="/resources/string[@name=''app_version'']" output="resources.strings.app_version" />

Y usa la tarea antcall para llamar a la compilación de 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>

con dos valores de propiedad modificados:

  • resource.absolute.dir le dice al destino de debug que use mi directorio res modificado, definido en la propiedad config.resources arriba;
  • out.final.file le dice que produzca un APK con un nombre diferente, incluido el nombre de 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 compilar los cuatro objetivos. Un poco más de secuencia de comandos, justo antes del final del objetivo de build-all , enumera los archivos APK compilados juntos como 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}-@{config.name}.apk" /> </sequential> </for>


Mueva todo su código a un proyecto de biblioteca, visite http://developer.android.com/guide/developing/projects/projects-eclipse.html#SettingUpLibraryProject

Luego cree proyectos separados en eclipse para prueba y producción, cada uno con un nombre de paquete único. A continuación, puede utilizar el nombre del paquete para distinguir entre las versiones.

Algo como:

public static boolean isProductionVersion(){ return context.getPackageName().toLowerCase().contains("production"); }

Esto puede parecer una exageración para administrar diferentes puntos finales de http, pero hará que el código sea más manejable. También puedes hacer cosas útiles como:

  • marca la versión de prueba con un ícono de aplicación diferente
  • Ejecutar versiones de prueba y producción en paralelo en un solo dispositivo.

Todo esto se puede hacer en eclipse sin utilizar herramientas de terceros.


No es realmente lo que quieres:

private static Boolean isSignedWithDebugKey = null; protected boolean signedWithDebug() { if(isSignedWithDebugKey == null) { PackageManager pm = getPackageManager(); try { PackageInfo pi = pm.getPackageInfo(getPackageName(), 0); isSignedWithDebugKey = (pi.applicationInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; } catch(NameNotFoundException nnfe) { nnfe.printStackTrace(); isSignedWithDebugKey = false; } } return isSignedWithDebugKey; }

Luego, puede golpear un servidor de desarrollo / prueba si la aplicación está firmada con una clave de depuración y la producción con un certificado de lanzamiento.


Para pasar parámetros, siempre puede crear un archivo en el sistema de directorio de Android y hacer que su código lo lea.