【问题标题】:Android Fatal Exception: java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/RequestLine;Android致命异常:java.lang.NoClassDefFoundError:解析失败:Lorg/apache/http/RequestLine;
【发布时间】:2019-08-02 21:43:35
【问题描述】:

OnePlus5 上的 Android 9 上,当我尝试使用 ion 库进行远程连接时,我收到以下错误:

Fatal Exception: java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/RequestLine;
   at com.koushikdutta.ion.Ion$Config$1.createAsyncHttpRequest + 559(Ion.java:559)
   at com.koushikdutta.ion.IonRequestBuilder.prepareRequest + 282(IonRequestBuilder.java:282)
   at com.koushikdutta.ion.IonRequestBuilder.execute + 616(IonRequestBuilder.java:616)
   at com.koushikdutta.ion.IonRequestBuilder.execute + 606(IonRequestBuilder.java:606)
   at com.koushikdutta.ion.IonRequestBuilder.as + 891(IonRequestBuilder.java:891)
   at io.dishup.dishup.Network.request + 79(Network.java:79)
   at io.dishup.dishup.EndpointCustomer.setNewCustomer + 29(EndpointCustomer.java:29)
   at io.dishup.dishup.GoogleSignInToDishup.sendTokensToServer + 129(GoogleSignInToDishup.java:129)
   at io.dishup.dishup.GoogleSignInToDishup.access$400 + 29(GoogleSignInToDishup.java:29)
   at io.dishup.dishup.GoogleSignInToDishup$5.onComplete + 114(GoogleSignInToDishup.java:114)
   at com.google.android.gms.tasks.zzj.run + 4(:4)
   at android.os.Handler.handleCallback + 873(Handler.java:873)
   at android.os.Handler.dispatchMessage + 99(Handler.java:99)
   at android.os.Looper.loop + 193(Looper.java:193)
   at android.app.ActivityThread.main + 6898(ActivityThread.java:6898)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 537(RuntimeInit.java:537)
   at com.android.internal.os.ZygoteInit.main + 858(ZygoteInit.java:858)
Caused by java.lang.ClassNotFoundException: Didn't find class "org.apache.http.RequestLine" on path: DexPathList[[zip file "/data/app/io.dishup.dishup-OqmfH61IongnKfllcQH-mQ==/base.apk"],nativeLibraryDirectories=[/data/app/io.dishup.dishup-OqmfH61IongnKfllcQH-mQ==/lib/arm64, /system/lib64]]
   at dalvik.system.BaseDexClassLoader.findClass + 169(BaseDexClassLoader.java:169)
   at java.lang.ClassLoader.loadClass + 379(ClassLoader.java:379)
   at java.lang.ClassLoader.loadClass + 312(ClassLoader.java:312)
   at com.koushikdutta.ion.Ion$Config$1.createAsyncHttpRequest + 559(Ion.java:559)
   at com.koushikdutta.ion.IonRequestBuilder.prepareRequest + 282(IonRequestBuilder.java:282)
   at com.koushikdutta.ion.IonRequestBuilder.execute + 616(IonRequestBuilder.java:616)
   at com.koushikdutta.ion.IonRequestBuilder.execute + 606(IonRequestBuilder.java:606)
   at com.koushikdutta.ion.IonRequestBuilder.as + 891(IonRequestBuilder.java:891)
   at io.dishup.dishup.Network.request + 79(Network.java:79)
   at io.dishup.dishup.EndpointCustomer.setNewCustomer + 29(EndpointCustomer.java:29)
   at io.dishup.dishup.GoogleSignInToDishup.sendTokensToServer + 129(GoogleSignInToDishup.java:129)
   at io.dishup.dishup.GoogleSignInToDishup.access$400 + 29(GoogleSignInToDishup.java:29)
   at io.dishup.dishup.GoogleSignInToDishup$5.onComplete + 114(GoogleSignInToDishup.java:114)
   at com.google.android.gms.tasks.zzj.run + 4(:4)
   at android.os.Handler.handleCallback + 873(Handler.java:873)
   at android.os.Handler.dispatchMessage + 99(Handler.java:99)
   at android.os.Looper.loop + 193(Looper.java:193)
   at android.app.ActivityThread.main + 6898(ActivityThread.java:6898)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 537(RuntimeInit.java:537)
   at com.android.internal.os.ZygoteInit.main + 858(ZygoteInit.java:858)

我真的不明白这是怎么回事。

【问题讨论】:

  • 这应该在最新的 ion 版本中得到修复。该依赖项已被删除。

标签: android android-ion


【解决方案1】:

尝试将此行添加到您的 build.gradle:

android {

 useLibrary 'org.apache.http.legacy' //(this worked for us when we had a similar issue with apache)

或者,在你的清单中试试这个:

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

原因在于,从 android 9 开始,该库已从 bootclasspath 中删除,并且默认情况下对应用程序不可用,因此必须添加它。

见:https://developer.android.com/about/versions/pie/android-9.0-changes-28#apache-p

【讨论】:

    【解决方案2】:

    我看到您在代码中使用了 Apache HTTP 客户端。

    由 java.lang.ClassNotFoundException 引起:找不到类 "org.apache.http.RequestLine"

    不推荐启用legacy mode for the use of this library,事实上since Android 9, Apache HTTP client library was completely removed来自引导类路径,并且默认情况下不适用于应用程序。

    真正的解决方案是实现HttpUrlConnection 类。 如果您正在使用ion library,您可以有两个更好的选择,它们已经在使用**HttpUrlConnection 类。**


    GlidePicasso的使用与离子库类似。


    滑行

    从资源(/drawable 目录)加载图片:

    Glide.with(context).load(R.drawable.android).into(imageView);
    

    从 url 加载图片:

    Glide.with(context).load(<image Url>).into(imageView);
    

    将此依赖项定义到您的build.gradle 文件中:

    dependencies {
        ...
        implementation 'com.github.bumptech.glide:glide:4.9.0'
        ...
    }
    

    毕加索:

    从资源(/drawable 目录)加载图片:

    Picasso.get().load(R.drawable.android).into(imageView);
    

    从 url 加载图片:

    Picasso.get().load(<image Url>).into(imageView);
    

    您需要将此依赖项定义到您的build.gradle 文件中:

    dependencies {
        ...
        implementation 'com.squareup.picasso:picasso:2.71828
        ...
    }
    

    使用这两个选项,您将获得相同的结果:

    【讨论】:

      【解决方案3】:

      如您所见,例外是ClassNotFoundException。当您要创建类的对象或访问不存在的类的字段时,会发生此异常。但是等等,如果该类不存在,那么我的代码将不会被编译。是的,你说得对,所以该类存在,但有些东西会删除该类。类似于Progaurd

      因此,您必须添加一些 progaurd 规则来保留该类。将这些代码添加到您的 proguard-rules.pro 文件中:

      -dontwarn org.apache.commons.**
      -keep class org.apache.http.** { *; }
      -dontwarn org.apache.http.**
      

      另外,不要使用 maven 存储库,下载 jar 文件并将它们放入 `/app/libs' 文件夹,然后在 build.gradle 文件中写入以下行。

      compile files('libs/httpmime-4.3.5.jar')
      compile files('libs/httpclient-4.3.5.jar')
      compile files('libs/httpclient-cache-4.3.5.jar')
      compile files('libs/httpcore-4.3.2.jar')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-31
        • 2017-01-17
        • 2019-04-18
        • 2019-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多