2010-12-24 4 views
8

Ho un problema con Proguard e l'uso di librerie esterne. Il mio progetto viene compilato senza errori e viene eseguito correttamente su un dispositivo reale, ma solo quando viene eseguito da Eclipse. Ora voglio fare una versione di rilascio offuscato così ho fatto la seguente: corse "progetto -p aggiornamento Android ./" aggiunto(Android) Proguard non riesce a trovare la classe di riferimento dinamica javax.swing. *

proguard.dir=/home/stoned/android-sdk-linux_86/proguard4.5.1/lib 
proguard.config=/home/stoned/workspace/Fidoo/proguard.cfg 

quando corro "rilascio formica" ottengo il seguente:

... skipped many irrelevant messages ... 

-obfuscate: 
    [mkdir] Created dir: /home/stoned/workspace/Fidoo/bin/proguard 
     [jar] Building jar: /home/stoned/workspace/Fidoo/bin/proguard/original.jar 
[proguard] ProGuard, version 4.4 
[proguard] ProGuard is released under the GNU General Public License. The authors of all 
[proguard] programs or plugins that link to it (com.android.ant, ...) therefore 
[proguard] must ensure that these programs carry the GNU General Public License as well. 
[proguard] Reading input... 
[proguard] Reading program jar [/home/stoned/workspace/Fidoo/bin/proguard/original.jar] 
[proguard] Reading program jar [/home/stoned/workspace/Fidoo/libs/exapi-1.16.jar] 
[proguard] Reading program jar [/home/stoned/workspace/Fidoo/libs/libthrift.jar] 
[proguard] Reading program jar [/home/stoned/workspace/Fidoo/libs/log4j-1.2.14.jar] 
[proguard] Reading library jar [/home/stoned/android-sdk-linux_86/platforms/android-4/android.jar] 
[proguard] Initializing... 
[proguard] Warning: org.apache.log4j.lf5.viewer.categoryexplorer.CategoryNodeRenderer: can't find superclass or interface javax.swing.tree.DefaultTreeCellRenderer 
[proguard] Warning: org.apache.log4j.lf5.viewer.categoryexplorer.TreeModelAdapter: can't find superclass or interface javax.swing.event.TreeModelListener 
[proguard] Warning: org.apache.log4j.lf5.viewer.LogBrokerMonitor$32: can't find superclass or interface java.awt.event.ActionListener 
[proguard] Warning: org.apache.log4j.lf5.viewer.LogBrokerMonitor$31: can't find superclass or interface java.awt.event.ActionListener 

... skipped many lines of similar messages ... 

[proguard] Note: org.apache.log4j.lf5.viewer.categoryexplorer.CategoryAbstractCellEditor: can't find dynamically referenced class javax.swing.event.CellEditorListener 
[proguard] Note: org.apache.log4j.lf5.viewer.categoryexplorer.CategoryAbstractCellEditor: can't find dynamically referenced class javax.swing.event.CellEditorListener 
[proguard] Note: org.apache.log4j.lf5.viewer.categoryexplorer.CategoryAbstractCellEditor: can't find dynamically referenced class javax.swing.event.CellEditorListener 
[proguard] Note: org.apache.log4j.lf5.viewer.categoryexplorer.CategoryAbstractCellEditor: can't find dynamically referenced class javax.swing.event.CellEditorListener 
[proguard] Note: org.apache.log4j.spi.LocationInfo: can't find dynamically referenced class com.ibm.uvm.tools.DebugSupport 
[proguard] Note: there were 5 unresolved dynamic references to classes or interfaces. 
[proguard]  You should check if you need to specify additional program jars. 
[proguard] Warning: there were 1656 unresolved references to classes or interfaces. 
[proguard]   You may need to specify additional library jars (using '-libraryjars'), 
[proguard]   or perhaps the '-dontskipnonpubliclibraryclasses' option. 

Ovviamente, javax.swing. le classi non sono necessarie nell'applicazione Android, come pure nelle classi log4j. Come faccio a proguard a non cercare quelle librerie referenziate?

+4

'/ home/lapidato /' eh? – Nick

risposta

2

Bene, si inserisce log4j nel classpath (libs/log4j-1.2.14.jar). Ecco perché log4j è incluso. Sta anche inserendo riferimenti a javax.swing.

+0

Il mio progetto usa una libreria esterna, che usa libthrift.jar, che a sua volta usa log4j. Quindi non posso semplicemente rimuovere log4j. Inoltre - il compilatore non si lamenta di libs inesistenti (credo perché non sono usate nel codice), ma proguard fa – Renat

+0

che vedo. Tuttavia, ciò influisce sul comportamento di runtime dell'applicazione (tuttavia Proguard potrebbe non essere in grado di ottimizzare completamente il codice)? –

+0

Non crea apk affatto. Basta scrivere BUILD FAILED /home/stoned/android-sdk-linux_86/tools/ant/main_rules.xml:430: correggere prima gli avvertimenti sopra riportati. – Renat

6

Nevermind, appena aggiunto

-dontwarn 
-dontnote 

a proguard.cfg

19

Se non esiste una versione di log4j senza le dipendenze di Swing, e se non si può facilmente aggiungere un filtro sul vaso nella processo di generazione, la soluzione più pulita è quella di disattivare solo questi avvertimenti particolari in proguard.cfg:

-dontwarn org.apache.log4j.lf5.viewer.** 
-dontnote org.apache.log4j.lf5.viewer.** 

avrai quindi ancora ottenere altre avvertenze che potrebbero essere rilevanti.