0

Целью является развертывание приложения с использованием obfuscation и minification. Обычные сборки без 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' 

И в дополнение к Залп неудачи, EventBus из Guava также работает неправильно (подписаться на событие s не извлекаются). Есть ли у нас какие-либо решения для этих проблем? Должен ли я добавить дополнительную информацию здесь?

ответ

0

Следует признать, что даже вся информация, на мой вопрос было очень трудно проанализировать, из-за множества возможных источников, описанных ошибок.

Начну с конца моего вопроса. Гуава не работает корректно, потому что ProGuard просто исключил из моего кода рецепты Guava из моего кода. ProGuard удаляет неиспользуемый код, и поскольку методы Subscribe-анализа анализируются как неиспользуемые (даже IDE не выделяет их как используемые), ProGuard решил удалить эти методы. Чтобы решить эту проблему, мы должны держать Subscribe-методы от обработки Proguard в:

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

И моя первая проблема - когда Volley всегда вызывает 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

Я не получаю никаких ошибок - просто некорректную работу Volley и EventBus с proguard. Без proguard все работает правильно, как было упомянуто в вопросе. –

+0

Включение multidex тоже не помогает –

+0

что вы хотите использовать proguard? –

 Смежные вопросы

  • Нет связанных вопросов^_^