私は新しいクラッシュツールをテストしています: 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
1.
アプリケーションのbuild.gradleにapplicationIdを追加します。
Android {
...
defaultConfig {
applicationId "com.example.my.app"
...
}
}
そしてClean Project - > BuildまたはRebuild Projectより
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.
カスタムのApplicationクラスを使用する場合
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
}
}
app/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
に設定されている場合は、次の方法も試してください。
Build
> Clean Project
私はPre Lollipopデバイスでも同じ問題を抱えていました。それを解決するために、私は次のようにしました。その間、プロジェクトでmultiDexを使用していました。
1。これをモジュールのbuild.gradleに追加します。app
multiDexEnabled = true
dexOptions {
javaMaxHeapSize "4g"
}
この依存関係を追加
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#instant-run
<?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>
Play servicesライブラリ全体を含めるのではなく、必要なライブラリを使用してください。 build.gradle の行に置き換えてください。
compile 'com.google.Android.gms:play-services:9.6.1'
Google Play Services API からの適切なものを使用してください。
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: / manifestにこの行を追加
<application
Android:name="Android.support.multidex.MultiDexApplication">
</application>
私の場合、この問題をモジュールbuild.gradleに追加することで解決しました。
//このAT下に追加
apply plugin: 'com.google.gms.google-services'
GradleファイルのFirebase SDKが間違った番号バージョンに設定されていたためです。
私はGradleからFirebaseのdebを取り除き、Firebase Assistant
を使ってそれらを再インストールしました。
私の場合、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
に変更しました。出来た。
手動で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かそれ以降に更新することです。
React Nativeアプリの場合、エラーは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のデバイスでのみ取得されていました
MainApplication.Java
のApplication
をMultiDexApplication
に置き換えるだけで解決しました
注:import Android.support.multidex.MultiDexApplication;
(WindowsでCtrl+Alt+S
を押して)Androidのスタジオ設定に移動し、Instant Run
を検索してEnable Instant Run
のチェックを外します。
Instant Run
を無効にしてアプリケーションを再度実行することで、問題は解決します。