【问题标题】:java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/commons/logging/LogFactoryjava.lang.NoClassDefFoundError:解析失败:Lorg/apache/commons/logging/LogFactory
【发布时间】:2019-01-23 03:15:06
【问题描述】:

类似的问题已经被问过了。但是由于Android平台的兼容性发生了变化,这似乎比以前的更复杂。

这是我注册 Android Beta Program 的 Pixel 和 Pixel2 的错误日志

08-16 13:20:53.146 9630-9630/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: me.project.android.dev, PID: 9630
    java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/commons/logging/LogFactory;
        at com.amazonaws.util.VersionInfoUtils.<clinit>(VersionInfoUtils.java:41)
        at com.amazonaws.util.VersionInfoUtils.c(VersionInfoUtils.java:77)
        at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:43)
        //project specific class reference removed
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        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)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.commons.logging.LogFactory" on path: DexPathList[[zip file "/data/app/me.project.android.dev-0SPRJnc8-4voauRU7Y20zQ==/base.apk"],nativeLibraryDirectories=[/data/app/me.project.android.dev-0SPRJnc8-4voauRU7Y20zQ==/lib/arm64, /data/app/me.project.android.dev-0SPRJnc8-4voauRU7Y20zQ==/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at com.amazonaws.util.VersionInfoUtils.<clinit>(VersionInfoUtils.java:41) 
        at com.amazonaws.util.VersionInfoUtils.c(VersionInfoUtils.java:77) 
        at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:43) 
        //project specific class reference removed
        at android.os.Handler.handleCallback(Handler.java:873) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        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 7.0 及更低版本的设备上运行相同的代码时,它运行良好。

我也尝试向我的项目添加依赖项

implementation "commons-logging:commons-logging:1.2"

添加此依赖项使应用程序在 Pixel 和 Pixel 中运行,但随后它在所有其他设备中崩溃并出现异常提示

org.apache.commons.logging.impl.LogFactoryImpl does not extend or implement org.apache.commons.logging.LogFactory

我已经尝试在 ProGuard 中进行所有更改。这是我的proguard配置

-keep class org.apache.commons.logging.impl.LogFactoryImpl
-keep class org.apache.commons.logging.LogFactory
-keepnames class org.apache.commons.logging.impl.* {*;}
-keepnames class org.apache.commons.logging.*
-keepclassmembers class org.apache.commons.logging.impl.* {*;}
-keepclassmembers class org.apache.commons.logging.*
-keepnames interface org.apache.commons.logging.impl.* {*;}
-keepnames interface org.apache.commons.logging.*

仍然导致崩溃。

此问题与 Amazon AWS SDK - https://github.com/aws/aws-sdk-android/issues/476

有关

在 AWS 更新其 SDK 以解决此问题之前,是否有任何解决方法?

【问题讨论】:

  • aws sdk 的版本是多少?
  • @shishram 我现在使用的是 2.6.27 版
  • @MohammedAtif 你是怎么解决这个问题的?
  • @Sagar 您可以使用 logcat 跟踪问题。可能您的依赖项之一是在内部使用这些已删除的依赖项。
  • @Sagar 尝试在你的清单文件中添加这一行。

标签: android amazon-web-services android-proguard aws-sdk-android


【解决方案1】:

在清单文件中添加以下行。

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

【讨论】:

  • 感谢您的建议,但我更愿意更新 sdk 本身。
  • 非常感谢,对于像我这样想知道该 将在清单中何处使用的人:这将直接位于 上方。
【解决方案2】:

这是一个 AWS 开发工具包错误,似乎已在 version 2.6.30 of the SDK 中解决:

修复了使用 Apache Commons Logging 获取记录器的错误 从 Android 9.0(Pie / API 级别 28)开始崩溃。参见拉 #521。现在, 如果将 Apache Commons Logging 添加为 依赖,否则会使用android.util.Log。

【讨论】:

    【解决方案3】:

    为了解决这个问题,我有依赖 实现“commons-logging:commons-logging-api:1.1” 在 gradle 文件中。

    【讨论】:

    • 这为我节省了很多时间。谢谢!
    【解决方案4】:

    另一种解决方法是将commons-logging 库作为.jar 文件添加到您的libs/ 文件夹中,而不是使用implementation。确保 implementation fileTree(include: ['*.jar'], dir: 'libs') 在您的依赖项中。

    commons-logging-1.2.jar的来源:

    1. Maven Repository
    2. Apache Commons Logging

    学分: Dale Lim - https://github.com/aws/aws-sdk-android/issues/265#issuecomment-411978696

    【讨论】:

    • 忘记包含问题。但是这种方法比添加依赖有更多的冲突
    【解决方案5】:
       /*Apache Commons Logging would crash starting Android 9.0 (Pie / API Level 28).*/
    
       //try this 
    
        testImplementation 'commons-logging:commons-logging:1.2'
    
        // in manifest  <application> s
        <uses-library android:name="org.apache.http.legacy" android:required="false" />
    
         /* if this files  'commons-logging:commons-logging:1.2' fails to download  then
          download this file manual  from http://commons.apache.org/proper/commons- 
           logging/download_logging.cgi and paste it lib folder*/
    

    【讨论】:

      猜你喜欢
      • 2016-01-25
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 2017-01-17
      • 2010-11-26
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多