首页 文章

如何在开发过程中禁用Crashlytics

提问于
浏览
200

有没有简单的方法可以在开发时关闭Crashlytics Android SDK?

每次我做一些愚蠢的事情时,我都不希望它发送崩溃

另一方面,我不想评论 Crashlytics.start() ,并可能冒险忘记取消注释并提交

22 回答

  • 144

    来自Crashlytics的Marc来自这里 . 在进行调试构建时,有几种方法可以禁用Crashlytics!

    • 使用不同的android:versionString进行调试和发布构建,然后从Crashlytics Web仪表板中为调试版本禁用崩溃报告 .

    • 在检查调试标志的if语句中包含对Crashlytics.start()的调用 . 您可以使用自定义标志或类似于此处提议的方法:How to check if APK is signed or "debug build"?

  • 342

    我找到了Crashlytics的解决方案(与Fabric集成)

    将以下代码放在Application类中 onCreate()

    Crashlytics crashlytics = new Crashlytics.Builder().disabled(BuildConfig.DEBUG).build();
    Fabric.with(this, crashlytics);
    

    编辑:

    在Crashalitics 2.3及以上版本中,这已被弃用 . 正确的代码是:

    CrashlyticsCore core = new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build();
    Fabric.with(this, new Crashlytics.Builder().core(core).build());
    

    要么

    Fabric.with(this, new Crashlytics.Builder().core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()).build());
    

    (从Crashlytics deprecated method disabled()复制)


    EDIT2:

    您也可以选择将其添加到gradle中的 buildType . 此命令禁用发送crashlytics映射文件并为每个构建生成ID,从而加快这些类型的gradle构建 . (它不会在运行时禁用Crashlytics . )See Mike B's answer here.

    buildTypes {
        release {
               ....
        }
        debug {
            ext.enableCrashlytics = false
        }
    }
    
  • 13

    如果您使用Gradle,只需将其添加到风味中:

    ext.enableCrashlytics = false
    
  • 24

    查看最新的文档 . https://docs.fabric.io/android/crashlytics/build-tools.html#gradle-advanced-setup .

    除了在build.grade中添加 ext.enableCrashlytics = false ,你需要这样做,

    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);
    
  • 0

    选择的答案不再正确 . 谷歌changed the integration of Crashlytics . 我当前的版本是 2.9.1 ,我唯一要做的就是将 implementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' 添加到我的Gradle文件中 . 没有其他要求,很好,但这意味着Crashlytics总是在运行 .

    Solution 1

    仅在发布版本中编译Crashlytics:

    dependencies {
       ...
       releaseImplementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' // update version
    }
    

    Solution 2

    如果你想_1133962_那么解决方案1不起作用,因为在Debug Builds中找不到Crashlytics类 . 因此,将Gradle实现更改回:

    implementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' // update version
    

    然后转到您的Manifest并在 application 标记内添加以下 meta-data 标记:

    <application
            android:name="...>
    
            <meta-data
                android:name="firebase_crashlytics_collection_enabled"
                android:value="false" />
    
    ...
    
    </application>
    

    添加到您的Launch-Activity(只需要一次性,而不是每个Activity)

    if (!BuildConfig.DEBUG) { // only enable bug tracking in release version
       Fabric.with(this, new Crashlytics());
    }
    

    这只会在发布版本中启用Crashlytics . 注意,当你配置Crashlytics时,请检查BuildConfig.DEBUG,例如:

    if (!BuildConfig.DEBUG) {
       Crashlytics.setUserIdentifier("HASH_ID");
    }
    

    最好,保罗

  • -8

    我发现this是最简单的解决方案:

    release {
            ...
            buildConfigField 'Boolean', 'enableCrashlytics', 'true'
        }
        debug {
            buildConfigField 'Boolean', 'enableCrashlytics', 'false'
        }
    

    上面的行将在 BuildConfig 文件中创建一个名为 enableCrashlytics 的静态布尔字段,您可以使用该字段来决定是否启动 Fabric

    if (BuildConfig.enableCrashlytics)
            Fabric.with(this, new Crashlytics());
    

    NOTE: 使用此方法,仅在发布版本中初始化Fabrics(如上面代码中所示) . 这意味着您需要在 Crashlytics 块中调用 Crashlytics 类中的静态方法,该块检查Fabrics是否已初始化,如下所示 .

    if (Fabric.isInitialized())
        Crashlytics.logException(e);
    

    否则,在模拟器上进行测试时,应用程序将因 Must Initialize Fabric before using singleton() 错误而崩溃 .

  • 5

    MyApplication#onCreate() 中使用此功能

    if (!BuildConfig.DEBUG) Crashlytics.start(this);
    

    EDIT 如果您已升级到Fabric,请改用此answer .

  • 5

    如果要捕获所有崩溃(用于调试和发布版本)但希望在Crashlytics仪表板中将它们分开,可以将此行代码添加到build.gradle:

    debug {
        versionNameSuffix "-DEBUG"
    }
    

    例如,如果您的应用程序的versionName是1.0.0,那么您的发布版本将标记为1.0.0,而调试版本将为1.0.0-DEBUG

  • 26

    这里有很多好的答案,但对于我的测试,我使用调试版本进行内部测试和实验室外测试,其中崩溃日志仍然非常有用,我仍然想报告它们 . 和OP一样,我想要的只是在我经常引起并快速解决崩溃的活动开发期间禁用它们 .

    您可以选择仅在使用以下代码将设备连接到开发计算机时禁用所有调试崩溃,而不是删除所有调试崩溃 .

    if (!Debug.isDebuggerConnected()) {
        Fabric.with(this, new Crashlytics());
    }
    
  • 2

    请注意,您还可以在调试版本中禁用恼人的符号上载:

    def crashlyticsUploadStoredDeobsDebug = "crashlyticsUploadStoredDeobsDebug"
    def crashlyticsUploadDeobsDebug = "crashlyticsUploadDeobsDebug"
    tasks.whenTaskAdded { task ->
        if (crashlyticsUploadStoredDeobsDebug.equals(task.name) ||
                crashlyticsUploadDeobsDebug.equals(task.name)) {
    
            println "Disabling $task.name."
            task.enabled = false
        }
    }
    

    只需将其放入应用程序模块的 build.gradle 即可 .

  • 2

    问题是没有一个解决方案适用于最新的crashlytics sdk . (我使用的是2.9.0)

    您无法通过代码禁用它,因为它会编译到您的项目中,甚至在调用应用程序的onCreate之前运行 . 所以其他解决方案很简单 - 不要编译crashlytics什么时候不需要 . 用build.gradle文件中的'releaseCompile'替换'compile'调用 .

    releaseCompile('com.crashlytics.sdk.android:crashlytics:2.9.0@aar') {
            transitive = true
        }
    
  • 0

    使用Gradle构建时最新最简单的版本:

    if (!BuildConfig.DEBUG) {
        Fabric.with(this, new Crashlytics());
    }
    

    它使用Fabric for Crashlytics的新内置语法,并自动使用Gradle构建 .

  • 0

    如果您担心 BuildConfig.DEBUG 未正确设置,请改用 ApplicationInfo

    boolean isDebug = ( mAppContext.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) != 0;
    Crashlytics crashlytics = new Crashlytics.Builder().disabled( isDebug ).build();
    Fabric.with( uIContext, crashlytics );
    
  • 1

    使用口味或构建配置 . 为开发构建使用单独的构建标识符,所有崩溃将继续使用单独的应用程序 . 在与同行共享构建或在没有调试器的情况下使用它时,可以派上用场 . 像这样的东西 -

    productFlavors {
        dev {
            applicationId "io.yourapp.developement"
        }
        staging {
            applicationId "io.yourapp.staging"
        }
    
        production {
            applicationId "io.yourapp.app"
        }
    
  • 24

    我遇到一个奇怪的问题:我跟着xialin 's answer (which also appears on the official website) and it didn'工作了 . 原来我在Fabric的包中引用了 BuildConfig ,它还包含一个静态DEBUG变量,即使在调试模式下也是如此 .

    因此,如果您遵循上述解决方案并仍然获得调试报告,请确保您引用此:

    import com.yourpackagename.BuildConfig;
    

    而不是这个:

    import io.fabric.sdk.android.BuildConfig;
    
  • 22

    如果你想要一个可调试的版本,那就是这样的:

    buildTypes {
        release {
            signingConfig signingConfigs.config
            debuggable true //-> debuggable release build
            minifyEnabled true
            multiDexEnabled false
            ext.enableCrashlytics = true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField 'boolean', 'BUILD_TYPE_DEBUG', 'false'
        }
        debug {
            minifyEnabled false
            multiDexEnabled true
            ext.enableCrashlytics = false
            ext.alwaysUpdateBuildId = false
            // Disable fabric build ID generation for debug builds
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField 'boolean', 'BUILD_TYPE_DEBUG', 'true'
        }
    }
    

    当您设置 debuggable true 时,您的BuildConfig.DEBUG将使用true初始化,这就是我在BuildConfig类中添加该变量的原因 .

    Init Fabric:

    Crashlytics crashlytics = new Crashlytics.Builder()
                // disable crash reporting in debug build types with custom build type variable
                .core(new CrashlyticsCore.Builder().disabled(BuildConfig.BUILD_TYPE_DEBUG).build())
                .build();
    
        final Fabric fabric = new Fabric.Builder(this)
                .kits(crashlytics)
                //enable debugging with debuggable flag in build type 
                .debuggable(BuildConfig.DEBUG)
                .build();
    
        // Initialize Fabric with the debug-disabled crashlytics.
        Fabric.with(fabric);
    
  • 6

    根据谷歌使用此代码禁用Crashlytics,它也将改善构建过程 .

    enter image description here

    参考 - https://developer.android.com/studio/build/optimize-your-build

  • 3

    如果您只想在IDE上执行此操作,另一种方法是注销插件 . 显然,当你在没有再次登录的情况下生成构建时,它将停止发送报告 .

  • 2

    我们可以使用fabric的isDebuggable()方法 .

    import static io.fabric.sdk.android.Fabric.isDebuggable;
    
    if(! isDebuggable()){
        // set Crashlytics ... 
    }
    

    快乐编码:)

  • 0
    1. Add this to your app’s build.gradle:
    
        android {
            buildTypes {
                debug {
                  // Disable fabric build ID generation for debug builds
                  ext.enableCrashlytics = false
                  ...
        2. Disable the Crashlytics kit at runtime. Otherwise, the Crashlytics kit will throw the error:
    
        // Set up Crashlytics, disabled for debug builds
        // Add These lines in your app Application class onCreate method
    
        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);
    
        3. In AndroidManifest.xml, add
        <meta-data android:name="firebase_crashlytics_collection_enabled" android:value="false" />
    
  • 2

    您可以使用 dedicated manifest file 进行调试模式(适用于Crashlytics 2.9.7):

    创建文件 app/src/debug/AndroidManifest.xml 并添加以下内容:

    <application>
    
        <meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="false"/>
    
    </application>
    

    请注意,此元数据元素必须放入debug / AndroidManifest.xml only ,而不是放入常规AndroidManifest.xml

    使用 CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build() 的解决方案对我不起作用,我发现在调用Application.onCreate()或启动任何活动之前,CrashlyticsInitProvider会初始化crashlytics,这意味着在应用程序或活动中手动初始化fabric没有效果,因为织物已经初始化 .

  • 6

    我知道这是愚蠢的答案
    只需注释掉 Fabric.with(this, new Crashlytics()); ,就可以解决这个问题,并在想要发布它时取消注释 .

相关问题