2012-05-31 15 views
6

Estoy compilando un APK de Android usando Ant. El APK se instalará en un entorno que tenga un archivo jar (llámalo foo.jar). Por lo tanto, el APK necesitará saber sobre foo.jar durante la compilación, pero no lo quiero incluir en classes.dex (ya que estará disponible).Android Ant build: cómo compilar contra un JAR pero excluirlo de classes.dex?

Tenga en cuenta que esto no es sólo una cuestión de poner el frasco en el directorio 'libs'. Si bien eso soluciona la parte de compilación del problema, no resuelve el problema de mantener el jar fuera de classes.dex.

Gracias de antemano por su ayuda.

Respuesta

1

¿Qué hay de poner el frasco en algún otro directorio (por ejemplo, foo/) y añadiendo que a la ruta de clase de compilación? De esta forma, el JAR no se "exporta" y, por lo tanto, la herramienta dex no actúa en consecuencia.

+0

Gracias por la respuesta -. entiendo lo que estás diciendo, y debería funcionar ... si hay una ruta de clases utilizado para compilación pero no actuado por la herramienta dex. Cada vez que obtengo el jar en el classpath de compilación, también lo hace dex. ¿Conoces una manera de separarlos? – user1103993

+2

Generalmente, una carpeta que se encuentra en el classpath de compilación no se ha agregado a 'classes.dex'. Necesita exportar explícitamente los JAR que desea compilar en dex. Sin embargo, para su comodidad, las herramientas SDK consideran la carpeta 'libs /' como un caso especial. Cualquier cosa en esta carpeta se agrega automáticamente a 'classes.dex'. Por lo tanto, intente crear una carpeta con un nombre diferente y agréguelo al classpath. Lea [this] (http://tools.android.com/recent/dealingwithdependenciesinandroidprojects) para obtener más detalles. Tenga en cuenta que estos cambios se introdujeron en las herramientas SDK r17. – curioustechizen

+0

Gracias de nuevo por la ayuda. Yo te votaría, pero como novato, no tengo suficiente reputación. – user1103993

1

Lo que funciona para mí es copiar los archivos jar de exclusión en mi directorio "libs" antes de la compilación, en el destino "-pre-compilar", y luego eliminar estos archivos de "libs" después de compilar, en taget "-post -compilar". proyecto

  • que no funcionaba si he copiado los archivos de destino "-preparaciones de acumulación", que tenía que ser objetivo "pre-compilar"
  • tuve que establecer la ruta":

    Nota .all.jars.path" después de copiar para evitar errores

en mi ejemplo código pegado necesito los frascos en el directorio al que hace referencia la propiedad 'libs.ads.dir' para la compilación, pero no los quiero incluidas en el mi tarro:

<target name="-pre-compile"> 
    <copy todir="${jar.libs.dir}"> 
     <fileset dir="${libs.ads.dir}"/> 
    </copy> 

    <path id="project.all.jars.path"> 
     <fileset dir="${jar.libs.dir}"> 
      <include name="**/*.jar"/> 
     </fileset> 
    </path> 
</target> 

<target name="-post-compile" > 
    <delete> 
     <fileset dir="${jar.libs.dir}" casesensitive="yes"> 
      <present present="both" targetdir="${libs.ads.dir}"/> 
     </fileset> 
    </delete> 
</target> 
+0

He resuelto esto de manera similar, pero obtengo java.io.FileNotFoundException en el paso "Convertir archivos compilados y externos en classes.dex", ¿cómo se evita que el dexing intente extraerlo? – Nthalk

6

hay dos caminos utilizados por -compile como classpathref para compilar pero uno de ellos no se utiliza en Dexing.

<target name="-compile" depends="-build-setup, -pre-build, -code-gen, -pre-compile"> 
    <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping..."> 
     <!-- merge the project's own classpath and the tested project's classpath --> 
     <path id="project.javac.classpath"> 
      <path refid="project.all.jars.path" /> 
      <path refid="tested.project.classpath" /> 
     </path> 
     <javac encoding="${java.encoding}" 
       source="${java.source}" target="${java.target}" 
       debug="true" extdirs="" includeantruntime="false" 
       destdir="${out.classes.absolute.dir}" 
       bootclasspathref="project.target.class.path" 
       verbose="${verbose}" 
       classpathref="project.javac.classpath" 
       fork="${need.javac.fork}"> 
      <src path="${source.absolute.dir}" /> 
      <src path="${gen.absolute.dir}" /> 
      <compilerarg line="${java.compilerargs}" /> 
     </javac> 
     … 
</target> 

Estas rutas son “project.all.jars.path” y "tested.project.classpath", pero el “tested.project.classpath" camino no se utilice en Dexing para que pueda modificarlo en el pre -compile objetivo de la siguiente manera:

<target name="-pre-compile" > 
    <path id="tmp"> 
     <pathelement path="${toString:tested.project.classpath}"/> 
     <fileset dir=“${exported.jars.dir}” > 
      <include name="*.jar" /> 
     </fileset> 
    </path> 
    <path id="tested.project.classpath"><pathelement path="${toString:tmp}"/></path> 
    <path id="tmp"/>   
</target> 

Aquí, anexe el camino de sus tarros exportados a “tested.project.classpath” antes de que comience la compilación usted puede poner “exported.jars.dir” en su hormiga.. archivo de propiedades

+0

¿Cómo hago esto con Gradle? Gracias. – inder