Не удалось получить поставщика com.google.firebase.provider.FirebaseInitProvider
Я тестирую новый инструмент Crash: https://firebase.google.com/docs/crash/
После выполнения шагов приложение запускается и вылетает, говоря:
05-18 17:28:18.870 28743 28743 E AndroidRuntime: java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.IllegalStateException: Incorrect provider authority in manifest. Most likely due to a missing applicationId variable in application's build.gradle.
05-18 17:28:18.870 28743 28743 E AndroidRuntime: at android.app.ActivityThread.installProvider(ActivityThread.java:5156)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: at android.app.ActivityThread.installContentProviders(ActivityThread.java:4748)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4688)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: at android.app.ActivityThread.-wrap1(ActivityThread.java)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: at android.os.Looper.loop(Looper.java:148)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5417)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: Caused by: java.lang.IllegalStateException: Incorrect provider authority in manifest. Most likely due to a missing applicationId variable in application's build.gradle.
05-18 17:28:18.870 28743 28743 E AndroidRuntime: at com.google.firebase.provider.FirebaseInitProvider.zza(Unknown Source)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: at android.app.ActivityThread.installProvider(ActivityThread.java:5153)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: ... 10 more
21 ответ
1.
Добавьте applicationId в build.gradle приложения:
android {
...
defaultConfig {
applicationId "com.example.my.app"
...
}
}
И чем Чистый Проект -> Построить или Перестроить Проект
2. Если ваш minSdkVersion <= 20 ( https://developer.android.com/studio/build/multidex)
Используйте Multidex правильно.
build.gradle приложения
android {
...
defaultConfig {
....
multiDexEnabled true
}
...
}
dependencies {
implementation 'com.android.support:multidex:1.0.3'
...
}
manifest.xml
<application
...
android:name="android.support.multidex.MultiDexApplication" >
...
3.
Если вы используете пользовательский класс приложения
public class MyApplication extends MultiDexApplication {
@Override
protected void attachBaseContext(Context context) {
super.attachBaseContext(context);
MultiDex.install(this);
}
}
manifest.xml
<application
...
android:name="com.example.my.app.MyApplication" >
...
У меня была такая же проблема в устройствах с SDK < 22, но для меня причина в MultiDex, MultiDex.install
должен быть в attachBaseContext
метод.
Если вы используете MultiDex, попробуйте это:
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
}
}
Приложение /build.gradle:
android {
compileSdkVersion 24
buildToolsVersion "24.0.2"
defaultConfig {
applicationId "com.test.app"
minSdkVersion 16
targetSdkVersion 24
versionCode 1
versionName "1.0"
multiDexEnabled true
}
dexOptions {
javaMaxHeapSize "4g"
}
....
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:24.2.1'
...
compile 'com.google.firebase:firebase-messaging:9.6.1'
compile 'com.google.android.gms:play-services:9.6.1'
compile 'com.android.support:multidex:1.0.1'
}
...
Принятый ответ не решил мою проблему.
Если вы используете Multidex, ваше приложение должно расширяться MultiDexApplication
вместо Application
,
MyApplication.java
public class MyApplication extends MultiDexApplication{
...
}
AndroidManifest.xml
<application
android:name="your.package.name.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
...
/>
Надеюсь, поможет.
Если вы получаете ту же проблему, но уже есть applicationId
установить в build.gradle
Вы также можете попробовать следующее:
- в Android Studio:
Build
>Clean Project
- в других средах: очистить, восстановить, что угодно...
У меня была такая же проблема в устройствах Pre Lollipop. Чтобы решить это я сделал следующим образом. Тем временем я использовал multiDex в проекте.
1. добавьте это для build.gradle в модуль: app
multiDexEnabled = true
dexOptions {
javaMaxHeapSize "4g"
}
2. добавить эту зависимость
compile 'com.android.support:multidex:1.0.1'
3. Затем в главном приложении
public class MainApplication extends MultiDexApplication {
private static MainApplication mainApplication;
@Override
public void onCreate() {
super.onCreate();
mainApplication = this;
}
@Override
protected void attachBaseContext(Context context) {
super.attachBaseContext(context);
MultiDex.install(this);
}
public static synchronized MainApplication getInstance() {
return mainApplication;
}
}
4. В файле манифестов
<application
android:allowBackup="true"
android:name="android.support.multidex.MultiDexApplication"
Это работает для меня. Надеюсь, это поможет вам тоже:)
Ты должен быть уверен
добавить эту строку в свой манифест
https://developer.android.com/studio/run/index.html
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
Не включайте всю библиотеку сервисов воспроизведения, а используйте ту, которая вам нужна. Замените строку в вашем build.gradle:
compile 'com.google.android.gms:play-services:9.6.1'
с соответствующим из API Google Play Services, например:
compile 'com.google.android.gms:play-services-gcm:9.6.1'
Добавьте это в свой build.gradle уровня модуля:
android {
defaultConfig {
....
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
.........
}
Если вы переопределите Application
класс затем расширить его от MultiDexApplication
:
YourApplicationClass extends MultiDexApplication
Если вы не можете продлить его от MultiDexApplication
класс затем переопределить attachBaseContext()
метод следующим образом:
protected void attachBaseContext(Context base) {
super.attachBaseContext(context);
Multidex.install(this);
}
И ничего не запускай раньше MultiDex.install(this)
выполнен.
Если вы не переопределите Application
Класс просто отредактируйте ваш файл манифеста следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
.......>
<application
......
android:name="android.support.multidex.MultiDexApplication" >
...
</application>
......
</manifest>
Внести изменения, как это
В сборке (приложение)::
defaultConfig {
multiDexEnabled true
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
В манифесте::
<application
android:name=".BaseApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name">
В BaseApplication::
public class BaseApplication extends Application{
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
Это должно работать:
Шаг 1:
defaultConfig {
applicationId "service.ingreens.com.gpsautoon"
minSdkVersion 17
targetSdkVersion 25
versionCode 1
versionName "1.0"
multiDexEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
Шаг 2:
compile 'com.android.support:multidex:1.0.1'
Шаг 3: Пройди другой урок
public class MyApplication extends MultiDexApplication {
}
Шаг 4: Добавьте эту строку в манифест
<application
android:name="android.support.multidex.MultiDexApplication">
</application>
В моем случае проблема была решена добавлением этой строки в модуль build.gradle:
// ДОБАВЛЯЕМ ЭТО ВНУТРИ
apply plugin: 'com.google.gms.google-services'
Для реагирующего собственного приложения ошибка была java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider"
Это было только для устройств с версией Android <~ 4.4
Решил, просто заменив Application
в MainApplication.java
с MultiDexApplication
НОТА: import android.support.multidex.MultiDexApplication;
Если вы включите «multidex», проблема будет решена, но эта проблема связана с кешем студии Android. Так что перед добавлением "multidex" очистите кеш, надеюсь, проблема будет решена.
Удалить
.gradle
,
.idea
а также
.build
файл после этого очистите кеш.
Android studio
>
File
>
Invalidate Caches / Restart
В моем случае проблема возникла после того, как мы перешли на AndroidX. По какой-то причине приложение вызывало MultiDex.install() с отражением:
final Class<?> clazz = Class.forName("android.support.multidex.MultiDex");
final Method method = clazz.getDeclaredMethod("install", Context.class);
method.invoke(null, this);
Я сменил пакет с android.support.multidex.MultiDex
к androidx.multidex.MultiDex
. Это сработало.
В моем случае я забыл добавить (или случайно удалил) ядро firebase в build gradle
implementation 'com.google.firebase:firebase-core:xx.x.x'
Мой был, потому что Firebase SDK в файле Gradle был установлен с неверной версией номера.
Я удалил дабы Firebase из Gradle и заново установил их, используя Firebase Assistant
Я добавил следующий код в файл proguard.
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
и это сработало в моем случае.
У меня эта ошибка возникает только на устройствах с API ниже 21. В моем случае мне пришлось работать с проектом, в котором multiDexEnabled
вариант в build.gradle
уже был установлен на true
. Я проверил dex-файл из APK, и количество используемых методов было меньше 64 КБ, поэтому проект не обязательно должен быть мультидексным, поэтому я установилmultiDexEnabled
к false
. Это решение сработало для меня.
Перейти к настройке Android Studio (нажав Ctrl+Alt+S
в окнах), найдите Instant Run
и снимите флажок Enable Instant Run
,
Отключая Instant Run
и снова запустив ваше приложение, проблема будет решена.
У меня была такая же проблема, и она была исправлена с помощью Gradle версии 2.1.1 на уровне проекта.
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.1'
Вместо того, чтобы вручную добавлять имя пакета на build.gradle
, вы можете сделать это следующим образом:
сначала добавьте эту строку в начале
import java.util.regex.Pattern
Затем добавьте это в defaultConfig
android {
...
defaultConfig {
...
applicationId = doExtractStringFromManifest("package")
...
}
...
}
И, наконец, добавьте метод doExtractStringFromManifest
def doExtractStringFromManifest(name) {
def manifestFile = file(android.sourceSets.main.manifest.srcFile)
def pattern = Pattern.compile(name + "=\"(\\S+)\"")
def matcher = pattern.matcher(manifestFile.getText())
matcher.find()
return matcher.group(1)
}
Поскольку в ответе есть много комментариев Cordova, если вы работаете с Cordova, вам не следует редактировать build.gradle
сам, у него есть комментарий в начале, что сказать
// Генерируемый файл! НЕ ИЗМЕНЯТЬ!
Поэтому, если вы используете Cordova, лучшее, что вы можете сделать, - это обновить ее до Cordova-Android 5.1.0 или более поздней версии, где эти изменения уже присутствуют.