Не нашли класс «com.google.firebase.provider.FirebaseInitProvider»?

156

Я получаю следующее исключение при запуске приложения.

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) 

Вот уровень приложения 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'

Это мой уровень приложения 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
}

Как решить проблему?

Wishy
источник
Возможный дубликат stackoverflow.com/questions/37312103/…
Джей Rathod RJ
Я уже попробовал все эти ответы. ничего не получается
желаю
Кажется, в вашем манифесте или в google-services есть проблема. Убедитесь, что они верны. Можете ли вы опубликовать свой файл манифеста?
Rushi M Thakker
6
Делали ли вы манифест изменения , необходимое для MultiDex: android:name="android.support.multidex.MultiDexApplication"? Если MultiDex настроен правильно , вы увидите LogCat сообщения во время приложения INIT , как это: I/MultiDex: install done.
Боб Снайдер
проверьте включение мгновенного запуска, если да, отключите мгновенный запуск.
Пратхап Бадават

Ответы:

145

У меня была та же ошибка, и я решил ее с помощью MultiDex, как описано по этой ссылке: https://developer.android.com/studio/build/multidex.html


Иногда недостаточно просто включить MultiDex.

Если какой-либо класс, который требуется при запуске , не указан в основном файле DEX , то ваше приложение вылетает с ошибкой java.lang.NoClassDefFoundError . https://developer.android.com/studio/build/multidex#keep

FirebaseInitProvider требуется во время запуска.

Поэтому вы должны вручную указать FirebaseInitProvider, как это требуется в основном DEX-файле.

файл build.gradle

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

multidex-config.txt (в том же каталоге, что и файл build.gradle)

com/google/firebase/provider/FirebaseInitProvider.class
johanvs
источник
1
Вы удивительны <3, спасибо, что спасли мой день <3
Мохамед Атеф,
24
Эй, это исключение: вызвано: java.lang.ClassNotFoundException: не найден
Jorgesys
3
Нет, это ошибка мультидекса, он просто не выполнил все шаги, так как вы не видите его манифест или его основной класс.
AMAN77
3
Это сработало. Я включил мультидекс в своем файле Gradle, но мне не хватало части Android Manifest!
Крикара
3
Кроме того, убедитесь, что ваш Applicationкласс начинается с MultiDexApplication(). Это отсутствовало в моем случае.
Нельсон Альмендра
86

Я тоже столкнулся с той же проблемой и, наконец, решил ее, отключив Instant Runв андроид студии.

Настройки → Построение, выполнение, развертывание → Мгновенный запуск и снимите флажок Включить мгновенный запуск

Обновить:

В последней версии Android Studio 3.5+ нет функции мгновенного запуска. Это должно быть применимо только для более старых версий.

Шилендра Мадда
источник
8
Мне то же. Это было причиной проблемы - не мультидекс или любой другой ответ.
user3562927
3
Кажется, это проблема с Android Studio 2.3. Отключение мгновенного запуска тоже
помогло
1
Я унаследовал два проекта от другой фирмы. Конфигурации базового кода, манифеста и Gradle практически одинаковы для пары второстепенных элементов. Один проект собирается и работает нормально, другой - нет. Выключил Instant Run, и теперь они оба бегут. Странный. Это с помощью Android Studio. 2,3.
joeblow23
3
Я столкнулся с той же самой проблемой с AS 3.1 и эмулятором, работающим с API 26. Раньше я не сталкивался с какими-либо проблемами с API 19-25. Отключение мгновенного запуска действительно позволило мне запустить приложение. Спасибо.
Марчин Джедынак
1
Отключение Instant Run не решает эту проблему для меня.
Алешак
49

В файле build.gradle (Module: app) вставьте приведенный ниже код в defaultConfig:

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

и вставить в зависимости:

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

Затем добавьте код в манифест:

<application 
    android:name="android.support.multidex.MultiDexApplication"
CodeArt
источник
1
Я пытаюсь, если это сработает, я проголосую и прокомментирую
Камиль Ибадов
45

У меня была такая же проблема в моем (проект плеера YouTube) ... и эта проблема решила для меня:

  1. Добавьте этот код в ваш build.gradle(module: app) внутри defaultConfing:

    defaultConfig {
        ....
        ....
        multiDexEnabled = true
    }
  2. Добавьте этот код в ваш build.gradle(module: app) внутри dependencies:

    dependencies {
        compile 'com.android.support:multidex:1.0.1'
        .....
        .....
    }
  3. Открыто AndroidManifest.xmlи внутри application:

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

    или, если у вас есть класс App, расширьте его из MultiDexApplication, например:

    public class MyApp extends MultiDexApplication {
    .....

И, наконец, я думаю, что вы должны загрузить репозиторий поддержки Android в Extras in SDK Manager .

Firas Hashash
источник
1
Я сделал "MultiDex.install (это);" но это не сработало. Расширение класса приложения с помощью MultiDexApplication сделало свое дело.
Safeer
33

Просто переопределите следующий метод в своем классе приложения.

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
источник
плюс один для не падает на android:nameматериал в манифесте
Chisko
Самый простой и лучший ответ
Кадер Каборе
Если вы используете пользовательский класс Application, то это ответ. Другие ответы не решат проблему.
Макхай Гурунг
25

Когда ваше приложение и библиотеки, на которые оно ссылается, превышают 65 536 методов, вы сталкиваетесь с ошибкой сборки, которая указывает, что ваше приложение достигло предела архитектуры сборки Android

Чтобы избежать этого ограничения, вы должны настроить приложение для мультидекс

Если ваш minSdkVersion установлен на 21 или выше, все, что вам нужно сделать, это установить для multiDexEnabled значение true в файле build.gradle уровня модуля, как показано здесь:

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

Иначе , если ваш minSdkVersion установлен на 20 или ниже, то вы должны использовать multidex библиотеку поддержки следующим образом :

1. Модифицируйте файл build.gradle уровня модуля, чтобы включить multidex и добавить мультидексную библиотеку в качестве зависимости, как показано здесь:

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

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

2. В зависимости от того, переопределяете ли вы класс Application, выполните одно из следующих действий:

  • Если вы не переопределяете класс Application, отредактируйте файл манифеста, указав в теге android: name следующее:

    <application
        android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
  • Остальное если вы переопределяете класс Application, измените его на расширение MultiDexApplication (если возможно) следующим образом:

   public class MyApplication extends MultiDexApplication { ... }
  • В противном случае вы переопределяете класс Application, но изменить базовый класс невозможно, тогда вместо этого вы можете переопределить метод attachBaseContext () и вызвать MultiDex.install (this), чтобы включить multidex:

   public class MyApplication extends SomeOtherApplication {
     @Override
     protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
     }
   }
Сокмеан Пон
источник
Почему приложение должно расширять MultiDexApplication?
Джейсон
1
MultiDexApplication является вспомогательным библиотечным классом. Он реализует класс Application и переопределяет имя метода attachBaseContext, чтобы выполнить работу для регистрации MultiDex. Вам не нужно расширять этот класс, если вы переопределяете метод attachBaseContext.
Сокмеан Пон
1
Это было исправлено для меня в 2019 году с помощью React Native, но в MainApplication.java пропущено 2 импорта: import android.content.Context;иimport android.support.multidex.MultiDex;
xaphod
1
Ваш ответ помог мне сделать приложение обратно совместимым.
Алок Вишвакарма
18

Включение multidexне является хорошим решением, потому что multidexесть другое использование в Android увидеть этот ответ, что такое мультидекс

Решение - отключить мгновенный запуск, как сказала @Shylendra Madda.

Настройки → Построение, выполнение, развертывание → Мгновенный запуск и снимите флажок Включить мгновенный запуск

Я думаю, что причина этой проблемы в том, что когда включен мгновенный запуск, Android Studio не помещает библиотеки, такие как firebaseв сгенерированный apk, для уменьшения времени сборки проекта, потому что firebase библиотека и другие библиотеки, такие как mapsи другие , существуют в сервисах воспроизведения, а сервисы воспроизведения установлены. на устройстве Android, так что если включен мгновенный запуск, не нужно помещать их в сгенерированный apk, чтобы ускорить сборку.

Поэтому, когда вы извлекаете apk и устанавливаете его на другое устройство, вы увидите это исключение

Эдалат Фейзи
источник
1
Это идеальное решение
Ghanshyam Bagul
Отключение Instant Run не решает проблему для меня.
Алешак,
В Android Studio 3.5.1 нет элемента «Мгновенный запуск» в разделе «Сборка, выполнение, развертывание».
Вергилий
@Vergiliy Они заменили его изменениями в применении, см. Пост в блоге выпуска android-developers.googleblog.com/2019/08/… для получения дополнительной информации и в документах developer.android.com/studio/run#apply-changes для получения дополнительной информации о применении. изменения
Edalat Feizi
14

Я также столкнулся с той же проблемой после того, как попробовал все решения, которые я нашел ниже.

Если вы применили правила Proguard, добавьте нижнюю строку в Правила ProGuard

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

и это решит мою проблему.

Гунавант Патель
источник
@gunavant patel bro, пожалуйста, скажите мне, пожалуйста, как добавить в proguard
Gowthaman M
1
@gunavant patel Я думаю, это решит мою проблему ... не могли бы вы опубликовать пример кода, где оставить эту строку-keep class com.google.firebase.provider.FirebaseInitProvider
Gowthaman M
@GowthamanM Сначала проверьте, что вы включили proguard в файле app / build.gradle. если включить, то вы найдете файл proguard-rules в app / proguard-rules.pro в этом файле, добавьте строку выше. Если вы не включите Proguard, то это не hepl вас.
Gunavant Patel
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }Как включить, пожалуйста, скажите мне, сэр
Gowthaman M
Если вы не включили Proguard, то проблема в другом. но я покажу вам, как включить это. добавить «minifyEnabled true» в выпуске или, если вы хотите включить для отладки, то также добавить в тип отладки.
Gunavant Patel
8

1: Перейдите к включению gradle multiDexEnabled и добавьте мультидексную библиотеку в зависимости.

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

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

2: Перейдите в файл манифеста и напишите android: name = ". MyApplication" (имя класса (MyApplication) необязательно, вы можете написать все, что захотите).

    <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: Как вы написали android: name = ". MyApplication" внутри приложения в файле манифеста. это даст вам ошибку, потому что вы не создали класс MyApplication. Создайте класс MyApplication, расширьте его классом «application» или просто нажмите. MyApplication, маленький красный шарик появится слева от синтаксиса, щелкните его, вы увидите (создайте класс MyApplication) в меню, щелкните его и включите. Метод ниже Внутри этого класса.

    public class MyApplication extends Application {

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

Если вы хотите получить больше информации, нажмите на эту ссылку: [ https://developer.android.com/studio/build/multidex.html].

Надеюсь, это работает для вас.

Шахзад Африди
источник
7

Сначала добавьте следующее в build.gradle (Модуль: приложение) ---->

defaultConfig{
..
multiDexEnabled true
..
}

Затем в том же файле добавить следующее

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

Затем в AndroidManifest.xml напишите следующее

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

Вот и все. Это точно сработает

Хирак Д.Д.
источник
6

Если вы используете MultiDex в вашем затем изменения App Gradle расширяет приложение к расширяет MultiDexApplication в своем классе приложений. Это будет демонстративно работать

Суреш Кумар
источник
4

У меня возникла та же проблема, и я решил просто добавить кусок кода. Если вы получаете эту проблему, значит, вы уже выполнили все шаги, необходимые для использования Firebase. Вам просто нужно создать класс, который расширяет приложение (открытый класс Application_CrashReport extends Application) и добавить этот класс в файл mainifest, и в этом классе просто переопределить метод ниже

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

и добавьте MultiDex.install (это); в этом методе означает

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

Примечание : - Не забудьте выполнить вышеуказанные шаги

Питер
источник
2

Это связано с MultiDex.

Шаги для решения:

  1. В gradle-> зависимости -> (compile'com.android.support: multidex: 1.0.1 ') Добавьте это в зависимости

  2. В вашем проекте класс приложения расширяет MultiDexApplication следующим образом (открытый класс MyApplication расширяет MultiDexApplication)

  3. Запустить и проверить

Сухдип Сайни
источник
2

Это немного поздно для тех, кто входит, но проверьте свои правила защиты! Я потратил много времени на это. Ваши правила Proguard могли бы изменить имена на важные файлы Firebase. Это действительно только доказывает проблему в производстве и мгновенном запуске :)

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.**
Кит Эйлвин
источник
Это добилось цели, позволив мультидексу делать только трата времени!
Магнус В.
2

Как упоминалось ранее, это проблема с multidex: вы должны добавить реализацию к вашим build.gradleи MainApplication.java. Но то, что вы добавляете, зависит от того, поддерживаете ли вы AndroidX или нет. Вот что вам нужно для решения этой проблемы:

  1. Если вы поддерживаете AndroidX

Поместите эти строки кода в ваш 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
  ...
}

Поместите эти строки в ваш 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. Если вы не поддерживаете AndroidX

Поместите эти строки кода в ваш 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
  ...
}

Поместите эти строки в ваш 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
Е. Дн
источник
1

Вы должны расширить свой класс приложения с помощью MultiDexApplicationвместо Application.

Али Акрам
источник
0

Эта проблема возникла, когда я переключился на Android Studio 3.4 с плагином Android Gradle 3.4.0. который работает с компилятором R8.

Плагин Android Gradle включает дополнительные предопределенные файлы правил ProGuard, но рекомендуется использовать proguard-android-optimize.txt . Больше информации здесь .

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'
    }
}
Левон Петросян
источник
0

Я столкнулся с той же проблемой, и я решил эту проблему, изменив версию fireabseStorage так же, как версию базы данных 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'

в

 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'
Умер Вакас
источник
0

Если у вас> 20 minsdkversion, вам нужно использовать последнюю версию Firebase Auth, т.е.

реализация "com.google.firebase: firebase-auth: 18.1.0"

и нет необходимости настраивать мультидекс, если вам это не нужно.

Я столкнулся с этой проблемой, когда использовал 16.0.5 из помощника Firebase, но смог исправить ее, когда обновился до 18.1.0.

SilverArrow
источник
0

Если вы используете Xamarin.Forms, вы можете проверить не нашли класс "com.google.firebase.provider.FirebaseInitProvider"? поскольку это фиксирует проблему с ошибкой dex с Google Firebase при запуске (не решена в настоящее время).

Я вернулся к использованию сокращения в краткосрочной перспективе и планирую использовать ProGuard, пока R8 не станет более стабильным.

Девология ООО
источник
-6

добавить в корневой каталог проекта 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'
Мухаммед Азим
источник
подумайте о том, чтобы добавить некоторую информацию в ваш ответ, и этот код никому не поможет
Ашу Кумар