2015-05-07 8 views
5

Apprezzo che ciò possa sembrare assurdo, ma è possibile rilasciare due versioni diverse di una libreria .jar in un progetto Android (in cui entrambe le versioni hanno ovviamente nomi di pacchetti e classi identici o sovrapposti) e in qualche modo puntano esplicitamente a uno di quando importano le classi della libreria nelle mie stesse sorgenti Java?Posso in qualche modo includere e utilizzare più versioni di una determinata libreria .jar?

Il mio ambiente di sviluppo è Android Studio con Gradle.

Il motivo per cui ho pensato di farlo (se possibile) è perché mi affido a una libreria di driver .jar con fornitore closed-source per un dispositivo USB con cui funziona la mia applicazione Android. Il fornitore ha aggiunto il supporto per le versioni di chip più recenti nei loro ultimi driver, ma allo stesso tempo ha abbandonato il supporto per le versioni di chip più vecchie. Questa è una decisione che hanno preso per la loro buona ragione ed è improbabile che venga invertita. L'idea che ho è di portare in qualche modo sia le vecchie che le nuove versioni della libreria nella mia applicazione in modo che possa continuare a supportare l'hardware precedente.

Suppongo che una cosa del genere sia teoricamente possibile, ma un affare complicato, forse che richiede una .jar da decompilare ei nomi dei pacchetti cambiati?

+1

Dovresti usare qualcosa come ** 'jarjar' ** per riconfezionare uno dei JAR, a meno di giocare a brutti giochi di classloader. – CommonsWare

+0

L'ordine di quei file JAR in CLASSPATH è importante. Quale mai viene prima, le classi JAR verranno caricate (poiché lo spazio dei nomi è lo stesso). – K139

+0

Grazie gentiluomini, il tuo contributo è molto apprezzato. La proposta 'jarjar' è molto interessante. – Trevor

risposta

6

Con mia grande sorpresa, ho avuto molto rapidamente successo utilizzando l'utilità jarjar come suggerito da CommonsWare.

La chiave per capire come fare questo è stato questo QA:

Hand Edit A Jar to Change Package Names

ho rinominato uno dei miei .jar s utilizzando le indicazioni di cui sopra e ora ho tutti e due seduti fianco a fianco nel mio progetto .

Non voglio duplicare SO contenuto, ma per completezza, ho fatto la seguente:

Ottenuto l'ultima versione di jarjar.

creato un file di configurazione chiamato rules.txt contenente una sola linea:

rule uk.co.dog.** [email protected] 

Questo è solo un esempio. Dato un file .jar con il pacchetto uk.co.dog.*, lo dog passerà a cat. Ovviamente cambia questo per adattarlo al tuo caso reale.

Quindi utilizzare la riga di comando:

java -jar jarjar.jar process rules.txt in.jar out.jar 

Dove in.jar è la sorgente e .jar out.jar è trasformata.

Problemi correlati