2009-12-31 17 views
54

Come si configura un progetto che può risultare in un file di libreria jar che può essere utilizzato per Android? Voglio creare una libreria personalizzata su tutti i progetti.Librerie Jar Android

Poche altre domande:

  1. Ha bisogno di essere compilato contro una versione specifica di Android SDK?
  2. Quando un pacchetto Android è compilato su una libreria jar, le classi necessarie per lavorare con il codice vengono compilate con il codice principale nell'apk o l'intero jar viene incluso?
  3. Eventuali ottimizzazioni o insidie ​​notevoli che ho bisogno di sapere con l'uso di un barattolo invece di integrare direttamente il codice?
  4. Il barattolo deve essere firmato come deve fare l'apk?
+1

buona domanda +1 –

risposta

29

Google ha appena rilasciato una nuova versione dell'SDK che gestisce le librerie condivise!

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

ADT 0.9.7 (maggio 2010)

progetti Biblioteca:
il plugin ADT ora supporta l'uso di progetti di libreria durante lo sviluppo, una capacità che consente di memorizzare il codice dell'applicazione Android e le risorse in un progetto di sviluppo separato . È possibile fare riferimento al progetto di libreria da altri progetti Android e, al tempo di compilazione, gli strumenti compilano il codice e le risorse condivisi come parte delle applicazioni dipendenti. Altre informazioni su sono disponibili nello sviluppo di Eclipse con documento ADT.Se non si sta sviluppando in Eclipse, SDK Tools r6 fornisce il supporto del progetto equivalente della libreria tramite il sistema Ant build .

+0

Voglio solo menzionare, al momento di scrivere questo MotoDev Studio, se lo si utilizza, non supporta la possibilità di utilizzare Librarys. Sovrascrive molte delle GUI ADT standard e nasconde quella che consente di creare un progetto in una libreria. Sono sicuro che sarà risolto in tempo. – ddcruver

+0

MotoDev Studio 1.2.1 supporta ora le librerie condivise. –

+0

Sì, lo aggiornano circa due giorni dopo che Google ha rilasciato il nuovo ADT dimenticato di aggiornarlo. – ddcruver

29

Non c'è niente di speciale da fare nella configurazione del progetto per creare un file jar che funzioni in un'app Android. Basta creare un normale progetto Java in Eclipse.

  1. Non ha bisogno di essere compilato contro Android a tutti. Puoi includere qualsiasi file jar purché non faccia riferimento a classi che non sono incluse in Android. Basta includere il file jar nel percorso di generazione dei progetti Android in Eclipse e verrà automaticamente incluso nel file APK.

  2. Non sono sicuro, ma presumo che tutte le classi nel file jar vengano incluse nell'APK.

  3. Non penso che includere solo alcune classi in un vaso contro nel progetto direttamente farà alcuna differenza nell'APK risultante.

+9

4. Il JAR non ha bisogno di essere firmato. –

+1

Mi sono imbattuto in un posto di blocco. Ho layout personalizzati che aggiungono id al file R.java e ho altre dipendenze da Android. Come posso ottenere questi in un formato jar? –

+3

È possibile avere solo file di classe Java in un jar. Non puoi inserire XML di layout personalizzato lì. Devi solo copiare quelli nel tuo progetto. –

0

Se si guarda nel file android.jar sotto le piattaforme/android-x.x/android.jar file, include elementi di layout XML così si dovrebbe essere in grado di creare uno pure. Non sono sicuro esattamente su come lo fai e su come li fai riferimento nell'altro progetto.

5

Ho chiesto a myselft la stessa domanda: posso esportare e riutilizzare un layout in Android. Ho provato quanto segue: esportare un progetto con risorse XML in un file JAR, quindi provare ad accedere a un layout tramite il suo R.layout. Ovviamente non ha funzionato, dato che R.layout.main era un intero, lo stesso numero intero che era associato al layout singolo (relativo.xml) definito nel file R.layout del progetto host.

L'SDK di Android esegue il kompiling dei file xml di layout in Visualizza risorse e poiché i file XML nel file JAR incluso non sono file di layout xml, non vengono compilati e non viene associato alcun ID in R.layout.

Se si desidera esportare un layout dal progetto, è necessario esportarlo come XML e importarlo nel nuovo progetto come risorsa di layout, non come parte di una libreria esterna.

Se si desidera riutilizzare i layout da un JAR, è necessario creare una sublocazione di una vista e creare il layout dal codice. Puoi creare un'istanza e impostare l'istanza creata come Vista dell'attività o aggiungere l'istanza alla visualizzazione della tua attività.

3

per creare un file jar, è necessario utilizzare l'opzione di esportazione di Eclipse. Nella finestra di dialogo di esportazione, selezionare java e il sotto-punto JAR. Quindi viene visualizzata una procedura guidata in cui è necessario effettuare alcune selezioni. È necessario specificare la posizione in cui verrà archiviato il file jar.

Un errore che ho apportato la prima volta che ho creato un file jar, era includere il manifesto Android. Quando aggiungo il file jar creato, ho ottenuto un conflitto di doppio manifest di Android.

5

Questo lavoro per me !!!. se vuoi usare un file .jar nella tua applicazione da un progetto di libreria che usa risorse come attrs.xml (e supponi altri come layout, stringhe, ecc.) che generano un R.java. dovresti in eclissi andare su export->Java/Jar file-> e selezionare Esporta tutte le cartelle di output per il controllo projects -> Finish ... questo assicurerà che in fase di esecuzione la tua app che utilizza questo jar non generi un'eccezione per i clases e le risorse mancanti.

Naturalmente, per includere il barattolo nel tuo nuovo progetto vai a. project properties-> Java build path -> Libraries -> Add external jar -> e il gioco è fatto.

Spero che questo aiuto!

1

È possibile utilizzare un metodo personalizzato per raggiungere il file R in modo dinamico, il collegamento di esempio è riportato di seguito.

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; 
} 
Problemi correlati