2009-12-31 23 views
54

¿Cómo se configura un proyecto que puede dar como resultado un archivo de biblioteca jar que se puede utilizar para Android? Quiero crear una biblioteca personalizada en todos los proyectos.Android Jar bibliotecas

Pocas otras preguntas:

  1. ¿Tiene que ser compilado con una versión específica del SDK de Android?
  2. Cuando se compila un paquete de Android en una biblioteca jar, ¿las clases necesarias para trabajar con el código se compilan con el código principal en la apk o se incluye todo el jar?
  3. ¿Alguna optimización o error importante que deba conocer al usar un contenedor en lugar de integrar el código directamente?
  4. ¿El contenedor debe estar firmado como lo necesita el apk?
+1

buena pregunta 1 –

Respuesta

29

Google acaba de lanzar una nueva versión del SDK que maneja Bibliotecas Compartidas.

https://developer.android.com/tools/projects/projects-eclipse.html#SettingUpLibraryProject

ADT 0.9.7 (mayo de 2010)

proyectos de Bibliotecas:
El ADT Plugin ahora apoya el uso de proyectos de bibliotecas durante el desarrollo, una capacidad que permite que tienda compartida Android código de la aplicación y los recursos en un proyecto de desarrollo separado . Puede luego referenciar el proyecto de biblioteca desde otros proyectos de Android y, al tiempo de compilación, las herramientas compilan el código compartido y los recursos como parte de las aplicaciones dependientes. Más información sobre es disponible en el desarrollo en Eclipse con documento ADT.Si no está desarrollando el en Eclipse, SDK Tools r6 proporciona el soporte de proyecto de biblioteca equivalente a través del sistema Ant build .

+0

Solo quiero mencionar también que, al escribir este MotoDev Studio, si lo usa no admite la capacidad de usar las bibliotecas. Anula muchas de las GUI de ADT estándar y oculta la que le permite convertir un Proyecto en una Biblioteca. Estoy seguro de que se arreglará a tiempo. – ddcruver

+0

MotoDev Studio 1.2.1 es compatible ahora con bibliotecas compartidas. –

+0

Sí, lo actualizan unos dos días después de la publicación de Google. El nuevo ADT olvidó actualizar esto. – ddcruver

29

No hay nada especial que deba hacer en la configuración de su proyecto para crear un archivo jar que funcione en una aplicación de Android. Simplemente crea un proyecto Java normal en Eclipse.

  1. No es necesario que se compile contra Android en absoluto. Puede incluir cualquier archivo jar siempre que no haga referencia a las clases que no están incluidas en Android. Simplemente incluya su archivo jar en su ruta de compilación de sus proyectos de Android en Eclipse, y se incluirá automáticamente en su archivo APK.

  2. No estoy seguro pero supongo que todas las clases en el archivo jar se incluyen en el APK.

  3. No creo que solo incluir algunas clases en un jar vs. en el proyecto directamente haga una diferencia en el APK resultante.

+9

4. El JAR no tiene que ser firmado. –

+1

Acabo de toparme con un obstáculo. Tengo diseños personalizados que agregan identificadores al archivo R.java y tengo otras dependencias de Android. ¿Cómo puedo obtener esto en un formato jar? –

+3

Solo puede tener archivos de clase Java en un jar. No puede poner XML de diseño personalizado allí. Tienes que copiarlos en tu proyecto. –

0

Si nos fijamos en el archivo android.jar bajo plataformas/android-X.X/android.jar presentar sí incluye elementos de diseño XML por lo que debe ser capaz de crear uno también. Simplemente no estoy seguro exactamente de cómo lo haces y cómo los haces referencia en el otro proyecto.

5

Le hice a myselft la misma pregunta: puedo exportar y volver a utilizar un diseño en Android. Intenté lo siguiente: exportar un proyecto con recursos XML a un archivo JAR y luego intentar acceder a un diseño a través de R.layout. Por supuesto, no funcionó, ya que R.layout.main era un número entero, el mismo número entero que estaba asociado al diseño único (relative.xml) definido en R.layout del proyecto de host.

El SDK de Android empaqueta los archivos xml en Ver recursos, y como los archivos XML en el archivo JAR incluido no son archivos xml de diseño, no se compilan y no se asocian a ellos en R.layout.

Si desea exportar un diseño de su proyecto, debe exportarlo como XML e importarlo al nuevo proyecto como un recurso de diseño, no como parte de una biblioteca externa.

Si desea reutilizar diseños de un JAR, debe crear una subcategoría de una Vista y crear el diseño desde el código. Luego puede instanciarlo y establecer la instancia creada como la Vista de la actividad, o agregar la instancia a la Vista de su actividad.

3

Para crear un archivo jar, debe usar la opción Exportar de Eclipse. En el cuadro de diálogo de exportación, elija java y la subopción JAR. LUEGO se muestra un asistente donde debe hacer algunas selecciones. Debe especificar la ubicación donde se almacenará el archivo jar.

Un error que cometí la primera vez que creé un archivo jar fue incluir el Manifiesto de Android. Al agregar el archivo jar creado, tengo un conflicto de doble manifiesto de Android.

5

Esto funciona para mí !!!. si desea utilizar un archivo .jar en su aplicación desde un proyecto de biblioteca que use recursos como attrs.xml (y suponga otros como diseños, cadenas, etc.) que generen un R.java. debe eclipsar ir a export->Java/Jar file-> y marcar Exportar todas las carpetas de salida para projects -> Finish marcado ... esto garantizará que en el tiempo de ejecución su aplicación que utiliza este jar no genere una excepción para las clases y recursos que faltan.

Por supuesto, para incluir el tarro en su nuevo proyecto, vaya a. project properties-> Java build path -> Libraries -> Add external jar -> y listo.

¡Espero que esta ayuda!

1

Puede usar un método personalizado para llegar al archivo R de forma dinámica, el enlace de ejemplo está debajo.

Packaging Android resource files within a distributable Jar file

public static int getResourseIdByName(String packageName, String className, String name) { 
    Class r = null; 
    int id = 0; 
try { 
    r = Class.forName(packageName + ".R"); 

    Class[] classes = r.getClasses(); 
    Class desireClass = null; 

    for (int i = 0; i < classes.length; i++) { 
     if(classes[i].getName().split("\\$")[1].equals(className)) { 
      desireClass = classes[i]; 

      break; 
     } 
    } 

    if(desireClass != null) 
     id = desireClass.getField(name).getInt(desireClass); 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} catch (IllegalArgumentException e) { 
    e.printStackTrace(); 
} catch (SecurityException e) { 
    e.printStackTrace(); 
} catch (IllegalAccessException e) { 
    e.printStackTrace(); 
} catch (NoSuchFieldException e) { 
    e.printStackTrace(); 
} 

return id; 
} 
Cuestiones relacionadas