2011-12-22 15 views
5

Me gustaría construir dos versiones de mi aplicación Android usando un archivo Apache ant. El problema es que ambas versiones son idénticas, excepto el anuncio en la versión lite. Leí sobre usar Configurations con ant a build versiones de depuración.Android Ant Build

La siguiente clase define algunas constantes a las que se puede hacer referencia dentro de la aplicación.

public class Config { 
    // Whether or not to include logging in the app. 
    public final static boolean LOGGING = true; 
} 

Y aquí es un ejemplo de cómo usar este constantes para determinar si el registro está habilitado o no.

if (Config.LOGGING) { 
    Log.d(TAG, "[onCreate] Success"); 
} 

Ahora puedo activar y desactivar el registro en mi archivo de propiedades.

# Turn on or off logging. 
config.logging=true 

eso no funciona, ya que antes de utilizar esta configuración tengo que crear un segundo archivo de configuración y el uso de filterset y copia.

public class Config { 
    // Whether or not to include logging in the app. 
    public final static boolean LOGGING = @[email protected]; 
} 

Eso es bastante fácil, pero cómo podría usar esto para construir dos versiones de mi aplicación con y sin publicidad. Y ¿cómo podría cambiar los nombres de los paquetes usando hormiga, por lo que el android market aceptaría ambos paquetes (Completo y Lite).


Gracias por sus sugerencias, pero todavía tengo algunos problemas.

Me las arreglé para escribir algunos objetivos básicos que limpian mis compilaciones y copian todos los archivos necesarios para compilar la aplicación en dos carpetas/full y/lite. Entonces tengo dos directorios con el mismo contenido. Ahora cambio el nombre de todas las coincidencias del nombre del paquete de aplicaciones en todos los archivos * .java y en el archivo AndroidManifest (preparación del destino).

Para construir realmente dos versiones diferentes, ahora tendría que incluir el código de mi primera publicación. ¿Pero cómo tengo que hacer esto y cómo puedo construir ambas versiones en el objetivo de lanzamiento y escribir los archivos * .apk resultantes en el directorio de construcción?

Finalmente ... ¿Sería eso todo lo que tengo que hacer para compilar * .apks en ejecución que serían aceptados por el mercado de Android?

<?xml version="1.0" encoding="UTF-8"?> 
<project name="my.application" default="help" basedir="."> 
    <!-- Load the custom property files --> 
    <property file="build.properties" /> 
    <property file="passwords.properties" /> 

    <!-- Set global properties for this build --> 
    <property name="my.application.pkg" value="my.application"/> 
    <property name="my.application.pkg.full" value="my.application.full"/> 
    <property name="my.application.pkg.lite" value="my.application.lite"/> 

    <property name="my.application" location="."/> 
    <property name="my.application.build" location="build"/> 
    <property name="my.application.src" location="src"/> 
    <property name="my.application.res" location="res"/> 
    <property name="my.application.gen" location="gen"/> 

    <property name="my.application.full" location="full"/> 
    <property name="my.application.full.src" location="full/src"/> 
    <property name="my.application.full.res" location="full/res"/> 
    <property name="my.application.full.gen" location="full/gen"/> 
    <property name="my.application.full.build" location="full/build"/> 

    <property name="my.application.lite" location="lite"/> 
    <property name="my.application.lite.build" location="lite/build"/> 
    <property name="my.application.lite.src" location="lite/src"/> 
    <property name="my.application.lite.res" location="lite/res"/> 
    <property name="my.application.lite.gen" location="lite/gen"/> 

    <!-- Create and update the local.properties file --> 
    <loadproperties srcFile="local.properties" /> 

    <!-- Load the ant.properties file --> 
    <property file="ant.properties" /> 

    <!-- Load the project.properties file --> 
    <loadproperties srcFile="project.properties" /> 

    <!-- Quick check on sdk.dir. --> 
    <fail 
     message="sdk.dir is missing." 
     unless="sdk.dir" /> 

    <!-- Version-tag: 1 --> 
    <import file="${sdk.dir}/tools/ant/build.xml" /> 

    <target name="release" depends="report, prepare"> 
     <echo>Building the target!</echo> 
    </target> 

    <target name="prepare" depends="cleanup" > 
     <!-- Copy the Manifest.xml to the full copy --> 
     <copyfile src="${my.application}/AndroidManifest.xml" 
      dest="${my.application.full}/AndroidManifest.xml" /> 

     <!-- Copy the source files to the full copy --> 
     <copy todir="${my.application.full.src}" overwrite="true"> 
      <fileset dir="${my.application.src}" /> 
     </copy> 

     <!-- Copy the resources to the full copy --> 
     <copy todir="${my.application.full.res}" overwrite="true"> 
      <fileset dir="${my.application.res}" /> 
     </copy> 

     <!-- Copy the generated to the full copy --> 
     <copy todir="${my.application.full.gen}" overwrite="true"> 
      <fileset dir="${my.application.gen}" /> 
     </copy> 

     <!-- Replace the package name in the full manifest file --> 
     <replaceregexp file="${my.application.full}/AndroidManifest.xml" 
      match='package="(.*)"' 
      replace='package="${my.application.pkg.full}"' 
      byline="false" /> 

     <!-- Change the package name in all Java files --> 
     <replaceregexp flags="g" byline="false"> 
      <regexp pattern="${my.application.pkg}" /> 
      <substitution expression="${my.application.pkg.full}" /> 
      <fileset dir="${my.application.full.src}" includes="**/*.java" /> 
     </replaceregexp> 

     <!-- Copy the Manifest.xml to the lite copy --> 
     <copyfile src="${my.application}/AndroidManifest.xml" 
      dest="${my.application.lite}/AndroidManifest.xml" /> 

     <!-- Copy the source files to the lite copy --> 
     <copy todir="${my.application.lite.src}" overwrite="true"> 
      <fileset dir="${my.application.src}" /> 
     </copy> 

     <!-- Copy the resources to the lite copy --> 
     <copy todir="${my.application.lite.res}" overwrite="true"> 
      <fileset dir="${my.application.res}" /> 
     </copy> 

     <!-- Copy the generated to the lite copy --> 
     <copy todir="${my.application.lite.gen}" overwrite="true"> 
      <fileset dir="${my.application.gen}" /> 
     </copy> 

     <!-- Replace the package name in the lite manifest file --> 
     <replaceregexp file="${my.application.lite}/AndroidManifest.xml" 
      match='package="(.*)"' 
      replace='package="${my.application.pkg.lite}"' 
      byline="false" /> 

     <!-- Change the package name in all Java files --> 
     <replaceregexp flags="g" byline="false"> 
      <regexp pattern="${my.application.pkg}" /> 
      <substitution expression="${my.application.pkg.lite}" /> 
      <fileset dir="${my.application.lite.src}" includes="**/*.java" /> 
     </replaceregexp> 
    </target> 

    <!-- Deletes all directories, not needed anymore after compiling the source files --> 
    <target name="cleanup"> 
     <!-- Delete the full version build dir --> 
     <delete dir="${my.application.full}"/> 
     <!-- Delete the lite version build dir --> 
     <delete dir="${my.application.lite}"/> 
     <!-- Delete the *.apk file --> 
     <delete file="my.application.full.apk"/> 
     <!-- Delete the *.apk file --> 
     <delete file="my.application.lite.apk"/> 
    </target> 
</project> 
+0

¿Encontró alguna solución? Estoy atrapado en el mismo problema. ¿Compartirías por favor si arreglaste esto? – Mac

+0

Realmente no. Implementé el programa sin una versión ligera. Pero me gustaría encontrar una solución funcional. – Phidelux

Respuesta

3

Existen varias formas de lograr lo que necesita.

Aquí hay un par de ideas que he utilizado en el pasado,

1) Tener dos aplicaciones 'cabezas' que tiran en una biblioteca Android común. Cada encabezado inicializa los datos estáticos que configuran la biblioteca para que se comporten como versiones lite o completas de su aplicación. Esto tiene la ventaja de que puede realizar la compilación desde los proyectos de Eclipse, así como con Ant.

2) Tienen dos objetivos de compilación separados que comparten objetivos de compilación comunes para crear dos archivos apk separados. En el script de compilación Ant, haga que cree dos versiones del APK. Uno que es la versión completa y luego el otro que construye la versión lite. La diferencia entre los dos objetivos es que compilan utilizando archivos ligeramente diferentes (ya sea copiando, dirigiendo a diferentes directorios o modificando con scripts).

Todo esto se puede hacer en Ant utilizando objetivos y propiedades.

Si en el nivel superior de su compilación tiene un objetivo de lanzamiento dependiendo de otros dos objetivos.

p. Ej.

<target name="release" 
    depends="release-Full, release-Lite"> 
</target> 

<target name="release-Full"> 
    <ant antfile="thisbuild.xml" inheritAll="true" target="full"> 
    <property name="MyCustomProperty" value="Full" /> 
    </ant> 
</target> 



<target name="release-Lite"> 
    <ant antfile="thisbuild.xml" inheritAll="true" target="lite"> 
    <property name="MyCustomProperty" value="Lite" /> 
    </ant> 
</target> 

continuación, puede utilizar estos destinos y las propiedades para modificar su estructura para hacer lo que necesita para construir cada uno de los archivos APK.

Cuestiones relacionadas