ParseApacheHttpClient与Android棉花糖的问题:can';找不到引用的方法SSLSocketFactory.getHttpSocketFactory

ParseApacheHttpClient与Android棉花糖的问题:can';找不到引用的方法SSLSocketFactory.getHttpSocketFactory,android,parse-platform,Android,Parse Platform,我正在我的Android应用程序中使用Android棉花糖支持,但我有一些依赖项,它们使用的是不推荐的(包括解析) 根据建议,我添加了: useLibrary 'org.apache.http.legacy' 在我的app/build.gradle中,但我仍然无法编译apk: :app:compileFreeStoreDebugJavaWithJavac UP-TO-DATE :app:compileRetrolambdaFreeStoreDebug UP-TO-DATE :app:compi

我正在我的Android应用程序中使用Android棉花糖支持,但我有一些依赖项,它们使用的是不推荐的(包括解析)

根据建议,我添加了:

useLibrary 'org.apache.http.legacy'
在我的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)

谢谢。

此问题分两部分解决:

  • 添加旧的Apache库
  • 正在更新Parse.com的ProGuard配置
  • 为了完整起见,我将在下面讨论这两个部分

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

    -dontwarn android.net.SSLCertificateSocketFactory
    

    1-Apache库 Android-M取消了对Apache HTTP库的支持。正如问题中提到的,修复方法是通过更新build.gradle来使用遗留的支持JAR。下面是更具上下文的代码:

    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配置项,可以通过根据相关问题更新配置来安全修复:

    -keepattributes *Annotation*
    -keepattributes Signature
    -dontwarn android.net.SSLCertificateSocketFactory
    -dontwarn android.app.Notification
    -dontwarn com.squareup.**
    -dontwarn okio.**
    
    以下是更改(第3行修复了我们的问题,第4行修复了相关问题):


    如中所述,忽略警告是安全的,因为这些类仅在仍然包含所述类的Android版本上使用。

    您确定
    usebrary
    语句位于正确位置吗?我用它来支持传统的apache,一切都很好。它应该在Android块中的模块
    .gradle
    文件中。您能找到解决方案吗?