Подтвердить что ты не робот

Проблема ParseApacheHttpClient с Android Marshmallow: не удается найти ссылочный метод SSLSocketFactory.getHttpSocketFactory

Я работаю над поддержкой Android Marshmallow в своем приложении для Android, но у меня есть зависимости, которые используют устаревший Apache HTTP client (включая Parse).

Как рекомендовано здесь, я добавил:

useLibrary 'org.apache.http.legacy'

в моем приложении /build.gradle, но я еще не могу скомпилировать apk:

:app:compileFreeStoreDebugJavaWithJavac UP-TO-DATE
:app:compileRetrolambdaFreeStoreDebug UP-TO-DATE
:app:compileFreeStoreDebugSources UP-TO-DATE
:app:proguardFreeStoreDebug
Note: there were 7 duplicate class definitions.
      (http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass)
Warning: com.parse.ParseApacheHttpClient: can't find referenced method 'org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int,android.net.SSLSessionCache)' in library class android.net.SSLCertificateSocketFactory
Warning: there were 1 unresolved references to library class members.
         You probably need to update the library versions.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)
Exception while processing task
java.io.IOException: Please correct the above warnings first.
    at proguard.Initializer.execute(Initializer.java:473)
    at proguard.ProGuard.initialize(ProGuard.java:233)
    at proguard.ProGuard.execute(ProGuard.java:98)
    at proguard.gradle.ProGuardTask.proguard(ProGuardTask.java:1074)
    at com.android.build.gradle.tasks.AndroidProGuardTask.doMinification(AndroidProGuardTask.java:139)
    at com.android.build.gradle.tasks.AndroidProGuardTask$1.run(AndroidProGuardTask.java:115)
    at com.android.builder.tasks.Job.runTask(Job.java:48)
    at com.android.build.gradle.tasks.SimpleWorkQueue$EmptyThreadContext.runTask(SimpleWorkQueue.java:41)
    at com.android.builder.tasks.WorkQueue.run(WorkQueue.java:227)
    at java.lang.Thread.run(Thread.java:745)

Спасибо.

4b9b3361

Ответ 1

Эта проблема решается в двух частях:

  • добавление старой библиотеки Apache
  • обновление конфигурации ProGuard для Parse.com

Я рассмотрю обе части ниже для полноты.

Для тех, кто ищет быстрое исправление, решение состоит в том, чтобы добавить следующую строку в файл конфигурации ProGuard:

-dontwarn android.net.SSLCertificateSocketFactory

1 - Библиотека Apache

Android-M удаляет поддержку библиотеки Apache HTTP. Как упоминалось в этом вопросе, исправление заключается в использовании устаревшего JAR поддержки, обновляя ваш build.gradle. Вот код с немного более контекстом:

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    useLibrary 'org.apache.http.legacy'
    ....
}

2 - Обновить конфигурацию ProGuard

Фактическая ошибка исходит от ProGuard, когда он пытается обработать Parse.com.

Warning: com.parse.ParseApacheHttpClient: 
can't find referenced method 'org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int,android.net.SSLSessionCache)' 
in library class android.net.SSLCertificateSocketFactory

Parse теперь открыт с открытым исходным кодом, поэтому проверка проблем дает эту страницу в GitHub:

В обсуждении объясняется, что это всего лишь элемент конфигурации ProGuard и может быть безопасно исправлен путем обновления вашей конфигурации в соответствии с соответствующей проблемой:

Вот изменение (строка 3 исправляет нашу проблему, проблема с исправлением строки 4):

-keepattributes *Annotation*
-keepattributes Signature
-dontwarn android.net.SSLCertificateSocketFactory
-dontwarn android.app.Notification
-dontwarn com.squareup.**
-dontwarn okio.**

Как объяснено в этом комментарии, можно игнорировать предупреждения, так как эти классы используются только в версиях Android, которые все еще содержат упомянутые классы.