J'utilise FileProvider
dans mon application. Comme d'habitude, j'ai déclaré la balise <Provider>
dans le fichier AndroidManifest.xml
comme ci-dessous.
<provider
Android:name="Android.support.v4.content.FileProvider"
Android:authorities="com.jk.Android.fileprovider"
Android:exported="false"
Android:grantUriPermissions="true">
<meta-data
Android:name="Android.support.FILE_PROVIDER_PATHS"
Android:resource="@xml/file_paths" />
</provider>
Lorsque je l'exécute sur un appareil Android doté de la version Lollipop
, cela fonctionne correctement. quand je l'essaie sur la version KitKat
, il affiche les erreurs suivantes:
FATAL EXCEPTION: main
Process: com.jk.Android.perfectphotoeditor2018, PID: 24992
Java.lang.RuntimeException: Unable to get provider Android.support.v4.content.FileProvider: Java.lang.ClassNotFoundException: Didn't find class "Android.support.v4.content.FileProvider" on path: DexPathList[[Zip file "/data/app/com.jk.Android.perfectphotoeditor2018-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.jk.Android.perfectphotoeditor2018-2, /system/lib]]
at Android.app.ActivityThread.installProvider(ActivityThread.Java:5071)
at Android.app.ActivityThread.installContentProviders(ActivityThread.Java:4648)
at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4588)
at Android.app.ActivityThread.access$1500(ActivityThread.Java:151)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1290)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:136)
at Android.app.ActivityThread.main(ActivityThread.Java:5299)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:932)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:748)
at dalvik.system.NativeStart.main(Native Method)
Caused by: Java.lang.ClassNotFoundException: Didn't find class "Android.support.v4.content.FileProvider" on path: DexPathList[[Zip file "/data/app/com.jk.Android.perfectphotoeditor2018-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.jk.Android.perfectphotoeditor2018-2, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.Java:56)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:497)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:457)
at Android.app.ActivityThread.installProvider(ActivityThread.Java:5056)
at Android.app.ActivityThread.installContentProviders(ActivityThread.Java:4648)
at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4588)
at Android.app.ActivityThread.access$1500(ActivityThread.Java:151)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1290)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:136)
at Android.app.ActivityThread.main(ActivityThread.Java:5299)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:932)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:748)
at dalvik.system.NativeStart.main(Native Method)
J'avais essayé beaucoup de solutions comme ça mais ça ne marche pas pour moi. alors aidez-moi à résoudre ce problème.
dépendances build.gradle:
dependencies {
compile 'com.Android.support.constraint:constraint-layout:1.0.2'
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.Android.support', module: 'support-annotations'
})
configurations.all {
resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
}
testCompile 'junit:junit:4.12'
/* Add the CSDK framework dependencies (Make sure these version numbers are correct) */
// compile 'com.aviary.Android.feather.sdk:aviary-sdk:3.6.3'
compile 'com.Android.support:appcompat-v7:25.4.0'
compile 'com.Adobe.creativesdk.foundation:auth:0.9.1251'
compile 'com.Adobe.creativesdk:image:4.8.4'
compile 'com.localytics.Android:library:4.0.1'
compile 'com.Android.support:design:25.4.0'
compile 'com.Android.support:multidex:1.0.2'
compile 'com.Android.support:support-v4:25.4.0'
compile 'com.intuit.sdp:sdp-Android:1.0.4'
compile 'com.github.bumptech.glide:glide:4.3.1'
compile 'com.google.Android.gms:play-services-ads:9.4.0'
implementation 'com.Android.support:support-v4:25.4.0'
}
Après avoir lu attentivement la documentation Android Multidex, j’ai constaté qu’il nous manque généralement une configuration qui provoque Java.lang.NoClassDefFoundError
. Si vous avez effectué une configuration multidex standard pour limite de référence de 65 K et que vous ne pouvez toujours pas vous débarrasser de Java.lang.NoClassDefFoundError
, vous devez suivre ces étapes.
Ajouter la ligne suivante (le nom de classe absolu pour lequel vous obtenez une exception)
Android.support.v4.content.FileProvider
Modifiez votre build.gradle comme suit
Android {
buildTypes {
release {
multiDexKeepFile file('multidex-config.txt')
...
}
}
}
Remarque: Vous pouvez l'ajouter pour un type de construction spécifique ou les deux en le déclarant dans defaultConfig
.
Les outils de construction Android construisent un fichier DEX principal (classes.dex) et prennent en charge les fichiers DEX (classes2.dex, classes3.dex, etc.) selon les besoins. Le système de compilation regroupe ensuite tous les fichiers DEX dans votre APK.
Au moment de l'exécution, les API multidex utilisent un chargeur de classes spécial pour rechercher tous vos fichiers DEX disponibles dans vos méthodes (au lieu de rechercher uniquement dans le fichier classes.dex principal).
Lors de la création de chaque fichier DEX pour une application multidex, les outils de génération prennent des décisions complexes pour déterminer les classes nécessaires dans le fichier DEX principal afin que votre application puisse démarrer avec succès. Si aucune classe requise au démarrage n'est fournie dans le fichier DEX principal, votre application se bloque alors avec l'erreur
Java.lang.NoClassDefFoundError
.
Cela ne devrait pas arriver pour le code auquel on accède directement à partir du code de votre application car les outils de génération reconnaissent ces chemins de code, mais cela peut se produire lorsque les chemins de code sont moins visibles, par exemple lorsqu'une bibliothèque que vous utilisez possède des dépendances complexes. Par exemple, si le code utilise l'introspection ou l'invocation de méthodes Java à partir de code natif, il est possible que ces classes ne soient pas reconnues comme requises dans le fichier DEX principal.
Donc, si vous recevez Java.lang.NoClassDefFoundError
, vous devez alors spécifier manuellement ces classes supplémentaires comme requis dans le fichier DEX primaire en les déclarant avec le multiDexKeepFile (illustré ci-dessus) ou le multiDexKeepProguard ( reportez-vous à la documentation ) propriété dans votre type de construction. Si une classe correspond dans le fichier multiDexKeepFile ou multiDexKeepProguard, cette classe est ajoutée au fichier DEX principal.
Pour une documentation complète sur multidex, consultez https://developer.Android.com/studio/build/multidex
J'ai la même question et cette documentation résout mon problème. https://developer.Android.com/studio/build/multidexAndroid multidex
avant Android 5.0, vous devez utiliser les méthodes suivantes pour utiliser Multidex:
Android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 28
multiDexEnabled true
}
...
}
dependencies {
compile 'com.Android.support:multidex:1.0.3'
}
puis modifier l'application, sélectionnez l'une des trois méthodes suivantes:
si vous n'implémentez pas l'application:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.example.myapp">
<application
Android:name="Android.support.multidex.MultiDexApplication" >
...
</application>
</manifest>
si vous avez une application personnalisée, vous pouvez modifier comme ceci:
public class MyApplication extends MultiDexApplication { ... }
si vous avez remplacé l'application de base, vous pouvez modifier comme ceci:
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
J'espère que cela peut résoudre votre problème.
dans mon projet lorsque "multiDexEnabled" est défini sur false, erreur corrigée . aller au fichier manifeste et ajouter
Android {
defaultConfig {
multiDexEnabled false
}}
espérons que cela vous sera utile