Non hai trovato la classe "com.google.firebase.provider.FirebaseInitProvider"?


156

Ricevo l'eccezione di seguito all'avvio dell'app.

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) 

Ecco il build.gradle a livello di app

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'

Questo è il mio livello di applicazione build.gradle

// 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
}

Come risolvere il problema?



Avevo già provato tutte quelle risposte. niente funziona
WISHY

Sembra che ci sia un problema nel tuo manifest o google-services.json Assicurati che siano corretti. Puoi pubblicare il tuo file manifest?
Rushi M Thakker,

6
Hai fatto il cambiamento necessario per manifestare MultiDex: android:name="android.support.multidex.MultiDexApplication"? Se MultiDex è configurato correttamente vedrete messaggi logcat durante applicazione init come questo: I/MultiDex: install done.
Bob Snyder,

controlla abilitazione corsa istantanea se sì, disabilita corsa istantanea.
Prathap Badavath,

Risposte:


145

Ho avuto lo stesso errore e l'ho risolto con MultiDex, come descritto su questo link: https://developer.android.com/studio/build/multidex.html


A volte non è sufficiente abilitare MultiDex.

Se nel file DEX primario non viene fornita alcuna classe richiesta durante l'avvio , l'app si arresta in modo anomalo con l'errore java.lang.NoClassDefFoundError . https://developer.android.com/studio/build/multidex#keep

FirebaseInitProvider è richiesto durante l'avvio.

Quindi è necessario specificare manualmente FirebaseInitProvider come richiesto nel file DEX primario.

file build.gradle

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

multidex-config.txt (nella stessa directory del file build.gradle)

com/google/firebase/provider/FirebaseInitProvider.class

1
sei incredibile <3 grazie mille mi hai salvato la giornata <3
Mohamed Atef

24
Ehi questa eccezione: causato da: java.lang.ClassNotFoundException: non ho trovato la classe "com.google.firebase.provider.FirebaseInitProvider" non ha nulla a che fare con l'abilitazione di multidex, in effetti se vedi le domande build.gradle multiDexEnabled è abilitato!
Jorgesys,

3
No, questo errore proviene da Multidex, semplicemente non ha completato tutti i passaggi, poiché non puoi vedere il suo manifest o la sua classe principale.
AMAN77

3
Questo ha funzionato. Avevo abilitato il multidex nel mio file gradle, ma mancava la parte manifest di Android!
krikara,

3
Inoltre, assicurati che la tua Applicationclasse si estenda da MultiDexApplication(). Questo mancava nel mio caso.
Nelson Almendra,

86

Anch'io ho affrontato lo stesso problema e finalmente risolto disabilitandolo Instant Runin uno studio Android.

Impostazioni → Crea, Esecuzione, Distribuzione → Corsa istantanea e deseleziona Abilita corsa istantanea

Aggiornare:

Non è disponibile alcuna opzione di esecuzione istantanea nell'ultimo Android Studio 3.5+. Dovrebbe essere applicabile solo per le versioni precedenti.


8
Stessa cosa per me. Questa era la causa del problema, non multidex o nessuna delle altre risposte.
user3562927

3
Sembra che questo sia un problema con Android Studio 2.3. Disabilitare la corsa istantanea ha funzionato anche per me, ma questa non è la soluzione ideale :(
Tharaka Devinda,

1
Ho ereditato due progetti da un'altra azienda. Le configurazioni code base, manifest e gradle sono praticamente le stesse previste per un paio di elementi minori. Un progetto si sviluppa e funziona bene, l'altro no. Disattivato Instant Run e entrambi corrono ora. Strano. Questo sta usando Android Studio. 2.3.
joeblow23,

3
Ho riscontrato questo stesso problema con AS 3.1 e un emulatore con API 26. Prima non ho riscontrato alcun problema con le API 19-25. La disabilitazione della corsa istantanea infatti mi consente di eseguire l'app. Grazie.
Marcin Jedynak,

1
La disabilitazione di Instant Run non risolve questo problema per me.
Alyoshak,

49

Nel file build.gradle (Modulo: app), inserisci il codice seguente in defaultConfig:

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

e inserire nelle dipendenze:

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

Quindi aggiungi il codice per manifest:

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

1
Ci sto provando, se funzionerà, voterò e commenterò
Kamil Ibadov,

45

Ho avuto lo stesso problema nel mio (progetto giocatore di YouTube) ... e il seguente ha risolto il problema per me:

  1. Aggiungi questo codice nel tuo build.gradle(modulo: app) all'interno di defaultConfing:

    defaultConfig {
        ....
        ....
        multiDexEnabled = true
    }
    
  2. Aggiungi questo codice nel tuo build.gradle(modulo: app) all'interno di dependencies:

    dependencies {
        compile 'com.android.support:multidex:1.0.1'
        .....
        .....
    }
    
  3. Aperto AndroidManifest.xmle all'interno application:

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

    o se hai la tua classe App, estenderla da MultiDexApplication come:

    public class MyApp extends MultiDexApplication {
    .....
    

E infine, penso che dovresti avere Android Repository Support scaricato, negli Extra in SDK Manager .


1
Ho fatto "MultiDex.install (questo);" ma non ha funzionato. L'estensione della classe di applicazione con MultiDexApplication ha funzionato.
Più sicuro il

33

Sostituisci il seguente metodo nella tua classe di applicazione.

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 

    }
}

più uno per non android:name
innamorarsi

La risposta più semplice e migliore
kader kabore,

Se si utilizza una classe di applicazione personalizzata, questa è la risposta. Altre risposte non risolveranno il problema.
makkhay gurung

25

Quando l'app e le librerie a cui fa riferimento superano i 65.536 metodi, si verifica un errore di build che indica che l'app ha raggiunto il limite dell'architettura di build Android

Per evitare questa limitazione devi configurare la tua app per multidex

Se il vostro minSdkVersion è impostato su 21 o superiore, tutto quello che dovete fare è impostare multiDexEnabled su true nel file build.gradle a livello di modulo, come illustrato di seguito:

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

Altrimenti , se minSdkVersion è impostato su 20 o meno, è necessario utilizzare la libreria di supporto multidex come segue:

1. Modificare il file build.gradle a livello di modulo per abilitare multidex e aggiungere la libreria multidex come dipendenza, come mostrato qui:

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

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

2. A seconda che si ignori la classe Application, eseguire una delle seguenti operazioni:

  • Se non sovrascrivi la classe Application, modifica il file manifest per impostare android: nome nel tag come segue:

    <application
        android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
  • Altrimenti Se si sovrascrive la classe Application, modificarla per estendere MultiDexApplication (se possibile) come segue:

   public class MyApplication extends MultiDexApplication { ... }
  • Altrimenti si esegue l'override della classe Application ma non è possibile modificare la classe base, quindi è possibile sostituire il metodo attachBaseContext () e chiamare MultiDex.install (questo) per abilitare multidex:

   public class MyApplication extends SomeOtherApplication {
     @Override
     protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
     }
   }

Perché l'applicazione deve estendere MultiDexApplication?
Jason

1
MultiDexApplication è una classe di libreria di supporto. Implementa la classe Application e sovrascrive il nome di un metodo attachBaseContext per eseguire il lavoro per la registrazione MultiDex. Non è necessario estendere questa classe se si sovrascrive il metodo attachBaseContext.
Sokmean Pon

1
Questo è stato risolto per me nel 2019 con React Native ma mancano 2 importazioni in MainApplication.java: import android.content.Context;eimport android.support.multidex.MultiDex;
xaphod l'

1
la tua risposta mi ha aiutato a rendere compatibile la mia app.
Alok Vishwakarma,

18

L'abilitazione multidexnon è una buona soluzione perché multidexha un altro utilizzo in Android vedere questa risposta che è multidex

La soluzione sta disabilitando l'esecuzione istantanea come ha detto @Shylendra Madda

Impostazioni → Crea, Esecuzione, Distribuzione → Corsa istantanea e deseleziona Abilita corsa istantanea

Penso che il motivo di questo problema sia quando la funzione di esecuzione istantanea è abilitata, Android Studio non inserisce librerie come firebasein apk generato per ridurre i tempi di costruzione del progetto perché firebase librerie e altre librerie come mapse altre esistono nei servizi di riproduzione e i servizi di riproduzione sono installati sul dispositivo Android, quindi se abilitato per l'esecuzione istantanea non è necessario inserirli nell'apk generato per velocizzare i tempi di compilazione.

Quindi quando estrai apk e lo installi su un altro dispositivo vedrai questa eccezione


1
Questa è la soluzione perfetta
Ghanshyam Bagul,

La disabilitazione di Instant Run non risolve il problema per me.
Alyoshak,

In Android Studio 3.5.1, non esiste alcun elemento di esecuzione istantanea nella sezione Build, Execution, Deployment.
Vergiliy,

@Vergiliy Lo hanno sostituito con le modifiche applicate Vedi il post sul blog di rilascio android-developers.googleblog.com/2019/08/… per maggiori informazioni e la documentazione developer.android.com/studio/run#apply-changes per maggiori informazioni su applicare cambia
Edalat Feizi l'

14

Ho anche riscontrato lo stesso problema dopo aver provato tutte le soluzioni che ho trovato la soluzione di seguito.

Se hai applicato le regole proguard, aggiungi la riga sotto in ProGuard Rules

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

e risolve il mio problema.


@gunavant patel bro per favore dimmi come aggiungere in proguard per favore
Gowthaman M

1
@gunavant patel penso che questo risolverà il mio problema ... puoi per favore pubblicare un codice di esempio dove mantenere questa riga-keep class com.google.firebase.provider.FirebaseInitProvider
Gowthaman M

@GowthamanM Per prima cosa controlla di abilitare proguard nel file app / build.gradle. se abilitato, troverai il file proguard-rules in app / proguard-rules.pro in quel file aggiungi sopra la riga. Se non abiliti proguard, allora non ti aiuta.
Gunavant Patel,

buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }Come abilitare, per favore, dimmi signore
Gowthaman M,

se non hai abilitato proguard, il problema è diverso. ma ti mostro come abilitarlo. aggiungere "minifyEnabled true" nella versione o se si desidera abilitare il debug, aggiungere anche il tipo di debug.
Gunavant Patel,

8

1: vai al grado abilita multiDexEnabled e aggiungi la libreria multidex nelle dipendenze.

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

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

2: Vai al file Manifest e scrivi android: name = ". MyApplication" (Il nome della classe (MyApplication) è facoltativo, puoi scrivere quello che vuoi).

    <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: Come hai scritto android: name = ". MyApplication" Nel file Application at Manifest. ti darà un errore perché non hai creato la classe MyApplication. Crea classe MyApplication estenderlo per classe "applicazione" o semplicemente fai clic su. MyApplication, un piccolo palloncino rosso appare sul lato sinistro di una sintassi, fai clic su di esso, vedrai (crea classe MyApplication) nel menu, fai clic su di esso e Includi sotto Metodo All'interno di quella classe.

    public class MyApplication extends Application {

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

Se vuoi ottenere maggiori informazioni, fai clic su questo link: [ https://developer.android.com/studio/build/multidex.html]

Spero che funzioni per te.


7

Per prima cosa aggiungi quanto segue in build.gradle (Modulo: app) ---->

defaultConfig{
..
multiDexEnabled true
..
}

Quindi nello stesso file aggiungere quanto segue

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

Quindi in AndroidManifest.xml scrivi quanto segue

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

Questo è tutto. Funzionerà sicuramente


6

Se si utilizza MultiDex in App Gradle, quindi modifica estende l'applicazione per estendere MultiDexApplication nella classe dell'applicazione. Funzionerà in modo provocatorio


4

Ho avuto lo stesso problema e ho risolto solo l'aggiunta di un pezzo di codice , se stai riscontrando questo problema significa che hai già completato tutti i passaggi che devono utilizzare Firebase. Hai solo bisogno di creare una classe che estende l'applicazione (la classe pubblica Application_CrashReport estende l'applicazione) e aggiungere questa classe nel file mainifest e in quella classe basta sostituire il metodo seguente

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

e aggiungi MultiDex.install (questo); in quel metodo significa

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

Nota : - Non dimenticare di seguire i passaggi precedenti


2

Ciò è dovuto a MultiDex.

I passaggi per risolvere:

  1. In gradle-> dipendenze -> (compile'com.android.support: multidex: 1.0.1 ') Aggiungi questo in dipendenze

  2. Nella classe di applicazione del progetto estende MultiDexApplication in questo modo (la classe pubblica MyApplication estende MultiDexApplication)

  3. Esegui e controlla


2

È un po 'tardi per chi arriva, ma controlla le tue regole proguard! Ho perso molto tempo su questo. Le tue regole proguard potrebbero cambiare i nomi in importanti file firebase. Questo dimostra davvero solo un problema nella produzione e nella corsa istantanea :)

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.**

Questo ha funzionato, abilitando multidex non ha fatto altro che perdere tempo!
Magnus W,

2

Come accennato in precedenza, questo è un problema con multidex: è necessario aggiungere l'implementazione a build.gradlee MainApplication.java. Ma ciò che aggiungi dipende davvero dal fatto che supporti AndroidX o meno. Ecco cosa è necessario per risolvere questo problema:

  1. Se supporti AndroidX

Inserisci queste righe di codice nel tuo 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
  ...
}

Inserisci queste righe nel tuo 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. Se non supporti AndroidX

Inserisci queste righe di codice nel tuo 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
  ...
}

Inserisci queste righe nel tuo 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

1

È necessario estendere la classe di applicazione con MultiDexApplicationanziché Application.


0

Questo problema si è verificato quando sono passato ad Android Studio 3.4 con il plug-in Android Gradle 3.4.0. che funziona con il compilatore R8.

Il plug-in Android Gradle include file di regole ProGuard predefiniti aggiuntivi, ma si consiglia di utilizzare proguard-android-optimise.txt . Maggiori informazioni qui .

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'
    }
}

0

Stavo affrontando lo stesso problema e ho risolto questo problema modificando la versione di fireabseStorage la stessa della versione del database 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'

per

 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'

0

Se hai> 20 minsdkversion, devi usare l'ultima versione di Firebase Auth, ad es

implementazione "com.google.firebase: firebase-auth: 18.1.0"

e non è necessario configurare multi-dex se in realtà non ne hai bisogno.

Ho riscontrato questo problema quando ho usato 16.0.5 dall'helper Firebase ma sono stato in grado di risolverlo quando ho aggiornato a 18.1.0.



-6

aggiungi nel percorso root del progetto 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'

valuta la possibilità di aggiungere alcune informazioni alla tua risposta e questo codice non aiuterà nessuno
Ashu Kumar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.