在Android 9中使用org.apache.http.legacy [英] Using org.apache.http.legacy in Android 9

查看:501
本文介绍了在Android 9中使用org.apache.http.legacy的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个旧的Android应用程序,该应用程序使用apache旧版Http库(org.apache.http.legacy).在Android 6上进行更改之后,我能够使该应用程序(包括旧版库)保持正常运行.

I have an old android app that uses the apache legacy Http library (org.apache.http.legacy). After the changes on Android 6, I was able to keep the app working including the legacy library.

useLibrary'org.apache.http.legacy '.

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

Now in Android 9 devices I get the below exceptions at runtime.

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更改文档,提到要在AndroidManifes.xml文件中添加<uses-library android:name="org.apache.http.legacy" android:required="false"/>,但是这似乎对我也不起作用,因为在启动应用程序时出现了以下异常.

Reading the Android 9 changes docs, there is a mention to add <uses-library android:name="org.apache.http.legacy" android:required="false"/> in the AndroidManifes.xml file, however that does not seem to work for me either as I get the below exception instead when launching the app.

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的指针将不胜感激.

Any pointers on how to keep using the org.apache.http.legacy on Android 9 api will be much appreciated.

推荐答案

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

So after further troubleshooting found out that issue was due to a third party library (activeandroid). Library was using reflection to check all classes available in the classpath and for some reason the legacy apache HTTP classes conflicted when calling java.lang.Class.classForName. Skipped the reflection code and app worked as expected. On versions below Android 9 this is not an issue though.

所以正确的方法是根据使用<uses-library android:name="org.apache.http.legacy" android:required="false"/>的文档进行.如果遇到随机异常,请检查您是否没有使用反射尝试遍历旧版HTTP类.

So correct way is as per documentation using: <uses-library android:name="org.apache.http.legacy" android:required="false"/>. If you come across random exceptions check you are not using reflection to try to traverse the legacy HTTP classes.

这篇关于在Android 9中使用org.apache.http.legacy的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆