0

목표는 obfuscationminification이 적용된 응용 프로그램을 배포하는 것입니다. minification없이 정상적으로 빌드하면 정상적으로 작동합니다. 그러나 minifyEnabled이 true로 전환되면 모든 것이 컴파일되지만 성공한 결과에 관계없이 Volley 요청이 오류 콜백 (onErrorResponse)으로 실패합니다. build.gradle에서안드로이드 발리는 항상 Proguard와 함께 실패합니다

축소에서는의 설정 : proguard-rules.pro

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

:

##---------------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가 구아바의 구독 코드를 내 코드에서 제외하기 때문입니다. ProGuard는 사용되지 않는 코드를 제거하고 Subscribe- 메소드는 사용되지 않는 것으로 분석됩니다 (IDE에서도 사용 된 것으로 강조 표시하지 않음). ProGuard는 이러한 방법을 제거하기로 결정했습니다.

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

을 그리고 내 첫 번째 문제는 - 발리는 항상 호출 할 때 모든 요청에 ​​onErrorResponse 콜백은 해고 :이 문제를 해결하기 위해, 우리는 ProGuard에서의 처리에서 구독-방법을 유지해야합니다. 서버가 몇 가지 필수 필드 (해당 주석으로 표시)를 제공했는지 확인하는 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 파일 구문을 건너 뛰고 제대로 작동하는지 확인하십시오. 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가 없으면 질문에 언급 된대로 모든 것이 올바르게 작동합니다. –

+0

multidex를 켜는 것이 도움이되지 않습니다 –

+0

무엇을 위해 프로 가드를 사용하고 싶습니까? –