アプリ起動時に以下の例外が発生します。
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
}
問題を解決するには?
私は同じエラーがあり、私はこのリンクに記載されているように、MultiDexでそれを解決しました: https://developer.Android.com/studio/build/multidex.html
MultiDexを有効にするだけでは不十分な場合があります。
起動時に が必要なクラスが プライマリDEXファイル に指定されていない場合、アプリケーションはエラーJava.lang.NoClassDefFoundErrorでクラッシュします。 https://developer.Android.com/studio/build/multidex#keep
起動時にはFirebaseInitProviderが必要です。
そのため、プライマリDEXファイルで必要に応じてFirebaseInitProviderを手動で指定する必要があります。
build.gradleファイル
Android {
buildTypes {
release {
multiDexKeepFile file('multidex-config.txt')
...
}
}
}
multidex-config.txt(build.gradleファイルと同じディレクトリにあります)
com/google/firebase/provider/FirebaseInitProvider.class
私も同じ問題に直面し、ついにAndroidスタジオでInstant Run
を無効にすることでそれを解決しました。
設定→ビルド、実行、配置→インスタントランを実行し、インスタントランを有効にするのチェックを外します。
Build.gradle(Module:app)ファイルで、次のコードをdefaultConfigに挿入します。
defaultConfig {
applicationId "com.***.****"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
multiDexEnabled true
}
そして依存関係に挿入する:
compile 'com.Android.support:multidex:1.0.1'
次にマニフェストにコードを追加します。
<application
Android:name="Android.support.multidex.MultiDexApplication"
私は(YouTubeプレーヤープロジェクト)で同じ問題を抱えていましたが、以下の問題を解決しました。
このコードをdefaultConfing
内のbuild.gradle
(module:app)に追加します。
defaultConfig {
....
....
multiDexEnabled = true
}
このコードをdependencies
内のbuild.gradle
(module:app)に追加します。
dependencies {
compile 'com.Android.support:multidex:1.0.1'
.....
.....
}
AndroidManifest.xml
とapplication
内を開きます。
<application
Android:name="Android.support.multidex.MultiDexApplication"
.....
.....
</application>
appクラスがある場合は、MultiDexApplicationから次のように拡張します。
public class MyApp extends MultiDexApplication {
.....
そして最後に、 Android Support Repository を Extras in SDK Manager にダウンロードする必要があると思います。
アプリケーションクラスで次のメソッドをオーバーライドするだけです。
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
}
}
multidex
を有効にすることは良い解決策ではありません。なぜならmultidex
はAndroidで別の使用法を持っているからです。 multidexとは何ですか
@Shylendra Maddaが言ったように解決策はインスタントランを無効にしています
設定→ビルド、実行、配置→インスタントランを実行し、インスタントランを有効にするのチェックを外します。
firebase
ライブラリやfirebase
や others などのライブラリがあるため、この問題の原因はインスタントランが有効になっているとき、Android Studioがmaps
などのライブラリを生成されたapkに入れないことであると思います。プレイサービスに存在し、プレイサービスはAndroidデバイスにインストールされているので、インスタントランが有効になっている場合はビルド時間を早くするために生成されたAPKにそれらを配置する必要はありません。
だからあなたはapkを抽出して別のデバイスにインストールするとあなたはこの例外が表示されます
私は以下の解決策を見つけたすべての解決策を試した後にも同じ問題に直面しています。
Proguardの規則を適用した場合は、ProGuardの規則に次の行を追加してください。
-keep class com.google.firebase.provider.FirebaseInitProvider
そしてそれは私の問題を解決します。
あなたのアプリとそれが参照するライブラリが65,536のメソッドを超えたとき、あなたはあなたのアプリがAndroidのビルドアーキテクチャの限界に達したことを示すビルドエラーに遭遇します
your minSdkVersionが21以上に設定されている場合は、次に示すように、モジュールレベルのbuild.gradleファイルでmultiDexEnabledをtrueに設定するだけです。
Android { defaultConfig { ... minSdkVersion 21 multiDexEnabled true } ... }
ただし、 、minSdkVersionが20以下に設定されている場合は、次のようにマルチインデックスサポートライブラリを使用する必要があります。
1 。次のように、モジュールレベルのbuild.gradleファイルを修正してマルチインデックスを有効にし、マルチインデックスライブラリを依存関係として追加します。
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)を呼び出してマルチインデックスを有効にできます。
public class MyApplication extends SomeOtherApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } }
App GradleでMultiDexを使用している場合は、アプリケーションクラスで extends application を extends MultiDexApplication に変更します。それは間違いなく動作します
まずbuild.gradle(Module:app)に以下を追加します---->
defaultConfig{
..
multiDexEnabled true
..
}
それから同じファイルに以下を追加してください
dependencies{
...
compile 'com.Android.support:multidex:1.0.1'
...
}
それからAndroidManifest.xmlに以下を書いてください
<application
Android:name="Android.support.multidex.MultiDexApplication"
.....
.....
</application>
それでおしまい。それは間違いなく動作します
1: gradle enable 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"マニフェストファイルの内側のアプリケーション。 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]
うまくいけば、それはあなたのために働く。
私は同じ問題を抱えていて、コードを追加するだけで解決しました 、あなたがこの問題に遭遇したなら、Firebaseを使用するために必要なすべてのステップをすでに完了しています。 Applicationを拡張するクラスを作成する必要があります (public class Application_CrashReportはApplicationを拡張します) そしてこのクラスを mainifest file に追加します。
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
}
multiDex.install(this)を追加します。その方法では
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
注 : - 上記の手順に従うことを忘れないでください
これはMultiDexによるものです。
解決するための手順
Gradle-> dependencies - >(compile'com.Android.support:multidex:1.0.1 ')でこれを依存関係に追加
あなたのプロジェクトでは、アプリケーションクラスはMultiDexApplicationをこのように拡張します(パブリッククラスMyApplicationはMultiDexApplicationを拡張します)
実行してチェック
ApplicationクラスをMultiDexApplication
ではなくApplication
で拡張する必要があります。
これはやってくる人たちには少し遅れますが、あなたの予防規則をチェックしてください!私はこれに多くの時間を浪費しました。あなたの予防措置の規則は重要な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.**
20を超えるminsdkversionがある場合は、最新のFirebase Authバージョン、つまり.
実装 'com.google.firebase:firebase-auth:18.1.0'
実際に必要ない場合は、マルチデックスをセットアップする必要はありません。
Firebaseヘルパーから16.0.5を使用したときにこの問題が発生しましたが、18.1.0に更新したときに修正できました。
この問題は、Android Gradleプラグイン3.4.0を使用してAndroid Studio 3.4に切り替えたときに発生しました。これは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'
}
}
私は同じ問題に直面していました、そして、私はfirebaseデータベースバージョンと同じfireabseStorageバージョンを変更することによってこの問題を解決しました
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'
Xamarin.Formsを使用している場合は、チェックアウトすることをお勧めします 「com.google.firebase.provider.FirebaseInitProvider」クラスが見つかりませんでしたか? これはdexエラーの問題をキャプチャするためです起動時にgoogle firebaseを使用します(現時点では未解決)。
短期的には縮小なしに戻し、R8がより安定するまでProGuardを使用する予定です。