android - studio - ¿No encontró la clase "com.google.firebase.provider.FirebaseInitProvider"?
guardar datos en firebase android (19)
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
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 } ... }
Sin embargo , 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>
- Si anula la clase de aplicación, cámbiela para extender MultiDexApplication (si es posible) de la siguiente manera:
public class MyApplication extends MultiDexApplication { ... }
- O si anula la clase de aplicación pero no es posible cambiar la clase base, 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); } }
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?
Debe ampliar su clase de Aplicación con
MultiDexApplication
lugar de
Application
.
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:
compile ''com.android.support:multidex:1.0.1''
Luego agregue código para manifestar:
<application
android:name="android.support.multidex.MultiDexApplication"
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''
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 here .
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''
}
}
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.**
Esto se debe a MultiDex.
Pasos para resolver:
-
En gradle-> dependencias -> (compile''com.android.support: multidex: 1.0.1 '') Agregue esto en dependencias
-
En su proyecto, la clase de aplicación extiende MultiDexApplication de esta manera (la clase pública MyApplication extiende MultiDexApplication)
-
Corre y comprueba
Habilitar
multidex
no es una buena solución porque
multidex
tiene 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
firebase
en apk generado para disminuir el tiempo de construcción del proyecto porque
firebase
biblioteca
firebase
y otras bibliotecas como
maps
y
others
en servicios de juego y play Los servicios se instalan en el dispositivo Android, por lo que si la ejecución instantánea está habilitada, no es necesario que los coloque 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
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á
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á
Si tiene> 20 minutos de versión, debe 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.
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
}
}
También me he enfrentado al mismo problema después de probar todas las soluciones, encontré la siguiente solució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
Tuve el mismo error y lo resolví con MultiDex, como se describe en este enlace: https://developer.android.com/studio/build/multidex.html https://developer.android.com/studio/build/multidex.html
A veces no es suficiente solo 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
Tuve el mismo problema en mi (proyecto de reproductor de YouTube) ... y lo siguiente me resolvió el problema:
-
Agregue este código a su
build.gradle
(módulo: aplicación) dentro dedefaultConfing
:defaultConfig { .... .... multiDexEnabled = true }
-
Agregue este código a su
build.gradle
(módulo: aplicación) dentro de lasdependencies
:dependencies { compile ''com.android.support:multidex:1.0.1'' ..... ..... }
-
Abra
AndroidManifest.xml
y dentro de laapplication
:<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 .
Yo también enfrenté el mismo problema y finalmente lo resolví deshabilitando
Instant Run
en el estudio de Android.
Configuración → Compilación, ejecución, implementación → Ejecución instantánea y desmarque Habilitar ejecución instantánea
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''
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.
Tuve el mismo problema y lo resolví solo agregue un fragmento de código . Si tiene este problema, significa que ya completó todos los pasos que necesita para 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