web-dev-qa-db-fra.com

java.lang.NoClassDefFoundError: Echec de la résolution de: Lorg/Apache/commons/logging/LogFactory

Des questions similaires ont déjà été posées. Mais celui-ci semble être plus compliqué que les précédents en raison de changements dans la compatibilité des plates-formes Android.

Voici mon journal des erreurs de Pixel et Pixel2 qui sont inscrits au programme Android Beta

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) 

Même code lorsqu'il est exécuté sur des appareils fonctionnant sous Android 7.0 et versions ultérieures, il fonctionne parfaitement.

J'ai aussi essayé d'ajouter de la dépendance à mon projet

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

L'ajout de cette dépendance permet à l'application de fonctionner dans Pixel et Pixel, mais se bloque ensuite dans tous les autres appareils avec le mot Exception 

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

J'ai déjà essayé de faire tous les changements dans ProGuard. Voici ma configuration 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.*

Toujours à l'origine du crash.

Ce problème est lié à Amazon AWS SDK - https://github.com/aws/aws-sdk-Android/issues/476

Existe-t-il une solution de rechange jusqu'à ce que AWS mette à jour son SDK pour résoudre ce problème?

7
Mohammed Atif

Il s'agit d'un bogue AWS SDK qui semble avoir été résolu dans version 2.6.30 du SDK :

Correction d'un bug qui permettait d'obtenir un enregistreur utilisant Apache Commons Logging crash à partir d'Android 9.0 (niveau Pie/API 28) Voir tirage # 521. À présent, Apache Commons Logging serait utilisé s'il était ajouté en tant que dépendance, sinon Android.util.Log sera utilisé.

8
Roy Solberg

Ajoutez cette ligne ci-dessous dans le fichier manifeste.

<uses-library Android:name ="org.Apache.http.legacy" Android:required ="false"/>
0
Rajan Kashiyani

Une autre solution consiste à ajouter la bibliothèque commons-logging en tant que fichier .jar à votre dossier libs/ au lieu d'utiliser implementation. Assurez-vous que implementation fileTree(include: ['*.jar'], dir: 'libs') est dans vos dépendances.

Sources de commons-logging-1.2.jar:

  1. Répertoire Maven
  2. Apache Commons Logging

Credit: Dale Lim - https://github.com/aws/aws-sdk-Android/issues/265#issuecomment-411978696

0
m00head