2014-12-12 3 views
17

ProGuard не будет играть хорошо с okhttp, и я получаю следующие предупреждения:ProGuard не работает с okhttp

Warning:com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl: can't find referenced method 'long getContentLengthLong()' in program class com.squareup.okhttp.internal.huc.HttpURLConnectionImpl 
Warning:com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl: can't find referenced method 'long getHeaderFieldLong(java.lang.String,long)' in program class com.squareup.okhttp.internal.huc.HttpURLConnectionImpl 
Warning:com.squareup.okhttp.internal.huc.JavaApiConverter$CacheHttpsURLConnection: can't find referenced method 'long getContentLengthLong()' in program class com.squareup.okhttp.internal.huc.JavaApiConverter$CacheHttpURLConnection 
Warning:com.squareup.okhttp.internal.huc.JavaApiConverter$CacheHttpsURLConnection: can't find referenced method 'long getHeaderFieldLong(java.lang.String,long)' in program class com.squareup.okhttp.internal.huc.JavaApiConverter$CacheHttpURLConnection 
Warning:there were 4 unresolved references to program class members. 
     Your input classes appear to be inconsistent. 
     You may need to recompile the code. 
     (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember) 

Это мои настройки Proguard для okhttp и модернизации:

-dontwarn rx.** 

-dontwarn okio.** 

-dontwarn com.squareup.okhttp.* 

-dontwarn retrofit.appengine.UrlFetchClient 


-keep class retrofit.** { *; } 

-keepclasseswithmembers class * { 

@retrofit.http.* <methods>; } 

-keepattributes Signature 
-keepattributes *Annotation* 

Может ли это что-то связано с изменениями в ProGuard в Android Studio 1.0?

Я пробовал ответы на связанные вопросы, но они предлагали использовать настройки, которые у меня уже есть.

ответ

7

Я, наконец, смог решить эту проблему.

Предупреждения, с которыми я столкнулся, были фактически бессмысленными и могут быть проигнорированы.

Вместо этого я забыл не запутать мои классы модели:

-keep class com.example.datamodel.** { *; } 

После этого изменения все работало нормально.

+0

Поля, переименованные в 'a' и' b', просто не забавны! – EpicPandaForce

1

он работает для меня с этими конфигами. использовать ** вместо * для всех вложенных классов с инкапсулированными дочерних пакетами

-dontwarn org.xmlpull.v1.** 
-dontwarn com.squareup.** 
-keep class com.squareup.** { *; } 
+2

-dontwarn com.squareup. ** только подавляет предупреждения. Я могу создать APK, но okhttp не будет работать. После расторжения строки 2 снова появились те же предупреждения. – wkarl

30

Это работает для меня:

Вы должны добавить к вашим proguard-rules.pro этих двух линий:

-keep class com.squareup.okhttp.** { *; } 

-keep interface com.squareup.okhttp.** { *; } 

Завершить proguard-rules.pro file w плохо выглядеть:

-dontwarn rx.** 

-dontwarn okio.** 

-dontwarn com.squareup.okhttp.** 
-keep class com.squareup.okhttp.** { *; } 
-keep interface com.squareup.okhttp.** { *; } 

-dontwarn retrofit.** 
-dontwarn retrofit.appengine.UrlFetchClient 
-keep class retrofit.** { *; } 
-keepclasseswithmembers class * { 
    @retrofit.http.* <methods>; 
} 

-keepattributes Signature 
-keepattributes *Annotation* 

Источник: https://stackoverflow.com/a/24178851/4102045

+0

Без
работает для меня! – Roman

+0

Все еще не работает для меня. Предупреждения подавляются, но APK работает неправильно. – wkarl

+0

Является ли APK построенным? Если предупреждения подавлены и APK построен, я думаю, что проблема более связана с тем, как вы используете библиотеку okhttp, а не о конфигурации ProGuard в Android Studio. – pikufolgado

1

Добавьте к этому ваши настройки Proguard:

-dontwarn com.squareup.okhttp.internal.huc.** 

Я думаю, что это с уверенностью предположить, что вы не используете какой-либо из классов в com.squareup.okhttp.internal так как это происходит с ваших предупреждений.

+0

Просто игнорируя предупреждения, я могу скомпилировать, но также сломать функциональность, попробовал ее раньше. – wkarl

+0

Что значит «разрывает функциональность»? – seato

+0

Я смог решить это, пожалуйста, см. Мой ответ: http://stackoverflow.com/a/31872274/2427585 Ваша точка была действительной, однако предупреждения можно смело игнорировать. – wkarl

1

OkHttp

-keepattributes Подпись

-keepattributes Аннотация

-keep класса okhttp3 ** {*. }

-keep интерфейс okhttp3. ** {*; }

-dontwarn okhttp3. **

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