【问题标题】:Using org.apache.http.legacy in Android 9在 Android 9 中使用 org.apache.http.legacy
【发布时间】:2019-01-29 05:19:41
【问题描述】:

我有一个使用 apache 旧 Http 库 (org.apache.http.legacy) 的旧 android 应用程序。在 Android 6 上进行更改后,我能够让应用程序(包括旧版库)继续运行。

使用库'org.apache.http.legacy'。

现在在 Android 9 设备中,我在运行时遇到以下异常。

Caused by: java.lang.IncompatibleClassChangeError: Class 'org.apache.http.conn.ssl.SSLSocketFactory' does not implement interface 'org.apache.http.conn.scheme.SchemeSocketFactory' in call to 'java.net.Socket org.apache.http.conn.scheme.SchemeSocketFactory.createSocket(org.apache.http.params.HttpParams)' (declaration of 'org.apache.http.impl.conn.DefaultClientConnectionOperator' appears in /data/app/com.theprojectfactory.wmp-RdZODaT5h-l1diSw3oNCvA==/base.apk)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:165)
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446)
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)

阅读Android 9 changes docs,提到在AndroidManifes.xml 文件中添加<uses-library android:name="org.apache.http.legacy" android:required="false"/>,但这似乎对我也不起作用,因为我在启动应用程序时遇到了以下异常。

java.lang.VerifyError: Superclass org.apache.http.params.BasicHttpParams of org.apache.http.params.SyncBasicHttpParams is declared final (declaration of 'org.apache.http.params.SyncBasicHttpParams' appears in /data/app/com.theprojectfactory.wmp-R2P9RNgoJ82ZupwxVa7iNA==/base.apk)
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:453)
    at com.activeandroid.ModelInfo.scanForModelClasses(ModelInfo.java:187)
    at com.activeandroid.ModelInfo.scanForModel(ModelInfo.java:152)
    at com.activeandroid.ModelInfo.<init>(ModelInfo.java:63)
    at com.activeandroid.Cache.initialize(Cache.java:66)
    at com.activeandroid.ActiveAndroid.initialize(ActiveAndroid.java:44)
    at com.activeandroid.ActiveAndroid.initialize(ActiveAndroid.java:34)
    at com.activeandroid.content.ContentProvider.onCreate(ContentProvider.java:39)
    at android.content.ContentProvider.attachInfo(ContentProvider.java:1917)
    at android.content.ContentProvider.attachInfo(ContentProvider.java:1892)
    at android.app.ActivityThread.installProvider(ActivityThread.java:6391)
    at android.app.ActivityThread.installContentProviders(ActivityThread.java:5938)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5853)
    at android.app.ActivityThread.access$1100(ActivityThread.java:199)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

任何关于如何在 Android 9 api 上继续使用 org.apache.http.legacy 的指针将不胜感激。

【问题讨论】:

    标签: java android


    【解决方案1】:

    您必须在 AndroidManifes.xml 文件的应用程序标签上添加 android:usesCleartextTraffic="true" 属性。

    还要加上这个。

    <uses-library android:name="org.apache.http.legacy" android:required="false"/>
    

    【讨论】:

    • 感谢@Kaushal,但这也不起作用。刚刚检查了文档,似乎 usesCleartextTraffic="true" 无论如何都是默认值。
    【解决方案2】:

    因此,在进一步排除故障后发现该问题是由于第三方库(activeandroid)引起的。库使用反射来检查类路径中所有可用的类,并且由于某种原因,在调用 java.lang.Class.classForName 时遗留的 apache HTTP 类发生冲突。跳过了反射代码,应用程序按预期工作。但在低于 Android 9 的版本上,这不是问题。

    所以正确的方法是按照文档使用:&lt;uses-library android:name="org.apache.http.legacy" android:required="false"/&gt;。如果您遇到随机异常,请检查您没有使用反射来尝试遍历旧版 HTTP 类。

    【讨论】:

    • 谢谢您,您的解决方案对我帮助很大!
    • 我在 Android 9 上使用“org.apache.httpcomponents:httpclient:4.3.6”,您的回复对我有帮助。好的。但是你怎么理解这个问题在“org.apache.http.legacy”中?
    【解决方案3】:

    您的课程似乎有冲突。

    作为使用运行时 Apache 库的替代方案,应用可以在其 APK 中捆绑自己的 org.apache.http 库版本。如果这样做,则必须重新打包库(使用 Jar Jar 之类的实用程序)以避免与运行时中提供的类的类兼容性问题。

    here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      相关资源
      最近更新 更多