Android Marshmallow的ParseApacheHttpClient问题:找不到引用的方法SSLSocketFactory.getHttpSocketFactory

pgr*_*eze 13 android parse-platform

我正在Android Android应用程序中使用Android Marshmallow支持,但我有依赖项,它们使用不推荐使用的Apache HTTP客户端(包括Parse).

按照这里的建议,我补充说:

useLibrary 'org.apache.http.legacy'
Run Code Online (Sandbox Code Playgroud)

在我的app/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)
Run Code Online (Sandbox Code Playgroud)

谢谢.

Ric*_*ier 10

这个问题分为两部分:

  1. 添加回遗留的Apache库
  2. 更新Parse.com的ProGuard配置

为了完整起见,我将在下面的两个部分进行说明.

对于那些寻求快速修复的人来说,解决方案是将以下行添加到ProGuard配置文件中:

-dontwarn android.net.SSLCertificateSocketFactory
Run Code Online (Sandbox Code Playgroud)

1 - Apache库

Android-M删除了对Apache HTTP库的支持.如问题中所述,修复方法是通过更新build.gradle来使用旧版支持JAR.这是具有更多上下文的代码:

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    useLibrary 'org.apache.http.legacy'
    ....
}
Run Code Online (Sandbox Code Playgroud)

2 - 更新ProGuard配置

当ProGuard尝试处理Parse.com时,实际错误来自ProGuard.

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
Run Code Online (Sandbox Code Playgroud)

Parse现在是开源的,所以检查问题会在GitHub上显示这个页面:

讨论解释说这只是一个ProGuard配置项,可以通过根据相关问题更新配置来安全地修复:

以下是更改(第3行修复了我们的问题,第4行修复了相关问题):

-keepattributes *Annotation*
-keepattributes Signature
-dontwarn android.net.SSLCertificateSocketFactory
-dontwarn android.app.Notification
-dontwarn com.squareup.**
-dontwarn okio.**
Run Code Online (Sandbox Code Playgroud)

本评论中所述,忽略警告是安全的,因为这些类仅用于仍包含所提及类的Android版本.