0

目标是部署一个应用程序,其中应用了obfuscationminification。没有minification的平时生成工作正常。但是,当minifyEnabled切换为真时,所有内容也都编译,但所有Volley请求都会因错误回调而失败(onErrorResponse),无论结果如何。Android Volley总是无法使用Proguard

缩小配置在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.* 

所有使用的依赖关系:

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' 

而且除了从Guava凌空故障,EventBus也不能正常工作(订阅事件s没有获取)。我们有任何解决这些问题的方法吗?我应该在这里添加任何附加信息吗?

回答

0

应该承认,甚至提供了所有的信息,我的问题是非常困难的分析,因为描述错误的许多可能的来源。

我会从我的问题结束开始。番石榴没有正常工作,因为ProGuard从我的代码中排除了Guava的订阅方法。 ProGuard删除未使用的代码,并且只要Subscribe-methods被分析为未使用(甚至IDE不会将它们突出显示为已使用的代码),ProGuard已决定删除这些方法。为了解决这个问题,我们应该保持距离的ProGuard的处理订阅的方法:

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

我的第一个问题 - 当排球总是调用的所有请求onErrorResponse回调被解雇。如果服务器提供了一些必需的字段(标有相应的注释),我还使用Json-repsonses的自定义反序列化器进行检查。而且,当然,ProGuard的默认情况下不能正确使用这些注释器和解串器的工作 - 这就是为什么我必须保持这些实体也:

# 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

它很难找出日志中的任何错误,但是您应该尝试使用它,而不使用proguard。跳过proguard文件的语法,看看它是否正常工作。 确保您已启用multidex,否则您的项目将无法执行。

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' 
} 

更多细节:https://developer.android.com/studio/build/multidex.html

+0

我没有得到任何错误 - 只是凌空EventBus的不正确工作与proguard。没有proguard,一切正常,因为它在问题中提到。 –

+0

打开multidex也无济于事 –

+0

你想用proguard来做什么? –