¿No encontró la clase "com.google.firebase.provider.FirebaseInitProvider"?

156

Recibo la siguiente excepción al iniciar la aplicación.

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) 

Aquí está el nivel de aplicación build.gradle

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'

Este es mi nivel de aplicación 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
}

¿Cómo resolver el problema?

DESEADO
fuente
Posible duplicado de stackoverflow.com/questions/37312103/…
Jay Rathod RJ
Ya había probado todas esas respuestas. nada funciona
WISHY
Parece que hay un problema en su manifiesto o en google-services.json Asegúrese de que sean correctos. ¿Puedes publicar tu archivo de manifiesto?
Rushi M Thakker
66
¿Hiciste el cambio de manifiesto necesario para MultiDex android:name="android.support.multidex.MultiDexApplication":? Si MultiDex está configurado correctamente verá mensajes LogCat durante la aplicación init como éste: I/MultiDex: install done.
Bob Snyder
compruebe la ejecución instantánea habilite si es así, deshabilite la ejecución instantánea.
Prathap Badavath

Respuestas:

145

Tuve el mismo error y lo resolví con MultiDex, como se describe en este enlace: https://developer.android.com/studio/build/multidex.html


A veces no es suficiente habilitar MultiDex.

Si alguna clase que se requiere durante el inicio no se proporciona en el archivo DEX primario , entonces su aplicación se bloquea con el error java.lang.NoClassDefFoundError . https://developer.android.com/studio/build/multidex#keep

Se requiere FirebaseInitProvider durante el inicio.

Por lo tanto, debe especificar manualmente FirebaseInitProvider como se requiere en el archivo DEX primario.

archivo build.gradle

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

multidex-config.txt (en el mismo directorio que el archivo build.gradle)

com/google/firebase/provider/FirebaseInitProvider.class
johanvs
fuente
1
eres increíble <3 muchas gracias me salvaste el día <3
Mohamed Atef
24
Hola, esta excepción: causada por: java.lang.ClassNotFoundException: no se encontró la clase "com.google.firebase.provider.FirebaseInitProvider" no tiene nada que ver con habilitar multidex, de hecho, si ve las preguntas build.gradle multiDexEnabled está habilitado!
Jorgesys
3
No, este error es de multidex, simplemente no completó todos los pasos, ya que no puede ver su manifiesto o su clase principal.
AMAN77
3
Esto funcionó. Tenía habilitado multidex en mi archivo gradle, ¡pero me faltaba la parte del Manifiesto de Android!
krikara
3
Además, asegúrese de que su Applicationclase se extienda desde MultiDexApplication(). Esto faltaba en mi caso.
Nelson Almendra
86

Yo también enfrenté el mismo problema y finalmente lo resolví deshabilitando Instant Runen un estudio de Android.

Configuración → Compilación, ejecución, implementación → Ejecución instantánea y desmarque Habilitar ejecución instantánea

Actualizar:

No hay una opción de Ejecución instantánea disponible en la última versión de Android Studio 3.5+. Debería ser aplicable solo para versiones anteriores.

Shylendra Madda
fuente
8
Lo mismo para mi. Esta fue la causa del problema, no multidex ni ninguna de las otras respuestas.
user3562927
3
Parece que este es un problema con Android Studio 2.3. Desactivar la ejecución instantánea también funcionó para mí, pero esta no es la solución ideal :(
Tharaka Devinda
1
Heredé dos proyectos de otra empresa. Las configuraciones de código base, manifiesto y gradle son prácticamente las mismas que se esperan para un par de elementos menores. Un proyecto se construye y funciona bien, el otro no. Apagó Instant Run y ​​ambos corren ahora. Extraño. Esto está usando Android Studio. 2.3.
joeblow23
3
Enfrenté este mismo problema con AS 3.1 y un emulador que ejecuta API 26. Antes no había encontrado ningún problema con las API 19-25. La desactivación de la ejecución instantánea me permite ejecutar la aplicación. Gracias.
Marcin Jedynak
1
Deshabilitar Instant Run no me resuelve este problema.
Alyoshak
49

En el archivo build.gradle (Módulo: aplicación), inserte el siguiente código en defaultConfig:

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

e insertar en dependencias:

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

Luego agregue código para manifestar:

<application 
    android:name="android.support.multidex.MultiDexApplication"
CodeArt
fuente
1
Lo estoy intentando, si funciona funcionaré, votaré y comentaré
Kamil Ibadov
45

Tuve el mismo problema en mi (proyecto de reproductor de YouTube) ... y lo siguiente me resolvió el problema:

  1. Agregue este código en su build.gradle(módulo: aplicación) dentro de defaultConfing:

    defaultConfig {
        ....
        ....
        multiDexEnabled = true
    }
  2. Agregue este código en su build.gradle(módulo: aplicación) dentro de dependencies:

    dependencies {
        compile 'com.android.support:multidex:1.0.1'
        .....
        .....
    }
  3. Abierto AndroidManifest.xmly dentro de application:

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

    o si tiene su clase de aplicación, extiéndala desde MultiDexApplication como:

    public class MyApp extends MultiDexApplication {
    .....

Y finalmente, creo que debería descargar el repositorio de soporte de Android , en Extras en SDK Manager .

Firas Hashash
fuente
1
Hice "MultiDex.install (this);" Pero no funcionó. La extensión de la clase de aplicación con MultiDexApplication hizo el truco.
seguro el
33

Simplemente anule el siguiente método en su clase de aplicación.

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
fuente
más uno por no enamorarse android:namedel Manifiesto
Chisko
La respuesta más simple y mejor
kader kabore
Si está utilizando una clase de aplicación personalizada, esta es la respuesta. Otras respuestas no solucionarán el problema.
makkhay gurung
25

Cuando su aplicación y las bibliotecas a las que hace referencia superan los 65.536 métodos, se encuentra con un error de compilación que indica que su aplicación ha alcanzado el límite de la arquitectura de compilación de Android

Para evitar esta limitación, debe configurar su aplicación para multidex

Si su minSdkVersion está configurado en 21 o superior, todo lo que necesita hacer es configurar multiDexEnabled en verdadero en su archivo build.gradle de nivel de módulo, como se muestra aquí:

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

De lo contrario , si su minSdkVersion está configurado en 20 o menos, entonces debe usar la biblioteca de soporte multidex de la siguiente manera:

1. Modifique el archivo build.gradle a nivel de módulo para habilitar multidex y agregue la biblioteca multidex como una dependencia, como se muestra aquí:

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

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

2. Dependiendo de si anula la clase de aplicación, realice una de las siguientes acciones:

  • Si no anula la clase de aplicación, edite su archivo de manifiesto para configurar android: name en la etiqueta de la siguiente manera:

    <application
        android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
  • De lo contrario, si anula la clase de aplicación, cámbiela para extender MultiDexApplication (si es posible) de la siguiente manera:

   public class MyApplication extends MultiDexApplication { ... }
  • De lo contrario , anula la clase de aplicación, pero no es posible cambiar la clase base, luego puede anular el método attachBaseContext () y llamar a MultiDex.install (this) para habilitar multidex:

   public class MyApplication extends SomeOtherApplication {
     @Override
     protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
     }
   }
Sokmean Pon
fuente
¿Por qué la aplicación necesita extender MultiDexApplication?
Jason
1
MultiDexApplication es una clase de biblioteca de soporte. Implementa la clase de aplicación y anula el nombre de un método attachBaseContext para hacer el trabajo para el registro de MultiDex. No necesita extender esta clase si anula el método attachBaseContext.
Sokmean Pon
1
Esto me lo arregló en 2019 con React Native, pero faltan 2 importaciones en MainApplication.java: import android.content.Context;yimport android.support.multidex.MultiDex;
xaphod
1
Su respuesta me ayudó a hacer que mi aplicación volviera a ser compatible.
Alok Vishwakarma
18

La habilitación multidexno es una buena solución porque, para multidextener otro uso en Android, vea esta respuesta ¿Qué es multidex?

La solución es deshabilitar la ejecución instantánea como dijo @Shylendra Madda

Configuración → Compilación, ejecución, implementación → Ejecución instantánea y desmarque Habilitar ejecución instantánea

Creo que la razón de este problema es que cuando la ejecución instantánea está habilitada, Android Studio no coloca bibliotecas como firebaseen el apk generado para disminuir el tiempo de construcción del proyecto porque la firebase biblioteca y otras bibliotecas como mapsy otras existen en los servicios de reproducción y los servicios de reproducción están instalados en el dispositivo Android, por lo que si la ejecución instantánea está habilitada, no es necesario ponerlos en el apk generado para acelerar el tiempo de compilación.

Entonces, cuando extraigas apk e lo instales en otro dispositivo, verás esta excepción

Edalat Feizi
fuente
1
Esta es la solución perfecta
Ghanshyam Bagul
Desactivar Instant Run no me resuelve el problema.
Alyoshak
En Android Studio 3.5.1, no hay ningún elemento de Ejecución instantánea en la sección Compilación, Ejecución, Implementación.
Vergiliy
@Vergiliy Lo reemplazaron con aplicar cambios. Consulte la publicación del blog de lanzamiento android-developers.googleblog.com/2019/08/… para obtener más información y los documentos developer.android.com/studio/run#apply-changes para obtener más información sobre aplicar cambios
Edalat Feizi
14

También me he enfrentado al mismo problema después de probar todas las soluciones, encontré la solución a continuación.

Si ha aplicado reglas de protección, agregue la línea siguiente en Reglas de ProGuard

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

y resuelve mi problema

Patel Gunavant
fuente
@gunavant patel bro por favor dime cómo agregar a proguard por favor
Gowthaman M
1
@gunavant patel, creo que esto resolverá mi problema ... ¿pueden publicar un código de muestra donde guardar esta línea?-keep class com.google.firebase.provider.FirebaseInitProvider
Gowthaman M
@GowthamanM Primero verifique que habilite proguard en el archivo app / build.gradle. si está habilitado, encontrará el archivo proguard-rules en app / proguard-rules.pro en ese archivo, agregue la línea anterior. Si no habilitas proguard, entonces no te ayudará.
Gunavant Patel
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }Cómo habilitarlo, por favor dígame señor
Gowthaman M
Si no ha habilitado Proguard, entonces el problema es diferente. pero te muestro cómo habilitar eso. agregue "minifyEnabled true" en la versión o si desea habilitar la depuración, también agregue el tipo de depuración.
Gunavant Patel
8

1: Vaya al gradle enable multiDexEnabled y agregue la biblioteca multidex en las dependencias.

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

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

2: Vaya al archivo de manifiesto y escriba android: name = ". MyApplication" (El nombre de la clase (MyApplication) es opcional; puede escribir lo que quiera).

    <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: Como escribió android: name = ". MyApplication" Aplicación interna en el archivo de manifiesto. le dará un error porque no creó la clase MyApplication. Crear clase MyApplication extiéndalo por clase de "aplicación" o simplemente haga clic en. MyApplication, aparecerá un pequeño globo rojo en el lado izquierdo de una sintaxis, haga clic en él, verá (crear clase MyApplication) en el menú, haga clic en él e incluya debajo Método dentro de esa clase.

    public class MyApplication extends Application {

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

Si desea obtener más información, haga clic en este enlace: [ https://developer.android.com/studio/build/multidex.html]

Esperemos que funcione para usted.

Shahzad Afridi
fuente
7

Primero agregue lo siguiente en build.gradle (Módulo: aplicación) ---->

defaultConfig{
..
multiDexEnabled true
..
}

Luego, en el mismo archivo, agregue lo siguiente

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

Luego, en AndroidManifest.xml escriba lo siguiente

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

Eso es. Definitivamente funcionará

Hirak JD
fuente
6

Si está utilizando MultiDex en su aplicación Gradle, entonces el cambio extiende la aplicación para extender MultiDexApplication en su clase de aplicación. Definitivamente funcionará

Suresh Kumar
fuente
4

Tuve el mismo problema y lo resolví solo agregue un fragmento de código . Si obtiene este problema, significa que ya ha completado todos los pasos que deben usar Firebase. Solo necesita crear una clase que extienda la aplicación (clase pública Application_CrashReport extiende la aplicación) y agregar esta clase en el archivo mainifest y en esa clase simplemente anule el método a continuación

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

y agregue MultiDex.install (esto); en ese método significa

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

Nota : - No olvides seguir los pasos anteriores

Peter
fuente
2

Esto se debe a MultiDex.

Pasos para resolver:

  1. En gradle-> dependencias -> (compile'com.android.support: multidex: 1.0.1 ') Agregue esto en dependencias

  2. En su proyecto, la clase de aplicación extiende MultiDexApplication de esta manera (la clase pública MyApplication extiende MultiDexApplication)

  3. Corre y comprueba

Sukhdeep Saini
fuente
2

Esto es un poco tarde para los que vienen, ¡pero revisa tus reglas de protección! Perdí mucho tiempo en esto. Sus reglas de protección podrían estar cambiando los nombres a archivos importantes de Firebase. Esto realmente solo demuestra un problema en la producción y la ejecución instantánea :)

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
fuente
Esto hizo el truco, ¡habilitar multidex no hizo más que perder el tiempo!
Magnus W
2

Como se mencionó anteriormente, este es un problema con multidex: debe agregar implementación a su build.gradley MainApplication.java. Pero lo que agrega realmente depende de si es compatible con AndroidX o no. Esto es lo que necesita para resolver este problema:

  1. Si es compatible con AndroidX

Ponga estas líneas de código en su 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
  ...
}

Ponga estas líneas en su 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 no es compatible con AndroidX

Ponga estas líneas de código en su 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
  ...
}

Ponga estas líneas en su 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
fuente
1

Debe ampliar su clase de aplicación con en MultiDexApplicationlugar de Application.

Ali Akram
fuente
0

Este problema ocurrió cuando cambié a Android Studio 3.4 con el complemento Android Gradle 3.4.0. que funciona con el compilador R8.

El complemento Android Gradle incluye archivos de reglas de ProGuard predefinidos adicionales, pero se recomienda que use proguard-android-optimizar.txt . Más información aquí .

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
fuente
0

Estaba enfrentando el mismo problema y resolví este problema cambiando la versión de fireabseStorage igual que la versión de la base de datos 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'

a

 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
fuente
0

Si tiene> 20 minutos de versión, necesita usar la última versión de Firebase Auth, es decir

implementación 'com.google.firebase: firebase-auth: 18.1.0'

y no es necesario configurar multi-dex si realmente no lo necesita.

Encontré este problema cuando utilicé 16.0.5 del ayudante de Firebase pero pude solucionarlo cuando actualicé a 18.1.0.

Flecha de Plata
fuente
-6

agregar en la ruta raíz del proyecto 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
fuente
considere agregar alguna información a su respuesta y este código no ayudará a nadie
Ashu Kumar