如何修复此 Crashlytics MissingDependencyException?
How can I fix this CrashlyticsMissingDependencyException?
我使用最新的 Crashlytics(Fabric 集成)有一段时间了。但是最近我由于缺少依赖项而遇到以下崩溃错误,尽管我没有更改有关 Crashlytics 配置的任何内容。
有什么想法吗?
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ .
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . | |
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . | |
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . | |
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . \ | | /
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . \ /
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . \ /
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . \/
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ .
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ This app relies on Crashlytics. Please sign up for access at https://fabric.io/sign_up,
install an Android build tool and ask a team member to invite you to this app's organization.
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ .
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . /\
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . / \
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . / \
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . / | | \
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . | |
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . | |
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . | |
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ .
02-08 22:18:00.935 18887-18887/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.android.staging, PID: 18887
java.lang.RuntimeException: Unable to create application com.example.android.App: io.fabric.sdk.android.services.concurrency.UnmetDependencyException: com.crashlytics.android.CrashlyticsMissingDependencyException:
This app relies on Crashlytics. Please sign up for access at https://fabric.io/sign_up,
install an Android build tool and ask a team member to invite you to this app's organization.
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4734)
at android.app.ActivityThread.access00(ActivityThread.java:171)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1357)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5506)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
如果您确实需要发布应用,目前唯一的解决方法是将动态版本号更改为静态版本号:
[...]
classpath 'io.fabric.tools:gradle:1.14.4'
[...]
compile('com.crashlytics.sdk.android:crashlytics:2.2.0@aar') {
transitive = true
}
[...]
编辑:
已发布 Fabric SDK 的更新版本;您可以通过将行更改为以下内容来获得它:
classpath 'io.fabric.tools:gradle:1.26.1'
似乎将插件版本指定为:
classpath 'io.fabric.tools:gradle:1.+'
选择1.15.1,有问题
指定主要和次要到以前的 1.14
似乎是稳定的:
classpath 'io.fabric.tools:gradle:1.14.+'
来自 Crashlytics 的 Mike。我们今天早些时候发布了更新版本 - 1.15.2,其中包含针对此行为的修复。如果你 运行:
./gradlew assemble --refresh-dependencies
这将引入最新版本。还可以看到更多details on the fix here.
我在实际安装前添加了以下代码Fabric/Crashlytics:
debug {
ext.enableCrashlytics = false
}
在第一个 运行 使用 Crashlytics 之前删除它解决了问题。第一个 运行.
后问题不再出现
如果这对其他人有帮助,我在将 Crashlytics 升级到 Fabric 时遇到了类似的问题。在我的例子中,插件从 Crashlytics 中留下了 2 行,我需要在它工作之前手动删除它们。
在 gradle 文件中,在 buildscript 依赖项下,我不得不手动删除:
classpath 'com.crashlytics.tools.gradle:crashlytics-gradle:1.16.0'
此外,在依赖项下,我不得不手动删除:
compile 'com.crashlytics.android:crashlytics:1.1.13'
更新插件后我遇到了同样的问题。
解决需要从 AndroidManifest.xml:
中删除
<meta-data
android:name="com.crashlytics.ApiKey"
android:value="API_SECRET_KEY" />
并添加到 fabric.properties:
apiSecret=API_SECRET_KEY
apiKey=YOUR_SECRET_KEY
更新:
现在,您必须使用:
<meta-data
android:name="io.fabric.ApiKey"
android:value="API_KEY" />
对我来说是因为 dataBinding = true
。将 fabric gradle 插件升级到 1.21.0 解决了这个问题:https://twittercommunity.com/t/fabric-gradle-plugin-1-21-0-add-support-for-android-databinding-true/57474
我在 gradle
中注释掉了这个
apply plugin: 'io.fabric'
需要取消注释
或者,如果您没有,请添加!
如果您在调试期间使用禁用功能,如图所示
Crashlytics crashlyticsKit = new Crashlytics.Builder()
.core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
.build();
Fabric.with(this, crashlyticsKit);
当您更新 crashlytics 版本时会发生什么
Fabric.with(this, crashlyticsKit);
转为
Fabric.with(this,new Crashlytics());
因此请务必将其改回 crashlyticskit。如果您正确执行此操作但错误仍然出现,请确保您有
debug {
ext.enableCrashlytics = false
}
在 android {buildtypes{}}
下
帮我解决
来自官方source
为调试版本禁用 Crashlytics
如果您不需要 Crashlytics 崩溃报告或用于调试版本的 Beta 版,您可以通过以下两个步骤完全禁用该插件来安全地加速您的 debug-builds:
首先,将此添加到您应用的 build.gradle:
android {
buildTypes {
debug {
// Disable fabric build ID generation for debug builds
ext.enableCrashlytics = false
...
接下来,在运行时禁用 Crashlytics 工具包。否则,Crashlytics 工具包将抛出以下错误:
com.crashlytics.android.core.CrashlyticsMissingDependencyException:
This app relies on Crashlytics. Please sign up for access at https://fabric.io/sign_up`
您可以在运行时仅使用以下代码为调试版本禁用该工具包:
// Set up Crashlytics, disabled for debug builds
Crashlytics crashlyticsKit = new Crashlytics.Builder()
.core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
.build();
// Initialize Fabric with the debug-disabled crashlytics.
Fabric.with(this, crashlyticsKit);
检查 build.gradle 文件中是否禁用了 crashlytics
debug {
ext.enableCrashlytics = false
}
改为使用
debug {
ext.enableCrashlytics = true
}
可能是我回复晚了。
但是,除了上述所有答案之外,还有一个原因可能会发生这种情况
如有漏补
apply plugin:'io.fabric'
这可能看起来很奇怪,但这会导致同样的问题
当我们注册并从 Fabric window 使用 IDE 添加代码时,默认情况下由 fabric 添加,但不小心它可以被删除。
如果您不小心包含了 Crashlytics BuildConfig,也会出现此问题 - 使用 Android Studio/IntelliJ 自动导入非常容易。
我导入了
import com.crashlytics.android.core.BuildConfig;
而不是我自己的
import <package_name>.BuildConfig;
确保将 apply plugin: 'io.fabric'
添加到您的应用程序项目 build.gradle
中。就我而言,我有一个共同的 build.gradle
和 apply plugin: 'io.fabric'
。将其移动到应用程序项目解决了问题。
就我而言,我在 "CommonLib" 模块中使用结构,该模块作为依赖项添加到所有其他模块(包括应用程序)中。
所以,我在 buildscript {}
块之后添加了 apply plugin: 'io.fabric'
。所以,我把两个插件放在一起:
apply plugin: 'com.android.library'
apply plugin: 'io.fabric'
问题解决了!
删除应用程序图标修复了 Crashylitics,哇?
我根据入职教程、使用最新版本等完成了所有工作
只是浪费了一个小时来解决这个问题。事实证明,有人认为读取应用程序图标的包名称而不是 context.packageName
来获取给定上下文的应用程序资源是个好主意。这是用这个方法完成的:
io.fabric.sdk.android.services.common.CommonUtils#getResourcePackageName
如果您碰巧使用了不在 APK 内的图标,这显然会失败,例如:android:icon="@android:drawable/sym_def_app_icon"
。这在当时可能是个好主意,不知道他们试图解决什么奇怪的错误?!
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
将其添加到 AndroidManifest.xml
。
我使用最新的 Crashlytics(Fabric 集成)有一段时间了。但是最近我由于缺少依赖项而遇到以下崩溃错误,尽管我没有更改有关 Crashlytics 配置的任何内容。
有什么想法吗?
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ .
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . | |
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . | |
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . | |
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . \ | | /
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . \ /
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . \ /
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . \/
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ .
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ This app relies on Crashlytics. Please sign up for access at https://fabric.io/sign_up,
install an Android build tool and ask a team member to invite you to this app's organization.
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ .
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . /\
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . / \
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . / \
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . / | | \
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . | |
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . | |
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ . | |
02-08 22:18:00.935 18887-18887/? E/Fabric﹕ .
02-08 22:18:00.935 18887-18887/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.android.staging, PID: 18887
java.lang.RuntimeException: Unable to create application com.example.android.App: io.fabric.sdk.android.services.concurrency.UnmetDependencyException: com.crashlytics.android.CrashlyticsMissingDependencyException:
This app relies on Crashlytics. Please sign up for access at https://fabric.io/sign_up,
install an Android build tool and ask a team member to invite you to this app's organization.
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4734)
at android.app.ActivityThread.access00(ActivityThread.java:171)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1357)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5506)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
如果您确实需要发布应用,目前唯一的解决方法是将动态版本号更改为静态版本号:
[...]
classpath 'io.fabric.tools:gradle:1.14.4'
[...]
compile('com.crashlytics.sdk.android:crashlytics:2.2.0@aar') {
transitive = true
}
[...]
编辑:
已发布 Fabric SDK 的更新版本;您可以通过将行更改为以下内容来获得它:
classpath 'io.fabric.tools:gradle:1.26.1'
似乎将插件版本指定为:
classpath 'io.fabric.tools:gradle:1.+'
选择1.15.1,有问题
指定主要和次要到以前的 1.14
似乎是稳定的:
classpath 'io.fabric.tools:gradle:1.14.+'
来自 Crashlytics 的 Mike。我们今天早些时候发布了更新版本 - 1.15.2,其中包含针对此行为的修复。如果你 运行:
./gradlew assemble --refresh-dependencies
这将引入最新版本。还可以看到更多details on the fix here.
我在实际安装前添加了以下代码Fabric/Crashlytics:
debug {
ext.enableCrashlytics = false
}
在第一个 运行 使用 Crashlytics 之前删除它解决了问题。第一个 运行.
后问题不再出现如果这对其他人有帮助,我在将 Crashlytics 升级到 Fabric 时遇到了类似的问题。在我的例子中,插件从 Crashlytics 中留下了 2 行,我需要在它工作之前手动删除它们。
在 gradle 文件中,在 buildscript 依赖项下,我不得不手动删除:
classpath 'com.crashlytics.tools.gradle:crashlytics-gradle:1.16.0'
此外,在依赖项下,我不得不手动删除:
compile 'com.crashlytics.android:crashlytics:1.1.13'
更新插件后我遇到了同样的问题。 解决需要从 AndroidManifest.xml:
中删除<meta-data
android:name="com.crashlytics.ApiKey"
android:value="API_SECRET_KEY" />
并添加到 fabric.properties:
apiSecret=API_SECRET_KEY
apiKey=YOUR_SECRET_KEY
更新:
现在,您必须使用:
<meta-data
android:name="io.fabric.ApiKey"
android:value="API_KEY" />
对我来说是因为 dataBinding = true
。将 fabric gradle 插件升级到 1.21.0 解决了这个问题:https://twittercommunity.com/t/fabric-gradle-plugin-1-21-0-add-support-for-android-databinding-true/57474
我在 gradle
中注释掉了这个apply plugin: 'io.fabric'
需要取消注释
或者,如果您没有,请添加!
如果您在调试期间使用禁用功能,如图所示
Crashlytics crashlyticsKit = new Crashlytics.Builder()
.core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
.build();
Fabric.with(this, crashlyticsKit);
当您更新 crashlytics 版本时会发生什么
Fabric.with(this, crashlyticsKit);
转为
Fabric.with(this,new Crashlytics());
因此请务必将其改回 crashlyticskit。如果您正确执行此操作但错误仍然出现,请确保您有
debug {
ext.enableCrashlytics = false
}
在 android {buildtypes{}}
下帮我解决 来自官方source
为调试版本禁用 Crashlytics
如果您不需要 Crashlytics 崩溃报告或用于调试版本的 Beta 版,您可以通过以下两个步骤完全禁用该插件来安全地加速您的 debug-builds:
首先,将此添加到您应用的 build.gradle:
android {
buildTypes {
debug {
// Disable fabric build ID generation for debug builds
ext.enableCrashlytics = false
...
接下来,在运行时禁用 Crashlytics 工具包。否则,Crashlytics 工具包将抛出以下错误:
com.crashlytics.android.core.CrashlyticsMissingDependencyException:
This app relies on Crashlytics. Please sign up for access at https://fabric.io/sign_up`
您可以在运行时仅使用以下代码为调试版本禁用该工具包:
// Set up Crashlytics, disabled for debug builds
Crashlytics crashlyticsKit = new Crashlytics.Builder()
.core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
.build();
// Initialize Fabric with the debug-disabled crashlytics.
Fabric.with(this, crashlyticsKit);
检查 build.gradle 文件中是否禁用了 crashlytics
debug {
ext.enableCrashlytics = false
}
改为使用
debug {
ext.enableCrashlytics = true
}
可能是我回复晚了。 但是,除了上述所有答案之外,还有一个原因可能会发生这种情况
如有漏补
apply plugin:'io.fabric'
这可能看起来很奇怪,但这会导致同样的问题
当我们注册并从 Fabric window 使用 IDE 添加代码时,默认情况下由 fabric 添加,但不小心它可以被删除。
如果您不小心包含了 Crashlytics BuildConfig,也会出现此问题 - 使用 Android Studio/IntelliJ 自动导入非常容易。
我导入了
import com.crashlytics.android.core.BuildConfig;
而不是我自己的
import <package_name>.BuildConfig;
确保将 apply plugin: 'io.fabric'
添加到您的应用程序项目 build.gradle
中。就我而言,我有一个共同的 build.gradle
和 apply plugin: 'io.fabric'
。将其移动到应用程序项目解决了问题。
就我而言,我在 "CommonLib" 模块中使用结构,该模块作为依赖项添加到所有其他模块(包括应用程序)中。
所以,我在 buildscript {}
块之后添加了 apply plugin: 'io.fabric'
。所以,我把两个插件放在一起:
apply plugin: 'com.android.library'
apply plugin: 'io.fabric'
问题解决了!
删除应用程序图标修复了 Crashylitics,哇?
我根据入职教程、使用最新版本等完成了所有工作
只是浪费了一个小时来解决这个问题。事实证明,有人认为读取应用程序图标的包名称而不是 context.packageName
来获取给定上下文的应用程序资源是个好主意。这是用这个方法完成的:
io.fabric.sdk.android.services.common.CommonUtils#getResourcePackageName
如果您碰巧使用了不在 APK 内的图标,这显然会失败,例如:android:icon="@android:drawable/sym_def_app_icon"
。这在当时可能是个好主意,不知道他们试图解决什么奇怪的错误?!
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
将其添加到 AndroidManifest.xml
。