0

Das Ziel ist die Bereitstellung einer Anwendung mit obfuscation und minification angewendet. Übliche Builds ohne minification funktionieren gut. Aber wenn minifyEnabled auf "true" geschaltet wird, wird auch alles kompiliert, aber alle Volley Anfragen schlagen mit dem Fehlerrückruf (onErrorResponse) fehl, ungeachtet des erfolgreichen Ergebnisses.Android Volley schlägt immer mit Proguard

Minifizierung config in build.gradle:

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

proguard-rules.pro:

##---------------Begin: proguard configuration for Gson ---------- 
# Gson uses generic type information stored in a class file when working with fields. Proguard 
# removes such information by default, so configure it to keep all of it. 
-keepattributes Signature 

# For using GSON @Expose annotation 
-keepattributes *Annotation* 

# Gson specific classes 
-keep class sun.misc.Unsafe { *; } 
#-keep class com.google.gson.stream.** { *; } 

# Application classes that will be serialized/deserialized over Gson 
-keep class com.google.gson.examples.android.model.** { *; } 

# Prevent proguard from stripping interface information from TypeAdapterFactory, 
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter) 
-keep class * implements com.google.gson.TypeAdapterFactory 
-keep class * implements com.google.gson.JsonSerializer 
-keep class * implements com.google.gson.JsonDeserializer 

##---------------End: proguard configuration for Gson ---------- 



##---------------Begin: proguard configuration for Spongy Castle ---------- 

-keep class org.spongycastle.crypto.* {*;} 
-keep class org.spongycastle.crypto.digests.* {*;} 
-keep class org.spongycastle.crypto.encodings.* {*;} 
-keep class org.spongycastle.crypto.engines.* {*;} 
-keep class org.spongycastle.crypto.macs.* {*;} 
-keep class org.spongycastle.crypto.modes.* {*;} 
-keep class org.spongycastle.crypto.paddings.* {*;} 
-keep class org.spongycastle.crypto.params.* {*;} 
-keep class org.spongycastle.crypto.prng.* {*;} 
-keep class org.spongycastle.crypto.signers.* {*;} 

-keep class org.spongycastle.jcajce.provider.digest.** {*;} 
-keep class org.spongycastle.jcajce.provider.keystore.** {*;} 
-keep class org.spongycastle.jcajce.provider.symmetric.** {*;} 
-keep class org.spongycastle.jcajce.spec.* {*;} 
-keep class org.spongycastle.jce.** {*;} 

-dontwarn javax.naming.** 

##---------------End: proguard configuration for Spongy Castle ---------- 



# Configuration for Guava 18.0 
# 
# disagrees with instructions provided by Guava project: https://code.google.com/p/guava-libraries/wiki/UsingProGuardWithGuava 

-keep class com.google.common.io.Resources { 
    public static <methods>; 
} 
-keep class com.google.common.collect.Lists { 
    public static ** reverse(**); 
} 
-keep class com.google.common.base.Charsets { 
    public static <fields>; 
} 

-keep class com.google.common.base.Joiner { 
    public static com.google.common.base.Joiner on(java.lang.String); 
    public ** join(...); 
} 

-keep class com.google.common.collect.MapMakerInternalMap$ReferenceEntry 
-keep class com.google.common.cache.LocalCache$ReferenceEntry 

# http://stackoverflow.com/questions/9120338/proguard-configuration-for-guava-with-obfuscation-and-optimization 
-dontwarn javax.annotation.** 
-dontwarn javax.inject.** 
-dontwarn sun.misc.Unsafe 

# Guava 19.0 
-dontwarn java.lang.ClassValue 
-dontwarn com.google.j2objc.annotations.Weak 
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 



# Security classes for keystore support 
-dontwarn java.awt.**, javax.security.**, java.beans.** 



# Volley 
-dontwarn com.android.volley.** 
-dontwarn com.android.volley.error.** 
-keep class com.android.volley.** { *; } 
-keep class com.android.volley.toolbox.** { *; } 
-keep class com.android.volley.Response$* { *; } 
-keep class com.android.volley.Request$* { *; } 
-keep class com.android.volley.RequestQueue$* { *; } 
-keep class com.android.volley.toolbox.HurlStack$* { *; } 
-keep class com.android.volley.toolbox.ImageLoader$* { *; } 
-keep interface com.android.volley.** { *; } 
-keep class org.apache.commons.logging.* 

Alle verwendeten Abhängigkeiten:

compile 'com.android.support:appcompat-v7:23.4.0' 
compile 'com.android.support:design:23.4.0' 

compile 'com.google.code.gson:gson:2.7' 
compile 'com.android.volley:volley:1.0.0' 
compile 'com.google.guava:guava:19.0' 
compile 'org.apache.directory.studio:org.apache.commons.io:2.4' 

compile 'com.madgag.spongycastle:core:1.54.0.0' 
compile 'com.madgag.spongycastle:prov:1.54.0.0' 
compile 'com.madgag.spongycastle:pkix:1.54.0.0' 
compile 'com.madgag.spongycastle:pg:1.54.0.0' 

Und zusätzlich Ausfälle Volley, EventBus von Guava funktioniert auch nicht richtig (subscribe event s holen nicht). Haben wir irgendwelche Lösungen für diese Probleme? Sollte ich hier zusätzliche Informationen hinzufügen?

Antwort

0

Sollte zugeben, dass auch mit allen Informationen zur Verfügung gestellt, war meine Frage sehr schwer zu analysieren, weil von vielen möglichen Quellen des beschriebenen Fehlers.

Ich werde am Ende meiner Frage beginnen. Guava hat nicht richtig funktioniert, weil ProGuard gerade die Subscribe-Methoden von Guava aus meinem zu packenden Code ausgeschlossen hat. ProGuard entfernt ungenutzten Code, und soweit Subscribe-Methoden als unbenutzt analysiert werden (auch wenn IDE diese nicht als verwendet markieren), hat ProGuard entschieden, diese Methoden zu entfernen. Um dieses Problem zu lösen, sollten wir halten Abonnieren-Methoden von ProGuard der Verarbeitung:

# Keep subscribe-methods from deletion 
-keepclassmembers class ** { 
    @com.google.common.eventbus.Subscribe <methods>; 
} 

Und mein erstes Problem - wenn Volley immer ruft onErrorResponse Rückrufe bei Anfragen gefeuert. Ich habe einen benutzerdefinierten Deserializer für Json-repsonses verwendet, der auch prüft, ob der Server einige Pflichtfelder (mit einer entsprechenden Anmerkung versehen) zur Verfügung gestellt hat. Und natürlich, ProGuard standardmäßig arbeiten konnte nicht richtig mit diesen Anmerkungen und Deserializer - deshalb habe ich diese Entitäten halten musste:

# To make right deserialization 
-keepclassmembers class ** { 
    @com.some.package.server.JsonDeserializerWithOptions$FieldRequired public *; 
} 
-keep @interface com.some.package.server.JsonDeserializerWithOptions$FieldRequired 
-keep class com.some.package.server.JsonDeserializerWithOptions 
0

Es ist schwierig, einen Fehler mit den Protokollen festzustellen, aber Sie sollten es versuchen, ohne Proguard zu verwenden. Überspringen Sie die Syntax der Progard-Datei und prüfen Sie, ob sie funktioniert. Stellen Sie sicher, dass Sie Multidex aktiviert haben, sonst kann Ihr Projekt nicht ausgeführt werden.

android { 

compileSdkVersion 21 
buildToolsVersion "21.1.0" 

defaultConfig { 
    ... 
    minSdkVersion 14 
    targetSdkVersion 21 
    ... 

    // Enabling multidex support. 
    multiDexEnabled true 
} 
... 
} 

dependencies { 
    compile 'com.android.support:multidex:1.0.0' 
} 

Weitere Details: https://developer.android.com/studio/build/multidex.html

+0

Ich bekomme keine Fehler - nur eine falsche Arbeit von Volley und EventBus mit Proguard. Ohne Programm funktioniert alles richtig, wie es in der Frage erwähnt wurde. –

+0

Einschalten multidex hilft auch nicht –

+0

für was willst du proguard verwenden? –