java.lang.NoClassDefFoundError: Не удалось разрешить: Lorg/apache/commons/logging/LogFactory

Подобные вопросы уже нужно задавать. Но этот кажется более сложным, чем предыдущие, из-за изменений совместимости платформ Android.

Вот мой журнал ошибок от Pixel и Pixel2, которые зарегистрированы для бета-версии Android

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"

Добавление этой зависимости заставляет приложение работать в пикселях и пикселях, но затем оно вылетает на всех других устройствах с исключением, говоря

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, чтобы решить эту проблему?

2 ответа

Добавьте эту строку ниже в файл описания.

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

Это ошибка AWS SDK, которая, по-видимому, устранена в версии 2.6.30 SDK:

Исправлена ​​ошибка, при которой получение регистратора с использованием Apache Commons Logging приводило к сбою при запуске Android 9.0 (Pie / API Level 28). Смотрите тягу № 521. Теперь протоколирование Apache Commons Logging будет использоваться, если оно будет добавлено как зависимость, в противном случае будет использоваться android.util.Log.

Чтобы исправить эту проблему, у меня была реализация зависимости "commons-logging:commons-logging-api:1.1" в файле gradle.

Альтернативный обходной путь - добавить commons-logging библиотека как .jar подать в ваш libs/ папка вместо использования implementation, Удостоверься что implementation fileTree(include: ['*.jar'], dir: 'libs') в ваших зависимостях.

Источники commons-logging-1.2.jar:

  1. Репозиторий Maven
  2. Apache Commons Logging

Кредит: Дейл Лим - https://github.com/aws/aws-sdk-android/issues/265

   /*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*/
Другие вопросы по тегам