Crear una biblioteca de Android Jar para distribución

160

Sé de proyectos de la Biblioteca de Android, que le permiten crear un proyecto de fuente compartida que se puede incorporar a las aplicaciones de Android según sea necesario. Sin embargo, eso requiere que la fuente esté disponible.

Estoy buscando una manera de construir y distribuir una biblioteca de código cerrado que pueda usarse en otros proyectos de Android como un JAR tradicional. Esto requerirá el uso del compilador de Android, por lo que no es un archivo JAR vanilla-Java. FWIW, no necesito incorporar recursos / diseños en el JAR.

He visto http://andparcel.com/ pero parece una solución alternativa, y preferiría usar algo 'oficialmente respaldado' por Google. Además, debo asegurarme de que el JAR que construyo sea compatible con la versión antigua / nueva del SDK de Android (es decir, necesito una forma de configurar la versión de la plataforma de destino, etc.).

¿Los últimos conjuntos de herramientas de Android permiten la creación / consumo de archivos binarios JAR? ¿Puede señalar alguna documentación sobre cómo puedo hacerlo?

psicotik
fuente
¿tienes respuesta a tu pregunta? Tengo un requisito similar ... ¿Cómo hiciste para crear archivos jar?
Krishnabhadra
Para distribuir un .jar para Android no necesita el compilador dx de Android, el compilador Java normal funciona. Si distribuye un jar, se convierte en bytecode dx cuando se crea la aplicación.
ThomasW

Respuestas:

49

Si crea un proyecto de biblioteca de Android sin tener ningún recurso, el ADT (notado por primera vez en r16) creará un archivo .jar con el mismo nombre que el proyecto en la carpeta 'bin'.

Freddroid
fuente
por favor vea esta pregunta stackoverflow.com/questions/12970802/…
vnshetty
1
Esto me da el frasco, pero ¿todavía necesito distribuir la carpeta de recursos? Intento activar el sherlock de la barra de acción y mis proyectos no se compilarán porque no pueden encontrar los recursos de la barra de acción.
Nathan Schwermann
1
@schwiz esto solo funciona para proyectos que no son de recursos (como afirmo en la respuesta). De lo contrario, debe importarlo como un proyecto estándar de la Biblioteca de Android.
Freddroid
1
¿Sigue siendo cierto? No veo myapp.jaren la /bincarpeta. Hay classes.jar, pero no es así, ¿verdad?
recolector de basura
Estoy ejecutando el último ADT y todavía obtengo un <nombre del proyecto> .jar en mi carpeta / bin. Pero si su proyecto depende de recursos, no es bueno y el proyecto debe incluirse como un proyecto de biblioteca (aún así obtendrá un .jar.
Freddroid
23

Android no proporciona un tipo especial de Android-JAR. Pero lo que puede hacer es agregar un build.xml a su proyecto y construir el JAR con ant.

Mi build.xml se ve así:

<project name="MyAndroidLib" default="dist" basedir=".">
  <description>
This is my Android lib
  </description>
  <!-- set global properties for this build -->
  <property name="src" location="src" />
  <property name="bin" location="bin" />

  <target name="jar">
    <jar destfile="MyAndroidLib.jar" basedir="bin/classes/">
      <!-- replace 'com' by what ever you are using -->
      <!-- as first part of the package name -->
      <!-- e.g. de, org, ... -->
      <!-- the ** is important to include the directory recursively -->
      <include name="com/**" />
    </jar>
  </target>
</project>

Construya el JAR ejecutándose ant jaren la carpeta principal de sus proyectos.

white_gecko
fuente
Intenté esto y pude construir un archivo JAR, pero el tamaño era extraño (solo 343 bytes), en comparación con la exportación de una biblioteca a JAR. ¿Alguna idea de qué banderas faltan?
Shane Oliver
Puede verificar el contenido del JAR con un programa de archivo (JAR es ZIP) y ver lo que falta y agregarlos. Puede encontrar más información aquí: ant.apache.org/manual/Tasks/jar.html
white_gecko
55
Con los últimos SDK de Android, se compilan los archivos Java bin/classes, por lo que <jar destfile="MyAndroidLib.jar" basedir="bin/">debería serlo<jar destfile="MyAndroidLib.jar" basedir="bin/classes/">
Theo
17

Puede crear un proyecto Java "normal" e importar desde allí Android.jar. Luego, tendrá acceso a todos los componentes del SDK. Luego, puede exportar su proyecto como jar ... y cargarlo desde su aplicación de Android. Esto funciona muy bien y parece una forma bastante sencilla de hacerlo.

ferostar
fuente
1
En ese caso, cómo declarar los componentes de la biblioteca, como servicios, actividades, receptores de difusión, filtros intencionales. ¿La aplicación cliente necesita mantener todas estas declaraciones en manifiesto?
Ron
@ferostar ¿Cómo puedo importar android.jar al proyecto java?
Krishnabhadra
En caso de que la biblioteca tenga recursos, cómo generar un R.java y agregarlo a JAR
15

simplemente vaya a las propiedades del proyecto del que desea hacer jar.Haga clic en la pestaña de Android. y marque en la biblioteca Is. ahora puede ver el archivo .jar en la carpeta bin. úselo donde quiera usarlo.

Dhrupal
fuente
2
Esto parece funcionar si LibraryProject no tiene recursos. ¿Alguna idea de cómo hacer que funcione con recursos?
Nathan Schwermann
Sin embargo, esta es una mala respuesta si su proyecto de biblioteca depende de otros proyectos. Esas referencias no serán recogidas.
stevebot
10

La única solución 'oficialmente admitida' por Google es el proyecto Biblioteca, y requiere que se distribuya el código fuente. Puede crear un JAR de la manera normal, pero no puede incluir ni hacer referencia a recursos dentro de él.

Desafortunadamente, creo que tampoco es posible incluir un JAR empaquetado dentro de un proyecto de Biblioteca, como un medio para evitar el requisito del código fuente.

Jeff Gilfelt
fuente
"Puede crear un JAR de la manera normal, pero no puede incluir o hacer referencia a recursos dentro de él". <- no parece funcionar bien en Eclipse si hago referencia a clases de Android o uso el compilador de Android. ¿Pistas sobre cómo hacer que eso funcione?
psychotik
55
Simplemente creo un proyecto Java normal en Eclipse, agrego android.jar a la ruta de compilación, luego selecciono Exportar - Java - Archivo Jar.
Jeff Gilfelt
@JeffGilfelt y si incluye android.jar para el directorio sdk de android-13, por ejemplo, ¿podrá usar su biblioteca jar todavía en proyectos para un nivel API más alto?
Fran Marzoa
10

En la última versión de Android Studio 1.2, la creación de la biblioteca JAR se hizo tan simple como señalar y hacer clic.

Pasos a seguir :

  • Ir a archivo -> Nuevo -> Nuevo módulo ingrese la descripción de la imagen aquí
  • Seleccione "Biblioteca Java" al final de la lista de opciones ingrese la descripción de la imagen aquí
  • Ingrese el nombre de la biblioteca jar y el nombre de la clase en ella y presione el botón Finalizar ingrese la descripción de la imagen aquí
  • Eso es !

El siguiente paso es agregar su Biblioteca Jar como dependencia en su aplicación. Tan simple como eso

  • Ir a archivo -> Estructura del proyecto -> Seleccione 'aplicación' -> Seleccione 'Dependencia'
  • Seleccione el '+' en la parte inferior -> Seleccione 'Dependencia del módulo' ingrese la descripción de la imagen aquí
  • Seleccione su módulo jar lib que acaba de crear arriba ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí
  • Seleccione Ok y eso es todo!

.... O simplemente puede agregar la siguiente línea a su archivo gradle de la aplicación

dependencies {
      compile fileTree(dir: 'libs', include: ['*.jar']) // Default Gradle Task, should be already present
      compile 'com.android.support:appcompat-v7:21.0.3' // Default Gradle Task, should be already present

      compile project(':nameOfYourJarLibraryModule') // This is your jar library module
 }

Google está promocionando Android Archive (AAR), aunque JAR es compatible con Android Studio. Para descubrir la diferencia entre AAR y JAR, consulte este enlace

Nishant
fuente
No entiendo cómo esto crea un nuevo archivo jar. Parece que estás creando un nuevo módulo que se usará como biblioteca en tu proyecto de Android
Jejefcgb
¡¿Qué?! creas un nuevo tarro de la nada?
Ewoks
@Ewoks: después de haber creado el módulo, debe agregarle las clases. Una vez hecho esto, lo agrega como una dependencia
Nishant.
2
La pregunta era: hay una biblioteca implementada con código fuente. Cómo hacer un jar de él para que solo se use jar en otro proyecto en lugar de todo el código fuente de la biblioteca ... ¿O me perdí algo?
Ewoks el
2
@Nishant. ¡Trabajó para mi! ¡Gracias!
ramires.cabral
6

Prueba esto: esto funciona

1) haga que su proyecto de biblioteca sea un proyecto normal deseleccionando el indicador IsLibrary.

2) Ejecute su proyecto como aplicación de Android. (No mostrará ningún error)

3) encontrará un archivo .jar en la carpeta bin junto con .apk.

4) Déle .jar que quiera usar su biblioteca.

5) Dígales que solo importen jar externos a la ruta de compilación.

esto funcionará bien con todos los recursos. la mejor de las suertes.

Aayush Rana
fuente
1
Tengo que corregir esta publicación: los archivos JAR pueden contener solo código, no recursos de Android. Si se incluyen / necesitan recursos, tenemos que mantener abierto el proyecto de la biblioteca y no podemos usar un simple archivo JAR.
cody
@cody: ¿Cómo generamos un archivo jar junto con recursos y lo usamos en otro proyecto?
Mahantesh M Ambi
1

El ADT crea una carpeta bin que contiene todos los archivos de clase para todos los archivos y directorios de origen coincidentes en su proyecto, puede usar el comando jar, crear un archivo jar que contenga estos archivos y directorios de clase y presumiblemente su biblioteca, pero por supuesto el el nivel de plataforma de los archivos de clase solo se orientaría al nivel actual de la compilación del proyecto; necesitaría un archivo jar diferente para cada nivel de plataforma; Sin embargo, lo mejor de esto es que el archivo R.class está incluido en el árbol del directorio del proyecto y por lo tanto tiene acceso a sus recursos. No sé si esta es la forma oficial de hacer cosas en Android, pero funcionó para mí.

David Evans
fuente
0

En nuestro proyecto, estamos creando apk (usando apkbuilder) que se instala en / system / framework y agrega este apk en classpath predeterminado. Para la compilación de aplicaciones usando el jar, estamos creando un archivo jar (usando jar c).

Nota: No tenemos recursos en la biblioteca.

Karan
fuente
0

.jar es solo un archivo .zip que contiene un archivo .class (puede intentar cambiar la extensión de cualquier archivo .jar a .zip y luego ver el resultado). Fácilmente, puede crear cualquier biblioteca .jar para cualquier propósito comprimiendo el archivo .class.

Renzokuken
fuente
No es estrictamente cierto, consulte en.wikipedia.org/wiki/JAR_(file_format) para ver diferencias sutiles (principalmente el pedido de entradas dentro del ZIP)
iddo
0

Pasos:

1) Abrir archivo project.properties

2) Agregar valor android.library=true

3) Guardar archivo

4) Desde el menú eclipse para el proyecto, seleccione construir automáticamente y luego seleccione limpiar

Resultado: se crea un nuevo jarro debajo de bin .

Pana Technica
fuente