2014-12-29 12 views
8

Ho riscontrato un problema nella generazione degli APK delle mie applicazioni.Impossibile creare APK con Android Studio quando si utilizza il minisito ProGuard

Se eseguo il debug/eseguire l'app, funziona normalmente. Ma quando provo a generare il corrispondente APK, Android Studio mi dà un sacco di avvertimenti e uno di errore:

Note: there were 159 duplicate class definitions. 
    (http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass) 
Warning:com.thoughtworks.xstream.converters.reflection.CGLIBEnhancedConverter$ReverseEngineeredCallbackFilter: can't find superclass or interface net.sf.cglib.proxy.CallbackFilter 
Warning:org.apache.harmony.awt.datatransfer.DataProxy: can't find superclass or interface java.awt.datatransfer.Transferable 
Warning:org.apache.harmony.awt.datatransfer.NativeClipboard: can't find superclass or interface java.awt.datatransfer.Clipboard 
Warning:library class android.content.res.XmlResourceParser extends or implements program class org.xmlpull.v1.XmlPullParser 
Warning:library class org.apache.http.auth.AuthenticationException extends or implements program class org.apache.http.ProtocolException 
[...] 
Warning:library class org.apache.http.impl.conn.LoggingSessionOutputBuffer extends or implements program class org.apache.http.io.SessionOutputBuffer 
Warning:com.itextpdf.testutils.ITextTest: can't find referenced class javax.management.OperationsException 
Warning:com.itextpdf.text.pdf.BarcodeCodabar: can't find referenced class java.awt.Color 
[...] 
Warning:com.itextpdf.text.pdf.security.MakeXmlSignature: can't find referenced class javax.xml.crypto.dsig.spec.C14NMethodParameterSpec 
[...] 
Warning:com.sun.mail.handlers.image_gif: can't find referenced class java.awt.datatransfer.DataFlavor 
[...] 
Warning:com.sun.mail.imap.protocol.IMAPSaslAuthenticator: can't find referenced class javax.security.sasl.Sasl 
[...] 
Warning:com.thoughtworks.xstream.converters.extended.ColorConverter: can't find referenced class java.awt.Color 
[...] 
Warning:org.apache.harmony.awt.ContextStorage: can't find referenced class java.awt.Toolkit 
[...] 
Warning:org.spongycastle.jce.provider.X509LDAPCertStoreSpi: can't find referenced class javax.naming.directory.InitialDirContext 
[...] 
Warning:library class android.content.Intent depends on program class org.xmlpull.v1.XmlPullParser 
[...] 
Warning:library class org.apache.http.client.HttpClient depends on program class org.apache.http.HttpResponse 
[...] 
Warning:library class org.xmlpull.v1.XmlPullParserFactory depends on program class org.xmlpull.v1.XmlPullParser 
Warning:there were 1077 unresolved references to classes or interfaces. 
     You may need to add missing library jars or update their versions. 
     If your code works fine without the missing classes, you can suppress 
     the warnings with '-dontwarn' options. 
     (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass) 
Warning:there were 141 instances of library classes depending on program classes. 
     You must avoid such dependencies, since the program classes will 
     be processed, while the library classes will remain unchanged. 
     (http://proguard.sourceforge.net/manual/troubleshooting.html#dependency) 
Warning:there were 5 unresolved references to program class members. 
     Your input classes appear to be inconsistent. 
     You may need to recompile the code. 
     (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember) 
:vet:proguardInternalRelease FAILED 
Error:Execution failed for task ':PROJECTNAME:proguardInternalRelease'. 
> java.io.IOException: Please correct the above warnings first. 
Information:BUILD FAILED 
Information:Total time: 13.878 secs 
Information:1 error 
Information:679 warnings 
Information:See complete output in console 

Il progetto è costituito da un progetto di libreria, importati come progetto esterno come questo in settings.gradle:

include ':library' 
project(':library').projectDir = new File(settingsDir, '../Library/library') 

con tutte le dipendenze.

La build.gradle della biblioteca è

apply plugin: 'com.android.library' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     minSdkVersion 15 
     targetSdkVersion 21 
     multiDexEnabled true 
    } 

    packagingOptions { 
     exclude 'META-INF/DEPENDENCIES' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE.txt' 
    } 

} 

dependencies { 
    compile 'com.google.android.gms:play-services:+' 
    compile 'com.android.support:support-v13:21.0.+' 
    compile 'com.android.support:multidex:1.0.0' 
    compile('ch.acra:acra:4.5.0') { 
     exclude group: 'org.json' 
    } 
    compile 'org.apache.httpcomponents:httpcore:4.3' 
    compile('org.apache.httpcomponents:httpmime:4.3.1') { 
     exclude group: 'org.apache.httpcomponents', module: 'httpcore' 
     exclude group: 'org.apache.httpcomponents', module: 'httpclient' 
    } 
    compile('javax.mail:mail:1.4.7') { 
     exclude module: 'activation' 
    } 
    compile 'com.madgag.spongycastle:pkix:1.50.0.0' 
    compile 'org.ccil.cowan.tagsoup:tagsoup:1.2.1' 
    compile ('com.itextpdf.tool:xmlworker:5.5.1'){ 
     exclude module: 'itextpdf' 
    } 
    compile('com.thoughtworks.xstream:xstream:1.4.4') { 
     exclude group: 'xmlpull', module: 'xmlpull' 
    } 
    compile 'com.google.zxing:core:3.0.1' 
    compile files('libs/activation.jar') 
    compile files('libs/additionnal.jar') 
    compile files('libs/miniTemplator.jar') 
    compile files('libs/itextg-5.5.1.jar') 
} 

e il progetto è build.gradle

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "my.package.name" 
     minSdkVersion 15 
     targetSdkVersion 21 
     multiDexEnabled true 
    } 

    buildTypes { 
     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    productFlavors { 
     def BOOLEAN = "boolean" 
     def TRUE = "true" 
     def FALSE = "false" 
     def A_FIELD= "A_FIELD" 

     internal { 
      buildConfigField BOOLEAN, A_FIELD, FALSE 
     } 

     official { 
      buildConfigField BOOLEAN, A_FIELD, TRUE 
     } 
    } 


    packagingOptions { 
     exclude 'META-INF/DEPENDENCIES' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE.txt' 
    } 
} 

dependencies { 
    compile project(':library') 
} 

afterEvaluate { 
    tasks.matching { 
     it.name.startsWith('dex') 
    }.each { dx -> 
     if (dx.additionalParameters == null) { 
      dx.additionalParameters = [] 
     } 
     dx.additionalParameters += '--multi-dex' 
    } 
} 

Come faccio a risolvere il problema in modo che l'APK può essere compilato?

EDIT: Dopo aver aggiunto un sacco di opzioni -dontwarn al mio proguard-rules.pro, ho ottenuto l'errore in ogni caso, e non posso risolvere questi avvertimenti (Here ci sono alcuni suggerimenti, ma non per questi avvertimenti .. .):

Warning:com.itextpdf.text.pdf.security.PdfPKCS7: can't find referenced method 'ASN1Integer(int)' in program class org.spongycastle.asn1.ASN1Integer 
Warning:com.sun.activation.viewers.ImageViewer: can't find referenced method 'java.awt.Component add(java.awt.Component)' in program class com.sun.activation.viewers.ImageViewer 
Warning:com.sun.activation.viewers.ImageViewer: can't find referenced method 'java.awt.Toolkit getToolkit()' in program class com.sun.activation.viewers.ImageViewer 
Warning:com.sun.activation.viewers.ImageViewer: can't find referenced method 'void invalidate()' in program class com.sun.activation.viewers.ImageViewer 
Warning:com.sun.activation.viewers.ImageViewer: can't find referenced method 'void validate()' in program class com.sun.activation.viewers.ImageViewer 
Warning:com.sun.activation.viewers.ImageViewer: can't find referenced method 'void doLayout()' in program class com.sun.activation.viewers.ImageViewer 
Warning:com.sun.activation.viewers.ImageViewerCanvas: can't find referenced method 'void invalidate()' in program class com.sun.activation.viewers.ImageViewerCanvas 
Warning:com.sun.activation.viewers.ImageViewerCanvas: can't find referenced method 'void repaint()' in program class com.sun.activation.viewers.ImageViewerCanvas 
Warning:com.sun.activation.viewers.TextEditor: can't find referenced method 'void setLayout(java.awt.LayoutManager)' in program class com.sun.activation.viewers.TextEditor 
Warning:com.sun.activation.viewers.TextEditor: can't find referenced method 'void invalidate()' in program class com.sun.activation.viewers.TextEditor 
Warning:com.sun.activation.viewers.TextViewer: can't find referenced method 'void setLayout(java.awt.LayoutManager)' in program class com.sun.activation.viewers.TextViewer 
Warning:com.sun.activation.viewers.TextViewer: can't find referenced method 'java.awt.Component add(java.awt.Component)' in program class com.sun.activation.viewers.TextViewer 
Warning:com.sun.activation.viewers.TextViewer: can't find referenced method 'void invalidate()' in program class com.sun.activation.viewers.TextViewer 
Warning:javax.activation.ActivationDataFlavor: can't find referenced method 'boolean isMimeTypeEqual(java.awt.datatransfer.DataFlavor)' in program class javax.activation.ActivationDataFlavor 
Warning:there were 14 unresolved references to program class members. 
     Your input classes appear to be inconsistent. 
     You may need to recompile the code. 
     (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember) 
:vet:proguardInternalRelease FAILED 
Error:Execution failed for task ':vet:proguardInternalRelease'. 
> java.io.IOException: Please correct the above warnings first. 
+0

Controllare ogni messaggio di avviso/errore che si sta incontrando http://proguard.sourceforge.net/manual/troubleshooting.html –

+0

Ho aggiunto molte opzioni -dontwarn in proguard-rules.pro, seguendo il collegamento, ma anche se non ho avvertimenti, ho comunque errore ... ho aggiornato la domanda ... – Garro88

risposta

6

Queste sono odiose da pulire. Le migliori librerie ora includono le loro impostazioni nel pacchetto della libreria, ma le più vecchie (o più pigre) non lo sono ancora. Qui è il processo seguo:

Durante lo sviluppo:

  • Ogni volta che una nuova libreria è inclusa, assicuratevi di controllare la sua documentazione per le loro impostazioni di Proguard suggerite. (Se si è diligenti con questo si risparmia molta confusione e si scava più tardi.)
  • Se l'autore della libreria offre un pacchetto AAR (ad esempio aggiungendo '@aar' alla fine della linea di dipendenza gradle per ottenere l'AAR completo invece del più semplice JAR) potrebbero aver incluso anche le necessarie eccezioni ProGuard per te che verranno automaticamente rilevate. (Ma nella mia esperienza, la maggior parte degli autori non sta ancora compiendo questo passo extra.)
  • Ogni volta che un nuovo spazio dei nomi/classe viene aggiunto nel codice personalizzato che richiede l'introspezione dinamica, ad esempio quando si usano i contenitori di dipendenze o parser JSON, fare certo ProGuard è impostato per prenderli in base al loro nome del pacchetto, o aggiungerli tu stesso una classe alla volta.

Dopo aver costruito e ottenere gli errori:

  • Inizia con tutte le linee che iniziano con il prefisso error: poi warning: (le note: linee non si fermerà una build).
  • Controllare lo spazio dei nomi indicato da ciascuna riga. Trova la libreria associata (ad esempio com.newrelic.SomeClass è probabilmente per la libreria New Relic). Se non riesci a trovarlo, prova una ricerca su Google per vedere se lo spazio dei nomi può aiutarti a rintracciare il github README o qualcos'altro che potrebbe identificare quale libreria include quel namespace.In alternativa, controlla l'elenco di Studio Android> Progetto> Pacchetti> Librerie(richiede un po 'di tempo per visualizzarlo la prima volta) e rintraccia lo spazio dei nomi lì. Speriamo che il codice sorgente sia disponibile e includa i dettagli della libreria nei commenti dell'intestazione del file.
  • Cercare la documentazione per quella libreria. Spero che menzioni le necessarie modifiche di ProGuard.
  • Ricostruisci.

Tutte le modifiche i documenti della biblioteca detto sono, ma ancora ricevendo avvisi:

  • iniziare ad aggiungere -dontwarn righe. Ad esempio: -dontwarn com.newrelic.** (Non dimenticare l'asterisco doppio in modo che ignori l'intero albero sotto quel namespace, altrimenti un singolo asterisco ignorerà solo i figli diretti del namespace)
  • Se inizi a utilizzare le dichiarazioni cieche dontwarn, tu deve testare la tua app compilata (APK)! Poiché ora è altamente probabile che si bloccherà, anche se la versione di debug (non ProGuard) è stata eseguita correttamente. Assicurati di testare tutte le librerie che hai usato, controlla i messaggi di logcat e assicurati di esercitare tutti i percorsi/classi di codice che stai saltando alla cieca con dontwarn!

vite, il mio capo ha detto che devo rilasciare questa cosa già:

  • Disabilita ProGuard :-(

utilizzare la proprietà del progetto di dialogo in Android Studio o modificare il proprio modulo build.gradle di file e cambiare il android { buildTypes { release { minifyEnabled true } } } e impostarlo per falso.

non si ottiene ProGuard opt le imitazioni, l'APK sarà molto più grande e il codice non verrà offuscato. Ma se il tuo capo ne ha appena bisogno ora e non hai tempo per eseguire il debug, non sarà la fine del mondo a disabilitarlo.

Anche se dovresti usare ProGuard. Forse è ora di parlare con il capo per dare agli sviluppatori più tempo per fare le noiose cose tecniche di cui abbiamo bisogno.

Problemi correlati