Не знайшли клас "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
}

Як вирішити питання?


Можливий дублікат stackoverflow.com/questions/37312103/…
Jay Rathod RJ

Я вже спробував усі ці відповіді. нічого не виходить
ЖИВИ

Здається, у вашому маніфесті чи google-services.json є проблема. Переконайтесь, що вони правильні. Чи можете ви опублікувати свій файл маніфесту?
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

1
ви дивовижні <3 дякую, стільки ви врятували мій день <3
Мохаммед Атеф

24
Привіт це виняток: Викликаний: java.lang.ClassNotFoundException: Не знайшли клас "com.google.firebase.provider.FirebaseInitProvider" не має нічого спільного з включенням multidex, адже якщо ви бачите питання build.gradle multiDexEnabled увімкнено!
Хорхесіс

3
Немає цієї помилки від мультидекса, він просто не виконав усі кроки, оскільки ви не можете бачити його маніфест чи його основний клас.
AMAN77

3
Це спрацювало. У моєму файлі gradle увімкнено мультидекс, але в програмі Android Manifest не вистачало!
krikara

3
Також переконайтеся, що ваш Applicationклас розповсюджується на MultiDexApplication(). У моєму випадку цього не було.
Нельсон Альмендра

86

Я теж зіткнувся з тим же питанням і, нарешті, вирішив це, відключившись Instant Runв андроїд-студії.

Установки → Збірка, Виконання, Розгортання → Миттєвий запуск та зніміть прапорець Увімкнути миттєвий запуск

Оновлення:

Немає опцій миттєвого запуску в останніх Android Studio 3.5+. Він повинен застосовуватися лише для старих версій.


8
Те саме для мене. Це було причиною проблеми - не мультидекса або будь-яка інша відповідь.
користувач3562927

3
Здається, це проблема з Android Studio 2.3. Відключення миттєвого запуску теж працювало для мене, але це не ідеальне рішення :(
Tharaka Devinda

1
Я успадкував два проекти від іншої фірми. Конфігурація бази коду, маніфесту та Gradle практично однаково очікується для пари другорядних елементів. Один проект будує та працює добре, інший - ні. Вимкнулося миттєвий запуск, і вони обидва зараз біжать. Дивно. Для цього використовується Android Studio. 2.3.
joeblow23

3
Я стикався з цією самою проблемою з AS 3.1 та емулятором під керуванням API 26. До того, як у мене не виникло жодних проблем з API 19-25. Відключення миттєвого запуску дійсно дозволить мені запустити додаток. Дякую.
Marcin Jedynak

1
Відключення миттєвого запуску не вирішує цю проблему для мене.
Альошак

49

У файл build.gradle (Модуль: додаток) вставте код нижче в 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"

1
Я, пробую, якщо це спрацює, я проголосую і прокоментую
Каміль Ібадов

45

У мене була така ж проблема в моєму проекті програвача YouTube), і наступне вирішило проблему для мене:

  1. Додайте цей код у свій build.gradle(модуль: додаток) всередині defaultConfing:

    defaultConfig {
        ....
        ....
        multiDexEnabled = true
    }
  2. Додайте цей код у свій build.gradle(модуль: додаток) всередині dependencies:

    dependencies {
        compile 'com.android.support:multidex:1.0.1'
        .....
        .....
    }
  3. Відкрити AndroidManifest.xmlта всередині application:

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

    або якщо у вас є клас додатків, розгорніть його з MultiDexApplication, наприклад:

    public class MyApp extends MultiDexApplication {
    .....

І нарешті, я думаю, вам слід завантажити сховище підтримки Android , в додатки в SDK Менеджері .


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 

    }
}

плюс один за те, що не потрапляв на android:nameматеріал у Маніфесті
Чіско,

Найпростіша і найкраща відповідь
kader kabore

Якщо ви використовуєте спеціальний клас програми, це відповідь. Інші відповіді не вирішать проблему.
makkhay gurung

25

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

Щоб уникнути цього обмеження, вам потрібно налаштувати додаток для мультидекса

Якщо для вашого minSdkVersion встановлено значення 21 або вище, все, що вам потрібно зробити, це встановити multiDexEnabled на істину у файлі 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. Залежно від того, чи перекриєте ви клас додатка, виконайте одну з наступних дій:

  • Якщо ви не замінюєте клас програми, відредагуйте файл маніфесту, щоб встановити android: name в тезі так:

    <application
        android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
  • В іншому випадку, якщо ви перекриєте клас програми, змініть його на розширення MultiDexApplication (якщо можливо) наступним чином:

   public class MyApplication extends MultiDexApplication { ... }
  • У іншому випадку ви перейдете клас Application, але змінити базовий клас неможливо, тоді ви можете замінити метод attachBaseContext () і викликати MultiDex.install (це), щоб увімкнути multidex:

   public class MyApplication extends SomeOtherApplication {
     @Override
     protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
     }
   }

Чому програмі потрібно розширити MultiDexApplication?
Джейсон

1
MultiDexApplication - це підтримуючий клас бібліотеки. Він реалізує клас програми та замінює ім'я методу attachBaseContext, щоб виконати завдання для реєстрації MultiDex. Вам не потрібно розширювати цей клас, якщо ви перекриєте метод attachBaseContext.
Sokmean Pon

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

Відключення миттєвого запуску не вирішує для мене проблеми.
Альошак

В Android Studio 3.5.1 в розділі "Збір, виконання", "Розгортання" відсутній елемент миттєвого запуску.
Вергілій

@Vergiliy Вони замінили його на зміни застосувань, див. Допис у блозі для випуску android-developers.googleblog.com/2019/08/…, щоб отримати додаткові відомості та додатки developer.android.com/studio/run#apply-changes для отримання додаткової інформації про застосувати зміни
Едалат Фейзі

14

Я також зіткнувся з тією ж проблемою після спробу всього рішення, я знайшов рішення нижче.

Якщо ви застосували правила захисту, то додайте нижче рядка в Правила 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-правил у app / proguard-rules.pro у цьому файлі, додавши вище рядка. Якщо ви не включите proguard, то він не hepl вас.
Гунавант Патель

buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }Як увімкнути, будь ласка, скажіть мені
Гоутаман M

якщо ви не ввімкнули Proguard, проблема інша. але я показую, як це зробити. додайте "minifyEnabled true" у випуску або якщо ви хочете включити для налагодження, тоді також додайте у типі налагодження.
Гунавант Патель

8

1: Перейдіть до Gradle, щоб увімкнути multiDexEnabled, і додайте бібліотеку мультидекса в залежності.

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

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

2: Перейдіть у файл Manifest і запишіть 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" Всередині програми у файлі Manifest. це дасть вам помилку, оскільки ви не створили клас MyApplication. Створіть MyApplication Class, розширіть його класом "application" або Просто натисніть на. нижче Метод всередині цього класу.

    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 у вашому додатку Gradle, тоді зміна розширює додаток на розширення MultiDexApplication у вашому класі додатків. Це буде виклично спрацювати


4

У мене була така ж проблема, і я вирішив просто додати фрагмент коду. Якщо ви отримуєте цю проблему, це означає, що ви вже виконали всі кроки, необхідні для використання Firebase. Вам просто потрібно створити клас, який розширює додаток (публічний клас Application_CrashReport розширює додаток) і додати цей клас у файл 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

Це трохи пізно для тих, хто заходить, але перевірте свої правила прогудар! Я витрачав на це багато часу. Ваші правила захисту можуть змінювати імена на важливі файли 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


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.


0

Якщо ви використовуєте Xamarin.Forms, можливо, ви хочете перевірити. Не знайшли клас "com.google.firebase.provider.FirebaseInitProvider"?оскільки це фіксує проблему з помилкою Dex при запуску файлової бази google (на даний момент не вирішено).

Я повернувся до використання скорочення не в короткотерміновій перспективі і планую використовувати 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'

розгляньте можливість додавати інформацію у відповіді на ур, і цей код нікому не допоможе
Ашу Кумар,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.