Podczas uruchamiania aplikacji pojawia się poniższy wyjątek.
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)
Oto build.gradle na poziomie aplikacji
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'
To jest build.gradle na poziomie mojej aplikacji
// 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
}
Jak rozwiązać ten problem?
android:name="android.support.multidex.MultiDexApplication"
? Jeśli MultiDex jest poprawnie skonfigurowany widać wiadomości logcat podczas aplikacji Init jak ten:I/MultiDex: install done
.Odpowiedzi:
Miałem ten sam błąd i rozwiązałem go z MultiDexem, jak opisano pod tym linkiem: https://developer.android.com/studio/build/multidex.html
Czasami samo włączenie funkcji MultiDex nie wystarczy.
Podczas uruchamiania wymagany jest FirebaseInitProvider .
Musisz więc ręcznie określić FirebaseInitProvider zgodnie z wymaganiami w głównym pliku DEX.
plik build.gradle
multidex-config.txt (w tym samym katalogu, co plik build.gradle)
źródło
Application
klasa rozciąga się odMultiDexApplication()
. Tego brakowało w moim przypadku.Ja też stanąłem przed tym samym problemem i ostatecznie rozwiązałem go, wyłączając
Instant Run
w Android Studio.Aktualizacja:
W najnowszym Android Studio 3.5+ nie ma opcji natychmiastowego uruchamiania. Powinien mieć zastosowanie tylko do starszych wersji.
źródło
W pliku build.gradle (Module: app) wstaw poniższy kod do defaultConfig:
i wstaw do zależności:
Następnie dodaj kod do manifestu:
źródło
Miałem ten sam problem w moim (projekcie odtwarzacza YouTube) ... a poniższe rozwiązały problem za mnie:
Dodaj ten kod do swojego
build.gradle
(module: app) wewnątrzdefaultConfing
:Dodaj ten kod do swojego
build.gradle
(module: app) wewnątrzdependencies
:Otwarte
AndroidManifest.xml
i wewnątrzapplication
:lub jeśli masz klasę aplikacji, rozszerz ją z MultiDexApplication na przykład:
I wreszcie, myślę, że powinieneś pobrać repozytorium pomocy technicznej Androida , w dodatkach w Menedżerze SDK .
źródło
Po prostu zastąp następującą metodę w klasie aplikacji.
źródło
android:name
Jeśli twoja minSdkVersion jest ustawiona na 21 lub wyższą, wszystko, co musisz zrobić, to ustawić multiDexEnabled na true w pliku build.gradle na poziomie modułu, jak pokazano poniżej:
W przeciwnym razie, jeśli twoja minSdkVersion jest ustawiona na 20 lub mniej, musisz użyć biblioteki obsługującej multidex w następujący sposób:
źródło
import android.content.Context;
aimport android.support.multidex.MultiDex;
Włączanie
multidex
nie jest dobrym rozwiązaniem, ponieważmultidex
inne użycie w Androidzie, zobacz odpowiedź, co to jest multidexRozwiązaniem jest wyłączenie natychmiastowego uruchamiania, jak powiedział @Shylendra Madda
Myślę, że przyczyną tego problemu jest włączenie funkcji natychmiastowego uruchamiania, a Android Studio nie umieszcza bibliotek, takich jak
firebase
w wygenerowanym apku, aby skrócić czas tworzenia projektu, ponieważfirebase
biblioteka i inne biblioteki, takie jakmaps
i inne, istnieją w usługach odtwarzania i są zainstalowane. na urządzeniu z Androidem, więc jeśli funkcja natychmiastowego uruchamiania jest włączona, nie trzeba umieszczać ich w wygenerowanym apk, aby przyspieszyć czas kompilacji.Więc po wypakowaniu apk i zainstalowaniu go na innym urządzeniu zobaczysz ten wyjątek
źródło
Mam również ten sam problem po wypróbowaniu wszystkich rozwiązań, które znalazłem poniżej.
Jeśli zastosowałeś reguły proguard, dodaj poniższy wiersz do reguł ProGuard
i rozwiązuje mój problem.
źródło
-keep class com.google.firebase.provider.FirebaseInitProvider
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
Jak włączyć, powiedz mi proszę pana1: Idź do gradle włącz multiDexEnabled i dodaj bibliotekę multidex w zależnościach.
2: Przejdź do pliku manifestu i napisz android: name = ". MyApplication" (nazwa klasy (MyApplication) jest opcjonalna, możesz napisać, co chcesz).
3: Jak napisałeś android: name = ". MyApplication" Wewnątrz aplikacji w pliku manifestu. spowoduje to błąd, ponieważ nie utworzyłeś klasy MyApplication. Utwórz klasę MyApplication rozszerz ją o klasę „application” lub po prostu kliknij. MyApplication, mały czerwony dymek pojawi się po lewej stronie składni kliknij na nią, zobaczysz (utwórz klasę MyApplication) w menu, kliknij na nią i Uwzględnij poniżej Metoda Wewnątrz tej klasy.
Jeśli chcesz uzyskać więcej informacji, kliknij ten link: [ https://developer.android.com/studio/build/multidex.html]
Miejmy nadzieję, że to działa dla Ciebie.
źródło
Najpierw dodaj następujące elementy do build.gradle (Module: app) ---->
Następnie w tym samym pliku dodaj następujące elementy
Następnie w AndroidManifest.xml napisz co następuje
Otóż to. To na pewno zadziała
źródło
Jeśli używasz MultiDex w aplikacji Gradle, zmiana rozszerza aplikację o rozszerzenie MultiDexApplication w klasie aplikacji. To zadziała wyzywająco
źródło
Miałem ten sam problem i rozwiązałem po prostu dodaj fragment kodu.Jeśli otrzymujesz ten problem, oznacza to, że wykonałeś już wszystkie kroki, które wymagają użycia Firebase. Wystarczy utworzyć klasę rozszerzającą Application (publiczna klasa Application_CrashReport rozszerza Application) i dodać tę klasę do pliku mainifest iw tej klasie po prostu przesłonić poniższą metodę
i dodaj MultiDex.install (this); w tej metodzie oznacza
Uwaga : - Nie zapomnij wykonać powyższych czynności
źródło
Wynika to z MultiDex.
Kroki do rozwiązania:
W gradle-> dependencies -> (compile'com.android.support: multidex: 1.0.1 ') Dodaj to w zależnościach
W twoim projekcie klasa aplikacji rozszerza MultiDexApplication w ten sposób (publiczna klasa MyApplication rozszerza MultiDexApplication)
Uruchom i sprawdź
źródło
To trochę za późno dla tych, którzy przychodzą, ale sprawdź swoje zasady proguard! Zmarnowałem na to dużo czasu. Twoje reguły proguard mogą zmieniać nazwy na ważne pliki Firebase. To naprawdę tylko udowadnia problem w produkcji i natychmiastowym uruchomieniu :)
proguard-rules.pro
źródło
Jak wspomniano wcześniej, jest to problem z
multidex
: powinieneś dodać implementację do swojegobuild.gradle
iMainApplication.java
. Ale to, co dodasz, naprawdę zależy od tego, czy obsługujesz AndroidX, czy nie. Oto, czego potrzebujesz, aby rozwiązać ten problem:Umieść te linie kodu w swoim
build.gradle
(android / app / build.gradle):Umieść te wiersze w swoim
MainApplication.java
(android / app / src / main / java /.../ MainApplication.java):Umieść te linie kodu w swoim
build.gradle
(android / app / build.gradle):Umieść te wiersze w swoim
MainApplication.java
(android / app / src / main / java /.../ MainApplication.java):źródło
Powinieneś rozszerzyć swoją klasę Application o
MultiDexApplication
zamiastApplication
.źródło
Ten problem wystąpił, gdy przełączyłem się na Android Studio 3.4 z wtyczką Android Gradle 3.4.0. który działa z kompilatorem R8.
Wtyczka Android Gradle zawiera dodatkowe predefiniowane pliki reguł ProGuard, ale zaleca się użycie proguard-android-optimize.txt . Więcej informacji tutaj .
źródło
Miałem ten sam problem i rozwiązałem go, zmieniając wersję FireabseStorage na taką samą, jak wersja bazy danych Firebase
do
źródło
Jeśli masz> 20 minsdkversion, musisz użyć najnowszej wersji Firebase Auth, tj
i nie ma potrzeby konfigurowania funkcji multi-dex, jeśli w rzeczywistości jej nie potrzebujesz.
Napotkałem ten problem, gdy korzystałem z 16.0.5 z pomocnika Firebase, ale udało mi się go naprawić po aktualizacji do 18.1.0.
źródło
Jeśli korzystasz z platformy Xamarin.Forms, możesz sprawdzić, czy nie znalazłeś klasy „com.google.firebase.provider.FirebaseInitProvider”? ponieważ pozwala to uchwycić problem z błędem dex w Google Firebase podczas uruchamiania (obecnie nierozwiązany).
Wróciłem do krótkotrwałego stosowania kurczenia się i planuję używać ProGuard, dopóki R8 nie będzie bardziej stabilny.
źródło
dodaj ścieżkę główną projektu google-services.json
źródło