2014-11-17 28 views
27

sto di fronte a un problema davvero strano per giorni ormai ...Proguard ignora file di configurazione di libreria

Ho un app Gradle con due moduli, un modulo principale e un modulo biblioteca.

  • In entrambi i moduli ho dichiarato un percorso di file proguard-rules.pro che è corretto
  • In entrambi i file .gradle ho minifyEnabled vero

qui è il primo problema: anche se minifyEnabled è falso in biblioteca, viene offuscato. non ha alcun effetto e sembra dipendere dalle impostazioni del modulo principale. Sto usando proguard da un po 'di tempo e non ho mai provato un simile comportamento.

Inoltre, il proguard-rules.pro della libreria sembra essere completamente ignorato. Non importa ciò che dichiaro lì, non è usato e il risultato è sempre lo stesso (sempre decompilato per vedere i risultati). È offuscato con le impostazioni predefinite.

ho usato un nome di file non validi Proguard per vedere se il file è ancora toccato, e in effetti ci sono errori con il nome sbagliato e complaines anche sugli errori di sintassi nel file Proguard ...

I non so se è in qualche modo correlato ad un aggiornamento di Android Studio, in quanto mi ha anche raccomandato di usare "minifyEnabled" invece di "runProguard".

Come posso gestire proguard per utilizzare anche proguard-rules.pro della libreria?

Edit:

Ho fatto un progetto di esempio per chiarire il mio problema

enter image description here

La configurazione Proguard della mia biblioteca

enter image description here

La Gradle della mia biblioteca :

enter image description here

E infine il risultato ottengo sempre. Non importa quello che ho escludere/includere nella configurazione Proguard

enter image description here

Come si può vedere, le regole Proguard funzionare molto bene sul modulo principale. Fa quello che dovrebbe. Ma è sempre offusca completamente la mia libreria di a.a ....

Inoltre ha cancellato completamente l'attività della Biblioteca, che non dovrebbe accadere a tutti

risposta

77

In genere non dovrebbe consentire ProGuard nel progetto biblioteca. ProGuard elabora l'applicazione e la libreria insieme nel progetto dell'applicazione, che rappresenta l'approccio più efficace.

Nel progetto di libreria, è possibile specificare qualsiasi configurazione ProGuard specifica della libreria in build.gradle, ad es.:

defaultConfig { 
    consumerProguardFiles 'proguard-rules.txt' 
} 

Questo file viene quindi confezionato nella RAA biblioteca come proguard.txt e automaticamente applicata nel progetto di applicazione.

Se si do abilitare ProGuard in un progetto di libreria (forse perché si desidera distribuire la libreria), è inoltre necessario aggiungere la configurazione corretta per l'elaborazione della libreria. La build di Android Gradle non sembra farlo automaticamente. È possibile:

  1. Copia android-sdk/tools/proguard/examples/library.pro al proguard-project.txt nel progetto di libreria.
  2. Rimuovere le linee di input/output di esempio -injars, -outjars, -libraryjars, -printmapping dal file. Il processo di compilazione di Gradle fornisce automaticamente queste opzioni.
  3. Fare riferimento alla configurazione dal build.gradle del progetto di libreria.

Abilitare/disabilitare ProGuard in modo indipendente per il progetto di libreria e per il progetto di applicazione funziona correttamente per me.

+1

Ciao Eric, prima di tutto la ringrazio per la risposta veloce . Ho tolto completamente l'opzione minifyEnabled nella libreria ora e ho risolto il problema "Il vaso di output è vuoto" ho accennato nell'email, ma proguard ignora la proguard config comunque –

+1

Infatti, mi è sfuggita la cosa consumerProguardFiles. Ora funziona, grazie mille :) –

+1

'consumerProguardFiles' deve essere specificato in' defaultConfig' piuttosto che 'buildTypes/release' in modo che funzioni se proguard in uso in modalità debug e release (ad es. Per evitare il 65k dex limite del metodo). – ashughes

7

Sorprendentemente, la risposta di Eric sta funzionando anche per me!

Naturalmente Eric sa che cosa sta parlando, ma ho [on e off] cercato di trovare un modo pulito di fare questo automaticamente Gradle per oltre un anno senza fortuna fino a quando ho appena trovato oggi questo post.

Ho combinato alcuni altri thread SO e ho trovato questa soluzione che funziona, che può anche essere semplificata. I passaggi 1-4 sono facoltativi, ma finora non sembra aver fatto male.

  1. Scarica Proguard 5.2 da http://sourceforge.net/projects/proguard/files/proguard/5.2/
  2. Unzip per ... /android-sdk/tools/proguard5.2
  3. Rinomina ... /android-sdk/tools/proguard al ... /android-sdk/tools/proguard4.7
  4. ln -s .../android-sdk/tools/proguard5.2 .../android-sdk/tools/proguard
  5. Copia android-sdk/tools/proguard/examples/library.pro alla cartella del progetto biblioteca e rinominare in proguard-library.pro
  6. Modifica proguard-library.pro e commentare lo -injars, -outjars, -libraryjars e -printmapping linee.
  7. Modificare file della libreria build.gradle per includere:

    defaultConfig { 
        minifyEnabled true 
        shrinkResources true 
        proguardFiles 'proguard-library.pro' 
        consumerProguardFiles 'proguard-library-consumer.pro' 
    } 
    

    è possibile modificare questo per avere un comportamento diverso per il rilascio e la build di debug.

  8. proguard-library-consumer.pro

    # include in this file any rules you want applied to a 
    # consumer of this library when it proguards itself. 
    
    -dontwarn junit.** 
    -dontwarn org.junit.** 
    
    # Make crash call-stacks debuggable. 
    -keepnames class ** { *; } 
    -keepattributes SourceFile,LineNumberTable 
    
+0

Errore: il riduttore di risorse non può essere utilizzato per le librerie. – halxinate

4

L'unica cosa che ha funzionato per me è quello di definire entrambe le opzioni a mia biblioteca:

release { 
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
consumerProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
} 
+1

Questo ha funzionato davvero .. per qualche ragione semplicemente usando consumerProguardFiles tenevo la maggior parte di ciò di cui avevo bisogno, ma casualmente ho semplicemente ignorato le regole per alcune classi .. usando entrambi i lavori .. ma PERCHÉ! ?? – speedynomads

+0

Sfortunatamente, ha funzionato davvero ... Passato un po 'di tempo a cercare di farlo, ora è giusto capire PERCHÉ ha funzionato :) –

+0

* Cosa non ha funzionato: Si è verificato un problema durante la configurazione del progetto': contenuto '. > Il file predefinito proguard-android.txt non deve essere utilizzato come file di configurazione utente. – Y2i

Problemi correlati