Не удалось получить поставщика 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 или более поздней версии, где эти изменения уже присутствуют.

Другие вопросы по тегам