proguard hell - impossibile trovare la classe di riferimento


125

Quindi, sto provando a rilasciare alcuni software, ma Proguard mi sta facendo venire il mal di testa.

Quando provo ad esportare usando proguard ricevo molti avvisi, ad esempio "impossibile trovare la classe di riferimento"

Per esempio:

[2011-08-07 17:44:37 - GAME] Warning: org.simpleframework.xml.stream.StreamReader: can't find referenced class javax.xml.stream.events.XMLEvent
[2011-08-07 17:44:37 - GAME] Warning: there were 52 unresolved references to classes or interfaces.
[2011-08-07 17:44:37 - GAME]          You may need to specify additional library jars (using '-libraryjars'),
[2011-08-07 17:44:37 - GAME]          or perhaps the '-dontskipnonpubliclibraryclasses' option.
[2011-08-07 17:44:37 - GAME] java.io.IOException: Please correct the above warnings first.
[ 

Gli avvisi sembrano essere correlati a simpleframework, quindi nel mio file di configurazione proguard ho aggiunto quanto segue:

-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar

Dov'è pathtoprojecttolibsil percorso dei barattoli a cui fa riferimento il mio progetto.

Questo non fa differenza.

Se riferimenti a simpleframework javax posso dire a proguard di ignorare anche questo ??

Qualche idea?


1
Stai usando proguard solo per fare alberi? In tal caso, hai controllato la dimensione del tuo file senza usarlo? Puoi ottenere bug superwierd quando proguard butta fuori qualcosa a cui si accede usando, ad esempio, la riflessione che non troverai finché non si rompe il runtime, quindi sii davvero, davvero sicuro di averne bisogno.
Alun,

Lo stavo davvero usando solo per cercare di proteggere il codice che veniva codificato con la stessa facilità? Pensi che ne valga la pena?
iasksillyquestions,

3
@ListenToRick Proguard è perfettamente funzionante, se eseguito con le configurazioni corrette e l'app risultante testata correttamente. Sono abbastanza sicuro che Google ne consiglia persino l'uso. Google fornisce molte guide / esempi per l'utilizzo di Proguard con le app Android.
CrackerJack9

Proguard è un buon strumento, ma google lo consiglia probabilmente è almeno tanto a causa di una limitazione delle dimensioni piuttosto strana nel formato dex come qualsiasi altra cosa. (Vedi code.google.com/p/android/issues/detail?id=7147 )
alun

5
@alun, non è questo il motivo. Quelli di noi che non vogliono che le nostre app vengano retroingegnerizzate o che utilizzano le licenze per "tentare" di prevenire la pirateria dovrebbero utilizzare uno strumento di offuscamento come questo per rendere più difficile il lavoro per gli hacker. Fare in modo che l'applicazione occupi meno spazio è anche un vantaggio per l'utente finale e ci sono anche ottimizzazioni apportate da questi strumenti ... un altro vantaggio.
Christopher Perry,

Risposte:


128

org.simpleframework.xml.stream.StreamReadernel tuo codice si riferisce a javax.xml.stream.events.XMLEvent. Quest'ultima classe fa parte del runtime Java ( rt.jar) ma non fa parte del runtime Android ( android.jar), quindi ProGuard avverte che qualcosa potrebbe non funzionare. Se sei sicuro che l'applicazione funzioni comunque, puoi specificare

-dontwarn javax.xml.stream.events.**

Inferno ProGuard?


15
Ciò non ha risolto il problema per me, tuttavia è stato così-dontwarn javax.xml.**
Jeshurun,

8
L'aggiunta ha -libraryjars <java.home>/lib/rt.jarrisolto il problema per me.
Gautam,

3
Ho ricevuto ulteriori avvertenze su ad esempio javax.xml.stream.XMLInputFactory, quindi ho usato-dontwarn javax.xml.stream.**
spazialista il

1
Come posso impostare -dontwarncantare la GUI?
Tomáš Zato - Ripristina Monica

2
L'inferno di Proguard continua, basta scuotermi e finire con questo dolore.
Josh,


5

Questo errore si verifica perché le librerie che usi dipendono da altre librerie che non sono realmente utilizzate, ma Proguard le sta cercando.
Aggiungi le tue linee -dontwarn al tuo file proguard-rules.pro nel tuo progetto Android per disabilitare questi avvisi.

inserisci qui la descrizione dell'immagine

Puoi trovare quali dipendenze devi aggiungere a proguard-rules.pro nello stacktrace del tuo errore.


2

Dovresti includerlo nella tua configurazione Proguard:

-dontskipnonpubliclibraryclasses

Beh, all'epoca è successo per me ... ~ 4 anni fa ... le cose potrebbero essere cambiate da allora :) Sembrava aver funzionato per almeno altre 2 persone.
CrackerJack9,

Il proguard-android.txt predefinito ha già questa linea.
Cristina De Rito,

1
@Ultimecia che si impegna dal 2013, questo post è stato pubblicato nel 2011
CrackerJack9

2

La mia chiave magica che ha risolto le mie ore di ricerca: aggiungi questo a progruard-android.txt

-dontskipnonpubliclibraryclassmembers

0

Hmm. Leggendo questo avviso sembrerebbe che la libreria che si sta tentando di utilizzare abbia una dipendenza da javax.xml.stream.events. Non penso che lo spazio dei nomi sia effettivamente incluso in Android. (Vedi l' indice del pacchetto ).

Prova a distribuirlo nell'emulatore senza usare proguard e verifica se funziona. La mia ipotesi sarebbe no se quell'avvertimento fosse accurato.


Ciao, se funziona nell'emulatore senza il proguard, significa che gli avvisi sono inaccurati? Sto cercando di capire perché ho avuto questo tipo di avvertimenti simili. Non voglio solo sopprimere gli avvisi.
Michelle Shieh,

0

Penso che questo sia un caso limite, ma nel mio caso ho dovuto cancellare completamente la cartella build sul mio proguard Jenkins ha provato a lavorare con il vecchio codice che non c'era più - nel caso in cui qualcuno abbia lo stesso problema.


0

Nel mio caso non ho cambiato nulla e gli avvisi hanno iniziato a mostrare. Il problema era con cache di grado rotto. Controlla la mia altra risposta . Condivido questo perché ci sono volute 2 ore per trovare il problema:]


0

Aggiungi questa riga al tuo proguard-rules.profile nella directory degli script gradle:

-dontwarn package.class.name.**

dove si package.class.nametrova il nome del pacchetto con il nome della classe del file jar aggiunto.

Per esempio:

-dontwarn com.myexternalclass.utils.**
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.