ProGuard не работает с okhttp

17

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?

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

    
задан wkarl 12.12.2014 в 13:01
источник

5 ответов

7

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

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

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

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

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

    
ответ дан wkarl 07.08.2015 в 09:46
источник
  • Поля, переименованные в a и b, просто не забавны! –  EpicPandaForce 18.01.2016 в 23:59
30

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

Вы должны добавить к своей proguard-rules.pro две следующие строки:

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

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

Файл proguard-rules.pro будет выглядеть следующим образом:

-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*

Источник: Ссылка

    
ответ дан pikufolgado 13.01.2015 в 12:30
источник
  • Без <br/> работает для меня! –  Roman 16.01.2015 в 20:30
  • Все еще не работает для меня. Предупреждения подавляются, но APK работает неправильно. –  wkarl 19.01.2015 в 19:38
  • Является ли APK построенным? Если предупреждения подавлены и APK построен, я думаю, что проблема более связана с тем, как вы используете библиотеку okhttp, а не о конфигурации ProGuard в Android Studio. –  pikufolgado 20.01.2015 в 11:02
  • Я думаю, вы ошибаетесь, это должна быть конфигурация. APK построен, но он не работает. Однако, если я выключу ProGuard, он работает нормально. Я напрямую не использую okhttp, только косвенно через Retrofit. –  wkarl 21.01.2015 в 23:43
  • Это тоже не работает для меня, но я использую okHttp напрямую. –  seato 30.03.2015 в 19:56
Показать остальные комментарии
1

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

-dontwarn org.xmlpull.v1.**
-dontwarn com.squareup.**
-keep class com.squareup.** { *; }
    
ответ дан Adem 13.12.2014 в 23:57
источник
  • -dontwarn com.squareup. ** просто подавляет предупреждения. Я могу создать APK, но okhttp не будет работать. После расторжения строки 2 снова появились те же предупреждения. –  wkarl 14.12.2014 в 01:41
1

Добавьте это в свои настройки proguard:

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

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

    
ответ дан seato 30.03.2015 в 20:07
источник
  • Просто игнорирование предупреждений позволяет мне скомпилировать, но также нарушает функциональность, пробовал это раньше. –  wkarl 31.03.2015 в 08:41
  • Что значит «разрывает функциональность»? –  seato 01.04.2015 в 03:56
  • Я смог решить это, пожалуйста, см. мой ответ: stackoverflow.com/a/31872274/2427585 Ваша точка была действительна, однако предупреждения можно смело игнорировать. –  wkarl 07.08.2015 в 09:47
1

OkHttp

-keepattributes Подпись

-keepattributes Аннотация

-keep class okhttp3. ** {*; }

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

-dontwarn okhttp3. **

    
ответ дан Alireza Ghanbarinia 12.07.2016 в 10:53
источник