Vous n'avez pas trouvé la classe «com.google.firebase.provider.FirebaseInitProvider»?

156

Je reçois l'exception ci-dessous lors du lancement de l'application.

java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[zip file "/data/app/com.vfirst.ifbagro-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.vfirst.ifbagro-1, /vendor/lib, /system/lib]]
at android.app.ActivityThread.installProvider(ActivityThread.java:4993)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4596)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4536)
at android.app.ActivityThread.access$1300(ActivityThread.java:149)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1353)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5214)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[zip file "/data/app/com.vfirst.ifbagro-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.vfirst.ifbagro-1, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:53)
at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
at android.app.ActivityThread.installProvider(ActivityThread.java:4978)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4596) 
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4536) 
at android.app.ActivityThread.access$1300(ActivityThread.java:149) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1353) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5214) 
at java.lang.reflect.Method.invokeNative(Native Method) 

Voici le build.gradle au niveau de l'application

apply plugin: 'com.android.application'
apply plugin: 'android-apt' 

android {
compileSdkVersion 24
buildToolsVersion "24.0.1"

defaultConfig {
    applicationId "com.vfirst.ifbagro"
    minSdkVersion 17
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])


compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:design:24.2.1'
compile 'com.android.support:support-v4:24.2.1'
compile 'com.google.android.gms:play-services-gcm:9.4.0'
compile 'com.google.android.gms:play-services-location:9.4.0'
compile 'com.android.support:multidex:1.0.1'
compile 'com.google.firebase:firebase-messaging:9.4.0'
compile 'com.google.android.gms:play-services:9.4.0'
testCompile 'junit:junit:4.12'
}

apply plugin: 'com.google.gms.google-services'

Ceci est mon build.gradle au niveau de l'application

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
    jcenter()
    mavenCentral()
}
dependencies {
    classpath 'com.android.tools.build:gradle:2.2.0'
    classpath 'com.google.gms:google-services:3.0.0'
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    classpath 'com.google.gms:google-services:3.0.0'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}
}

allprojects {
repositories {
    jcenter()
}
}

task clean(type: Delete) {
     delete rootProject.buildDir
}

Comment résoudre le problème?

SOUHAIT
la source
Copie possible de stackoverflow.com/questions/37312103/…
Jay Rathod RJ
J'avais déjà essayé toutes ces réponses. rien ne fonctionne
WISHY
Il semble y avoir un problème dans votre manifeste ou google-services.json Assurez-vous qu'ils sont corrects. Pouvez-vous publier votre fichier manifeste?
Rushi M Thakker
6
Avez - vous fait le changement manifeste nécessaire pour MultiDex: android:name="android.support.multidex.MultiDexApplication"? Si MultiDex est correctement configuré , vous verrez des messages LogCat lors de l' application init de comme celui - ci: I/MultiDex: install done.
Bob Snyder
cochez l'activation de l'exécution instantanée si oui, désactivez l'exécution instantanée.
Prathap Badavath

Réponses:

145

J'ai eu la même erreur et je l'ai résolue avec MultiDex, comme décrit sur ce lien: https://developer.android.com/studio/build/multidex.html


Parfois, il ne suffit pas d'activer MultiDex.

Si une classe requise au démarrage n'est pas fournie dans le fichier DEX principal , votre application se bloque avec l'erreur java.lang.NoClassDefFoundError . https://developer.android.com/studio/build/multidex#keep

FirebaseInitProvider est requis au démarrage.

Vous devez donc spécifier manuellement FirebaseInitProvider comme requis dans le fichier DEX principal.

fichier build.gradle

android {
    buildTypes {
        release {
            multiDexKeepFile file('multidex-config.txt')
            ...
        }
    }
}

multidex-config.txt (dans le même répertoire que le fichier build.gradle)

com/google/firebase/provider/FirebaseInitProvider.class
Johanvs
la source
1
vous êtes incroyable <3 merci beaucoup vous avez sauvé ma journée <3
Mohamed Atef
24
Hey cette exception: Causée par: java.lang.ClassNotFoundException: La classe "com.google.firebase.provider.FirebaseInitProvider" n'a rien à voir avec l'activation de multidex, en fait si vous voyez les questions build.gradle multiDexEnabled est activé!
Jorgesys
3
Non, cette erreur vient de multidex, il n'a tout simplement pas terminé toutes les étapes, car vous ne pouvez pas voir son manifeste ou sa classe principale.
AMAN77
3
Cela a fonctionné. J'avais activé le multidex dans mon fichier gradle, mais il manquait la partie Android Manifest!
krikara
3
Assurez-vous également que votre Applicationclasse s'étend de MultiDexApplication(). Cela manquait dans mon cas.
Nelson Almendra
86

J'ai aussi rencontré le même problème et je l'ai finalement résolu en désactivant Instant Rundans un studio Android.

Paramètres → Build, Execution, Deployment → Instant Run et décochez Activer Instant Run

Mettre à jour:

Il n'y a pas d'option Instant Run disponible dans le dernier Android Studio 3.5+. Il ne devrait s'appliquer qu'aux anciennes versions.

Shylendra Madda
la source
8
Pareil pour moi. C'était la cause du problème - pas multidex ou aucune des autres réponses.
user3562927
3
Il semble que ce soit un problème avec Android Studio 2.3. La désactivation de l'exécution instantanée a fonctionné pour moi aussi, mais ce n'est pas la solution idéale :(
Tharaka Devinda
1
J'ai hérité de deux projets d'une autre firme. Les configurations de base de code, de manifeste et de gradle sont pratiquement les mêmes que celles attendues pour quelques éléments mineurs. Un projet se construit et fonctionne correctement, l'autre non. Désactivé Instant Run et ils fonctionnent tous les deux maintenant. Étrange. Cela utilise Android Studio. 2.3.
joeblow23
3
J'ai rencontré ce même problème avec AS 3.1 et un émulateur exécutant l'API 26. Avant, je n'avais rencontré aucun problème avec les API 19-25. La désactivation de l'exécution instantanée m'a permis d'exécuter l'application. Merci.
Marcin Jedynak
1
La désactivation d'Instant Run ne résout pas ce problème pour moi.
Aliochak
49

Dans le fichier build.gradle (Module: app), insérez le code ci-dessous dans defaultConfig:

  defaultConfig {
        applicationId "com.***.****"
minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

et insérer dans les dépendances:

implementation 'com.android.support:multidex:2.0.1'

Ensuite, ajoutez du code au manifeste:

<application 
    android:name="android.support.multidex.MultiDexApplication"
CodeArt
la source
1
Je suis en train de l'essayer, si cela fonctionne, je voterai et commenterai
Kamil Ibadov
45

J'ai eu le même problème dans mon (projet de lecteur YouTube) ... et ce qui suit a résolu le problème pour moi:

  1. Ajoutez ce code dans votre build.gradle(module: app) à l'intérieur defaultConfing:

    defaultConfig {
        ....
        ....
        multiDexEnabled = true
    }
  2. Ajoutez ce code dans votre build.gradle(module: app) à l'intérieur dependencies:

    dependencies {
        compile 'com.android.support:multidex:1.0.1'
        .....
        .....
    }
  3. Ouvert AndroidManifest.xmlet intérieur application:

    <application
        android:name="android.support.multidex.MultiDexApplication"
        .....
        .....
    </application>

    ou si vous avez votre classe App, étendez-la à partir de MultiDexApplication comme:

    public class MyApp extends MultiDexApplication {
    .....

Et enfin, je pense que vous devriez avoir téléchargé le référentiel de support Android , dans les extras dans SDK Manager .

Firas Hashash
la source
1
J'ai fait "MultiDex.install (this);" mais cela n'a pas fonctionné. L'extension de la classe d'application avec MultiDexApplication a fait l'affaire.
Safeer le
33

Remplacez simplement la méthode suivante dans votre classe d'application.

public class YourApplication extends Application {

    @Override
    protected void attachBaseContext(Context context) {
        super.attachBaseContext(context);
        MultiDex.install(this);
    }
    @Override
    public void onCreate() {
        super.onCreate();
        Realm.init(this); //initialize other plugins 

    }
}
SilverSky
la source
plus un pour ne pas avoir android:name
craqué
La réponse la plus simple et la meilleure
kader kabore
Si vous utilisez une classe Application personnalisée, c'est la réponse. D'autres réponses ne résoudront pas le problème.
makkhay gurung
25

Lorsque votre application et les bibliothèques auxquelles elle fait référence dépassent 65536 méthodes, vous rencontrez une erreur de génération qui indique que votre application a atteint la limite de l'architecture de build Android

Pour éviter cette limitation, vous devez configurer votre application pour le multidex

Si votre minSdkVersion est définie sur 21 ou plus, tout ce que vous avez à faire est de définir multiDexEnabled sur true dans votre fichier build.gradle au niveau du module, comme indiqué ici:

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        multiDexEnabled true
    }
    ...   
}

Sinon , si votre minSdkVersion est définie sur 20 ou moins, vous devez utiliser la bibliothèque de support multidex comme suit:

1 .Modifiez le fichier build.gradle au niveau du module pour activer multidex et ajoutez la bibliothèque multidex en tant que dépendance, comme indiqué ici:

android {
    defaultConfig {
        ...
        minSdkVersion 15 
        multiDexEnabled true
    }
    ...
 }

dependencies {
        implementation 'com.android.support:multidex:1.0.3'
}

2 .Depending si vous substituez la classe d'application, effectuez une des opérations suivantes:

  • Si vous ne remplacez pas la classe Application, modifiez votre fichier manifeste pour définir android: name dans la balise comme suit:

    <application
        android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
  • Sinon Si vous remplacez la classe Application, modifiez-la pour étendre MultiDexApplication (si possible) comme suit:

   public class MyApplication extends MultiDexApplication { ... }
  • Sinon, vous remplacez la classe Application mais il n'est pas possible de changer la classe de base, vous pouvez alors remplacer la méthode attachBaseContext () et appeler MultiDex.install (this) pour activer le multidex:

   public class MyApplication extends SomeOtherApplication {
     @Override
     protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
     }
   }
Sokmean Pon
la source
Pourquoi l'application doit-elle étendre MultiDexApplication?
Jason
1
MultiDexApplication est une classe de bibliothèque de support. Il implémente la classe Application et remplace un nom de méthode attachBaseContext pour effectuer le travail d'enregistrement MultiDex. Vous n'avez pas besoin d'étendre cette classe si vous substituez la méthode attachBaseContext.
Sokmean Pon
1
Cela a résolu le problème pour moi en 2019 avec React Native mais il manque 2 importations dans MainApplication.java: import android.content.Context;etimport android.support.multidex.MultiDex;
xaphod
1
votre réponse m'a aidé à rendre mon application compatible.
Alok Vishwakarma
18

L'activation multidexn'est pas une bonne solution car multidexavoir une autre utilisation dans Android voir cette réponse qu'est-ce que le multidex

La solution est de désactiver l'exécution instantanée comme l'a dit @Shylendra Madda

Paramètres → Build, Execution, Deployment → Instant Run et décochez Activer Instant Run

Je pense que la raison de ce problème est que lorsque l'exécution instantanée est activée, Android Studio ne met pas les bibliothèques telles que firebasedans l'apk généré pour réduire le temps de construction du projet car la firebase bibliothèque et d'autres bibliothèques telles que mapset d' autres existent dans les services de lecture et les services de lecture sont installés sur un appareil Android, donc si l'exécution instantanée est activée, vous n'avez pas besoin de les mettre dans l'apk généré pour accélérer le temps de construction.

Ainsi, lorsque vous extrayez apk et l'installez sur un autre appareil, vous verrez cette exception

Edalat Feizi
la source
1
C'est la solution parfaite
Ghanshyam Bagul
La désactivation d'Instant Run ne résout pas le problème pour moi.
Alyoshak
Dans Android Studio 3.5.1, il n'y a pas d'élément d'exécution instantanée dans la section Construction, exécution, déploiement.
Vergiliy
@Vergiliy Ils l'ont remplacé par des modifications d'application, voir l'article du blog de publication android-developers.googleblog.com/2019/08/… pour plus d'informations et la documentation developer.android.com/studio/run#apply-changes pour plus d'informations sur apply changements
Edalat Feizi
14

J'ai également rencontré le même problème après avoir essayé toutes les solutions, j'ai trouvé la solution ci-dessous.

Si vous avez appliqué des règles proguard, ajoutez la ligne ci-dessous dans les règles ProGuard

-keep class com.google.firebase.provider.FirebaseInitProvider

et sa résoudre mon problème.

Gunavant Patel
la source
@gunavant patel bro s'il vous plaît dites-moi comment ajouter à proguard s'il vous plaît
Gowthaman M
1
@gunavant patel je pense que cela résoudra mon problème ... pouvez-vous s'il vous plaît poster un exemple de code où garder cette ligne-keep class com.google.firebase.provider.FirebaseInitProvider
Gowthaman M
@GowthamanM Vérifiez d'abord que vous activez proguard dans le fichier app / build.gradle. si activé, vous trouverez le fichier proguard-rules dans app / proguard-rules.pro dans ce fichier, ajoutez au-dessus de la ligne. Si vous n'activez pas proguard, ce n'est pas vous.
Gunavant Patel
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }Comment activer s'il vous plaît dites-moi monsieur
Gowthaman M
si vous n'avez pas activé proguard, le problème est différent. mais je vous montre comment activer cela. ajoutez "minifyEnabled true" dans la version ou si vous souhaitez activer le débogage, ajoutez également le type de débogage.
Gunavant Patel
8

1: Accédez au gradle enable multiDexEnabled et ajoutez la bibliothèque multidex dans les dépendances.

android {
   ...
   defaultConfig {
      multiDexEnabled true
      ...
   }
}

dependencies {
  // add dependency 
  implementation 'com.android.support:multidex:1.0.1'
}

2: Accédez au fichier Manifest et écrivez android: name = ". MyApplication" (le nom de la classe (MyApplication) est facultatif, vous pouvez écrire ce que vous voulez).

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        .
        .
        .
        .
        .
    </application>

3: Comme vous l'avez écrit android: name = ". MyApplication" Inside Application at Manifest file. cela vous donnera une erreur car vous n'avez pas créé la classe MyApplication. Créer une classe MyApplication étendez-la par classe "application" ou cliquez simplement sur MyApplication, un petit ballon rouge apparaît sur le côté gauche d'une syntaxe cliquez dessus, vous verrez (créer classe MyApplication) dans le menu, cliquez dessus et inclure ci-dessous Méthode À l'intérieur de cette classe.

    public class MyApplication extends Application {

    @Override 
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    } 

Si vous souhaitez obtenir plus d'informations, cliquez sur ce lien: [ https://developer.android.com/studio/build/multidex.html]

J'espère que cela fonctionne pour vous.

Shahzad Afridi
la source
7

Ajoutez d'abord ce qui suit dans build.gradle (Module: app) ---->

defaultConfig{
..
multiDexEnabled true
..
}

Ensuite, dans le même fichier, ajoutez ce qui suit

dependencies{
...
compile 'com.android.support:multidex:1.0.1'
...
}

Ensuite, dans AndroidManifest.xml, écrivez ce qui suit

<application
    android:name="android.support.multidex.MultiDexApplication"
    .....
    .....
</application>

C'est tout. Cela fonctionnera certainement

Hirak JD
la source
6

Si vous utilisez MultiDex dans votre application Gradle, le changement étend l'application pour étendre MultiDexApplication dans votre classe d'application. Cela fonctionnera avec défi

Suresh Kumar
la source
4

J'ai eu le même problème et résolu, ajoutez simplement un morceau de code.Si vous rencontrez ce problème, cela signifie que vous avez déjà terminé toutes les étapes nécessaires pour utiliser Firebase. Il vous suffit de créer une classe qui étend l'application (la classe publique Application_CrashReport étend l'application) et d'ajouter cette classe dans le fichier mainifest et dans cette classe, il suffit de remplacer la méthode ci-dessous

  @Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
}

et ajoutez MultiDex.install (this); dans cette méthode signifie

  @Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

Remarque : - N'oubliez pas de suivre les étapes ci-dessus

Peter
la source
2

Cela est dû à MultiDex.

Les étapes à résoudre:

  1. Dans gradle-> dependencies -> (compile'com.android.support: multidex: 1.0.1 ') Ajoutez ceci dans les dépendances

  2. Dans votre projet, la classe d'application étend MultiDexApplication comme ceci (la classe publique MyApplication étend MultiDexApplication)

  3. Exécuter et vérifier

Sukhdeep Saini
la source
2

C'est un peu tard pour ceux qui arrivent, mais vérifiez vos règles proguard! J'ai perdu beaucoup de temps là-dessus. Vos règles proguard peuvent changer les noms des fichiers Firebase importants. Cela ne prouve vraiment qu'un problème en production et en exécution instantanée :)

proguard-rules.pro

-keep class com.google.firebase.** { *; }
-keep class com.firebase.** { *; }
-keep class org.apache.** { *; }
-keepnames class com.fasterxml.jackson.** { *; }
-keepnames class javax.servlet.** { *; }
-keepnames class org.ietf.jgss.** { *; }
-dontwarn org.apache.**
-dontwarn org.w3c.dom.**
Keith Aylwin
la source
Cela a fait l'affaire, activer le multidex n'a fait que perdre du temps!
Magnus W
2

Comme mentionné précédemment, il s'agit d'un problème avec multidex: vous devez ajouter une implémentation à votre build.gradleet MainApplication.java. Mais ce que vous ajoutez dépend vraiment du fait que vous preniez en charge AndroidX ou non. Voici ce dont vous avez besoin pour résoudre ce problème:

  1. Si vous supportez AndroidX

Mettez ces lignes de code dans votre build.gradle(android / app / build.gradle):

defaultConfig {
  applicationId "com.your.application"
  versionCode 1
  versionName "1.0"
  ...
  multiDexEnabled true // <-- THIS LINE
}
...
...
dependencies {
  ...
  implementation "androidx.multidex:multidex:2.0.1" // <-- THIS LINE
  ...
}

Mettez ces lignes dans votre MainApplication.java(android / app / src / main / java /.../ MainApplication.java):

package com.your.package;

import androidx.multidex.MultiDexApplication; // <-- THIS LINE
...
...
public class MainApplication extends MultiDexApplication { ... } // <-- THIS LINE
  1. Si vous ne supportez pas AndroidX

Mettez ces lignes de code dans votre build.gradle(android / app / build.gradle):

defaultConfig {
  applicationId "com.your.application"
  versionCode 1
  versionName "1.0"
  ...
  multiDexEnabled true // <-- THIS LINE
}
...
...
dependencies {
  ...
  implementation "com.android.support:multidex:1.0.3" // <-- THIS LINE
  ...
}

Mettez ces lignes dans votre MainApplication.java(android / app / src / main / java /.../ MainApplication.java):

package com.your.package;

import android.support.multidex.MultiDex;; // <-- THIS LINE
...
...
public class MainApplication extends MultiDexApplication { ... } // <-- THIS LINE
E. Dn
la source
1

Vous devez étendre votre classe Application avec MultiDexApplicationau lieu de Application.

Ali Akram
la source
0

Ce problème s'est produit lorsque je suis passé à Android Studio 3.4 avec le plugin Android Gradle 3.4.0. qui fonctionne avec le compilateur R8.

Le plugin Android Gradle inclut des fichiers de règles ProGuard prédéfinis supplémentaires, mais il est recommandé d'utiliser proguard-android-Optimize.txt . Plus d'infos ici .

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile(
          'proguard-android-optimize.txt'),
          // List additional ProGuard rules for the given build type here. By default,
          // Android Studio creates and includes an empty rules file for you (located
          // at the root directory of each module).
          'proguard-rules.pro'
    }
}
Levon Petrosyan
la source
0

J'étais confronté au même problème et j'ai résolu ce problème en changeant la version de fireabseStorage de la même manière que la version de base de données Firebase

 implementation 'com.google.firebase:firebase-core:16.0.8'
 implementation 'com.google.firebase:firebase-database:16.0.1'
 implementation 'com.google.firebase:firebase-storage:17.0.0'

à

 implementation 'com.google.firebase:firebase-core:16.0.8'
 implementation 'com.google.firebase:firebase-database:16.0.1'
 implementation 'com.google.firebase:firebase-storage:16.0.1'
Umer Waqas
la source
0

Si vous avez> 20 minsdkversion, vous devez utiliser la dernière version de Firebase Auth ie

implémentation 'com.google.firebase: firebase-auth: 18.1.0'

et pas besoin de configurer multi-dex si vous n'en avez pas réellement besoin.

J'ai rencontré ce problème lorsque j'ai utilisé 16.0.5 à partir de l'assistant Firebase mais que j'ai pu le résoudre lorsque j'ai mis à jour vers 18.1.0.

Flèche d'argent
la source
-6

ajouter le chemin racine du projet google-services.json

dependencies {
compile 'com.android.support:support-v4:25.0.1'
**compile 'com.google.firebase:firebase-ads:9.0.2'**
compile files('libs/StartAppInApp-3.5.0.jar')
compile 'com.android.support:multidex:1.0.1'
  }
apply plugin: 'com.google.gms.google-services'
Muhammad Azeem
la source
pensez à ajouter des informations à votre réponse et ce code n'aidera personne
Ashu Kumar