2011-02-09 4 views
13

Quando si tenta di esportare il mio apk con Proguard ricevo un sacco di errori (più di 400) simili a:Problemi di Proguard con i file jar, come trovare il vaso mancante?

Warning: org.codehaus.jackson.jaxrs.JsonMappingExceptionMapper: can't find superclass or interface javax.ws.rs.ext.ExceptionMapper 

e

org.codehaus.jackson.xc.DataHandlerJsonDeserializer$1: can't find superclass or interface javax.activation.DataSource 

Sto usando il Jackson Json library, e gli errori sembrano correlate a tale.

ricerca di questo errore che ho trovato quanto segue da Proguards FAQ:

Se non ci sono riferimenti non risolti a classi o interfacce, molto probabilmente dimenticato di specificare una libreria essenziale. Per un'elaborazione corretta, è necessario specificare tutte le librerie a cui fa riferimento il codice, inclusa la libreria di runtime Java. Per specificare le librerie, utilizzare l'opzione -libraryjars.

cercare in giro su SO ho trovato un sacco di domande senza risposta relativi a questo, ma il senso generale è che il file jar sto usando (in questo caso Jackon JSON) si basa su più librerie e hanno bisogno di essere aggiunto al file di configurazione di Proguard un po 'come.

Tuttavia, non riesco a capire come determinare quali vasi sono necessari e dove sono. Gli avvertimenti parlare di un sacco di diversi pacchetti, come javax.ws.rs.ext, org.joda.time, org.codehaus.stax2, javax.xml.stream, ecc

  1. Come faccio a determinare che cosa barattoli contenere quei pacchetti? Ad esempio, quale jar è richiesto per le classi javax.ws.rs.ext. **?
  2. Come faccio a capire dove sono quei vasi e quale percorso sarebbe usato con i -libraryjars in Proguard?

Grazie molto


Edit: si dovrà ricordare che sto usando un Android Library Project configurazione. I vasi sono nel progetto principale della Libreria e il progetto di lavoro effettivo ha i loro percorsi di costruzione, inclusi i vasi nel progetto Libreria. Non so se questo faccia la differenza, ma ho pensato di doverlo menzionare.


Aggiornamento solo per testare, ho eliminato completamente la Jackson lontano dal percorso di generazione e dal mio codice e ora Proguard completata correttamente. Le domande rimangono ... Qual è l'approccio corretto per gestire questi errori?

Condivide la procedura guidata di esportazione Android in Eclipse aggiungere automaticamente il/lib/barattoli per Proguard o fare tutti devono essere aggiunte manualmente nel file di configurazione Proguard come questo:

-libraryjars C:/Project/lib/somjar.jar 

ho provato che per la Jackson uno, ma non ha fatto alcuna differenza. Questo significa che devo anche trovare tutti i barattoli necessari per le classi menzionate negli avvertimenti e aggiungerli? Sarebbero nel sdk o nell'installazione di java?

Scusate se queste sono domande stupide, ma ho cercato di capirlo per le ultime due ore e non ho idea di cosa fare.

Grazie ancora


aggiornare nuovamente

Quindi più cercando, in combinazione con il suggerimento di Benjamin, ho trovato alcune delle classi mancanti erano in rt.jar, che si trova nella cartella lib del JDK . Così ho finito per l'aggiunta di

-libraryjars <java.home>/lib/rt.jar 

Per il file proguard.cfg e ha portato gli avvertimenti da 485 fino a 204. Hey Direi che è una cosa ... I restanti avvertenze descrivono le classi che non riesco a trovare a tutti. L'app funziona perfettamente senza eseguire proguard, quindi queste classi devono essere in qualche posto giusto? O sono questi avvertimenti che dovrei usare -dontwarn con?

Le restanti classi sono in questi pacchetti:

org.joda.time. 
org.codehaus.stax2. 
javax.ws.rs. 

Così ora ho solo bisogno di un modo per capire:

  1. Cosa vasetti hanno queste classi
  2. Dove sono questi vasi in modo da può includerli nel file di configurazione proguard
+0

La prima pagina di Jackson che si collega specificamente afferma che Jackson ha una dipendenza esterna ** zero **. Sei sicuro che il problema sia con Jackson JSON? – SyntaxT3rr0r

+0

@Syntax, questo è quello che pensavo, ma tutti gli avvertimenti 485 sono * org.codehaus.jackson.qualcosa: impossibile trovare la classe di riferimento qualcosa.else * Nessuna delle altre librerie che sto usando fornisce avvertimenti. In risposta alla tua domanda però, no non sono sicuro che il problema sia con Jackson. Non ho altri lead a questo punto. – cottonBallPaws

risposta

5

ho avuto problemi simili con Proguard ed errori simili stavo usando un osmdroid.jar che ha creato OK non offuscato. Questo jar deve avere dipendenze esterne di cui la mia applicazione non ha avuto bisogno. Fortunatamente gli autori hanno elencato i barattoli necessari e una volta che li ho scaricati e detto a Proguard tramite l'opzione -libraryjars, la build Proguard era OK.

Re vostri vasi mancanti (che probabilmente non ha realmente bisogno, ma Proguard pensa che si potrebbe!), Si dovrebbe trovare loro a:

org.joda.time (Il vaso è all'interno della zip)

org.codehaus.stax2.

javax.ws.rs.

+0

Questo ha funzionato, grazie! Li ho scaricati in una directory esterna al mio progetto e ho aggiunto il percorso completo a loro nel file proguard.cfg come * -libraryjars C: /FullPathTo/JarLocations/jar.jar* e finalmente è stato in grado di completarlo. Lascerò questo senza risposta per il resto della giornata nel caso che qualcun altro abbia altro da aggiungere su questo problema. Grazie ancora. – cottonBallPaws

3

Posso solo fornire una risposta per t egli prima parte: Dare

http://www.findjar.com

una prova, ci si potrebbe trovare i nomi dei file jar necessari like so

+0

@Laurel: Grazie per avermelo fatto sapere! –

+0

Nessun problema! Fa parte di un [progetto più grande] (http://meta.stackoverflow.com/questions/321494) per ripulire i collegamenti brevi. Sono felice che qualcuno abbia finalmente riconosciuto uno dei miei commenti. – Laurel

0

non è necessario includere le librerie per Proguard; è necessario invece istruire Proguard a mantenere i nomi delle classi e alcune altre cose. Ho giocato intorno con esso un po 'me stesso, e ho finito con qualcosa di simile a this discussion:

-keepnames class org.codehaus.** { *; } 
-keepattributes *Annotation*,EnclosingMethod 
-dontwarn org.codehaus.jackson.** 

Se si verificano ancora incidenti — e vorrei suggerire testare con forza! — si potrebbe desiderare di mantenere intatto con Jackson:

-keep class org.codehaus.** { *; } 
-keepattributes *Annotation*,EnclosingMethod 
-dontwarn org.codehaus.jackson.** 

(Si noti che quest'ultimo produce un file di dimensioni maggiori.