2014-02-19 39 views
39

我正在使用Android Studio開發我的應用程序並通過創建少量產品風格來利用gradle。產品口味是谷歌,測試版和實驗室。在Android Studio中使用產品風格中的Crashlytics

我只想將Crashlytics與一種產品風味(beta)集成,但我遇到了一個我無法解決的問題。

使用當前的build.gradle文件,我能夠獲得構建變體betaDebug和betaRelease進行編譯,但是,我無法讓其他人編譯。

此外,我還沒有能夠讓Crashlytics在成功啓動betaDebug構建變​​體後識別我的應用程序。

當我切換到不同的構建變量我得到的錯誤:

Gradle Running 

Failed to complete Gradle exection. 

Cause: 
Could not execute build using Gradle distribution 'http://services.gradle.org/distributions/gradle-1.10-all.zip'. 

這裏是我的build.gradle文件:

buildscript { 
    repositories { 
     maven { url 'http://download.crashlytics.com/maven' } 
    } 

    dependencies { 
     classpath 'com.crashlytics.tools.gradle:crashlytics-gradle:1.+' 
    } 
} 
apply plugin: 'android' 
apply plugin: 'crashlytics' 
repositories { 
    maven { url 'http://download.crashlytics.com/maven' } 
} 


android { 
    compileSdkVersion 19 
    buildToolsVersion "19.0.1" 

    defaultConfig { 
     minSdkVersion 8 
     targetSdkVersion 19 
     versionCode 1 
     versionName "1.0" 
     packageName "com.mcarrano.example" 
    } 

    buildTypes { 
     debug { 
      packageNameSuffix '.debug' 
      versionNameSuffix '-DEBUG' 
     } 

     release { 
      runProguard true 
      debuggable false 
      proguardFile 'proguard-rules.txt' 
      proguardFile getDefaultProguardFile('proguard-android-optimize.txt') 
     } 
    } 

    productFlavors { 
     google { 
      packageName = android.defaultConfig.packageName 
      versionName = android.defaultConfig.versionName 
     } 
     beta { 
      packageName = android.defaultConfig.packageName + ".beta" 
      versionName = android.defaultConfig.versionName + "-BETA" 
     } 
     lab { 
      packageName = android.defaultConfig.packageName + ".lab" 
      versionName = android.defaultConfig.versionName + "-LAB" 
     } 
    } 

    sourceSets { 
     main { 
      manifest.srcFile 'src/main/AndroidManifest.xml' 
      java.srcDirs = ['src/main/java'] 
      res.srcDirs = ['src/main/res'] 
      assets.srcDirs = ['src/main/assets'] 
     } 
     google { 
      java.srcDirs = ['src/google/java'] 
     } 
     beta { 
      manifest.srcFile 'src/beta/AndroidManifest.xml' 
      java.srcDirs = ['src/beta/java'] 
     } 
     lab { 
      java.srcDirs = ['src/lab/java'] 
     } 
    } 

} 

dependencies { 
    compile 'com.android.support:support-v4:19.0.+' 
    compile 'com.android.support:appcompat-v7:19.0.+' 
    betaCompile 'com.crashlytics.android:crashlytics:1.+' 
} 

這裏是搖籃控制檯當應用程序編譯失敗:

Executing tasks: [:example:generateGoogleDebugSources] 

Relying on packaging to define the extension of the main artifact has been deprecated and is scheduled to be removed in Gradle 2.0 
:example:preBuild 
:example:preGoogleDebugBuild 
:example:checkGoogleDebugManifest 
:example:preBetaDebugBuild 
:example:preBetaReleaseBuild 
:example:preGoogleReleaseBuild 
:example:preLabDebugBuild 
:example:preLabReleaseBuild 
:example:prepareComAndroidSupportAppcompatV71901Library UP-TO-DATE 
:example:prepareGoogleDebugDependencies 
:example:compileGoogleDebugAidl UP-TO-DATE 
:example:compileGoogleDebugRenderscript UP-TO-DATE 
:example:generateGoogleDebugBuildConfig UP-TO-DATE 
:example:processGoogleDebugManifest UP-TO-DATE 
:example:crashlyticsCleanupResourcesGoogleDebug 
ERROR - Crashlytics Developer Tools error. 
java.lang.IllegalArgumentException: Invalid API key: null. Check the Crashlytics plugin to make sure that the application has been added successfully! Contact [email protected] for assistance. 
    at com.crashlytics.tools.android.DeveloperTools.processProperties(DeveloperTools.java:439) 
    at com.crashlytics.tools.android.DeveloperTools.processArgs(DeveloperTools.java:325) 
    at com.crashlytics.tools.android.DeveloperTools.main(DeveloperTools.java:285) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) 
    at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:43) 
    at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:88) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) 
    at com.crashlytics.tools.gradle.CrashlyticsTaskBuilder.callDevtoolsWrappingRuntimeExceptions(CrashlyticsTaskBuilder.groovy:136) 
    at com.crashlytics.tools.gradle.CrashlyticsTaskBuilder.this$2$callDevtoolsWrappingRuntimeExceptions(CrashlyticsTaskBuilder.groovy) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) 
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:361) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:877) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141) 
    at com.crashlytics.tools.gradle.CrashlyticsTaskBuilder$_crashlyticsCleanupResources_closure2.doCall(CrashlyticsTaskBuilder.groovy:57) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) 
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:877) 
    at groovy.lang.Closure.call(Closure.java:412) 
    at groovy.lang.Closure.call(Closure.java:425) 
    at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:502) 
    at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:483) 
    at org.gradle.api.internal.tasks.TaskStatusNagger$1.execute(TaskStatusNagger.java:77) 
    at org.gradle.api.internal.tasks.TaskStatusNagger$1.execute(TaskStatusNagger.java:73) 
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80) 
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61) 
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) 
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35) 
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64) 
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) 
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42) 
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) 
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53) 
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) 
    at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:289) 
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79) 
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63) 
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51) 
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$1.run(DefaultTaskPlanExecutor.java:33) 
    at org.gradle.internal.Factories$1.create(Factories.java:22) 
    at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:198) 
    at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:266) 
    at org.gradle.cache.internal.DefaultPersistentDirectoryStore.longRunningOperation(DefaultPersistentDirectoryStore.java:135) 
    at org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.longRunningOperation(DefaultTaskArtifactStateCacheAccess.java:95) 
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:31) 
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:86) 
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29) 
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61) 
    at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23) 
    at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:67) 
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32) 
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61) 
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:54) 
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:166) 
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:113) 
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:81) 
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:64) 
    at org.gradle.tooling.internal.provider.BuildModelAction.run(BuildModelAction.java:70) 
    at org.gradle.tooling.internal.provider.BuildModelAction.run(BuildModelAction.java:30) 
    at org.gradle.tooling.internal.provider.ConfiguringBuildAction.run(ConfiguringBuildAction.java:108) 
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:35) 
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:45) 
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125) 
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:42) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125) 
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:24) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125) 
    at org.gradle.launcher.daemon.server.exec.StartStopIfBuildAndStop.execute(StartStopIfBuildAndStop.java:33) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125) 
    at org.gradle.launcher.daemon.server.exec.ReturnResult.execute(ReturnResult.java:34) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125) 
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:71) 
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:69) 
    at org.gradle.util.Swapper.swap(Swapper.java:38) 
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:69) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125) 
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60) 
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125) 
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:60) 
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125) 
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:45) 
    at org.gradle.launcher.daemon.server.DaemonStateCoordinator.runCommand(DaemonStateCoordinator.java:186) 
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy.doBuild(StartBuildOrRespondWithBusy.java:49) 
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125) 
    at org.gradle.launcher.daemon.server.exec.HandleStop.execute(HandleStop.java:36) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125) 
    at org.gradle.launcher.daemon.server.exec.DaemonHygieneAction.execute(DaemonHygieneAction.java:39) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125) 
    at org.gradle.launcher.daemon.server.exec.CatchAndForwardDaemonFailure.execute(CatchAndForwardDaemonFailure.java:32) 
    at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:125) 
    at org.gradle.launcher.daemon.server.exec.DefaultDaemonCommandExecuter.executeCommand(DefaultDaemonCommandExecuter.java:51) 
    at org.gradle.launcher.daemon.server.DefaultIncomingConnectionHandler$ConnectionWorker.handleCommand(DefaultIncomingConnectionHandler.java:155) 
    at org.gradle.launcher.daemon.server.DefaultIncomingConnectionHandler$ConnectionWorker.receiveAndHandleCommand(DefaultIncomingConnectionHandler.java:128) 
    at org.gradle.launcher.daemon.server.DefaultIncomingConnectionHandler$ConnectionWorker.run(DefaultIncomingConnectionHandler.java:116) 
    at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 
    at java.lang.Thread.run(Thread.java:695) 
usage: com.crashlytics.tools.android.DeveloperTools 
-androidManifest <androidManifestPath> Path to AndroidManifest.xml) 
-androidRes <androidResPath>    Path to Android resources (res/ 
              folder) 
-apiSecret <key>       API Secret for the project 
-buildEvent        Notify Crashlytics that a build 
              event has occurred 
-cleanupResourceFile      Remove Crashlytics-generated 
              resource files 
-generateResourceFile     Generate Crashlytics-required 
              resources for the project. 
-help         Display command help. 
-obfuscator <obfuscatorId>    Optionally specify an obfuscator 
              vendor identifier for use with 
              storeDeobs. 
-obVer <obfuscatorVersion>    Optionally specify the 
              obfuscator vendor software 
              version for use with obfuscator. 
-projectPath <path>      Path to Android project root 
-properties <propertiesarg>    Properties file that overrides 
              the input properties 
-quiet         Silent command line output 
-requireUploadSuccess     Throw an exception if the 
              deobfuscation upload was not 
              successful 
-resourceCheck       Check if a resource file already 
              exists. 
-storeDeobs <file>      Store the specified 
              deobfuscation file in 
              preparation for upload. 
-tool <toolarg>       Name of the build tool 
-uploadDeobs        Attempt to upload deobfuscation 
              file(s) to Crashlytics servers. 
-uploadDist <file> 
-verbose         Verbose command line output 
-version <versionarg>     Version of the build tool 
+0

我們需要更多的輸出繼續。這是您在構建Gradle控制檯時看到的內容?如果您從命令行構建違規風味,還有什麼更多? –

+0

用Gradle控制檯更新了我的問題。看起來Crashlytics正在尋找API Key,即使我只希望它與Beta產品的味道一起編譯,這就是爲什麼我爲它指定了AndroidManifest.xml的原因。 – michaelcarrano

回答

16

非常感謝@bonnell通過電子郵件回答我的問題。

只需將ext.enableCrashlytics = false添加到您不希望Crashlytics加入的任何構建/風格中。

對於解決我的問題一個完整的答案:

buildscript { 
    repositories { 
     maven { url 'http://download.crashlytics.com/maven' } 
    } 

    dependencies { 
     classpath 'com.crashlytics.tools.gradle:crashlytics-gradle:1.+' 
    } 
} 
apply plugin: 'android' 
apply plugin: 'crashlytics' 
repositories { 
    maven { url 'http://download.crashlytics.com/maven' } 
} 


android { 
    compileSdkVersion 19 
    buildToolsVersion "19.0.1" 

    defaultConfig { 
     minSdkVersion 8 
     targetSdkVersion 19 
     versionCode 1 
     versionName "1.0" 
     packageName "com.mcarrano.example" 
    } 

    buildTypes { 
     debug { 
      packageNameSuffix '.debug' 
      versionNameSuffix '-DEBUG' 
     } 

     release { 
      runProguard true 
      debuggable false 
      proguardFile 'proguard-rules.txt' 
      proguardFile getDefaultProguardFile('proguard-android-optimize.txt') 
     } 
    } 

    productFlavors { 
     google { 
      packageName = android.defaultConfig.packageName 
      versionName = android.defaultConfig.versionName 
      ext.enableCrashlytics = false 
     } 
     beta { 
      packageName = android.defaultConfig.packageName + ".beta" 
      versionName = android.defaultConfig.versionName + "-BETA" 
     } 
     lab { 
      packageName = android.defaultConfig.packageName + ".lab" 
      versionName = android.defaultConfig.versionName + "-LAB" 
      ext.enableCrashlytics = false 
     } 
    } 

    sourceSets { 
     main { 
      manifest.srcFile 'src/main/AndroidManifest.xml' 
      java.srcDirs = ['src/main/java'] 
      res.srcDirs = ['src/main/res'] 
      assets.srcDirs = ['src/main/assets'] 
     } 
     google { 
      java.srcDirs = ['src/google/java'] 
     } 
     beta { 
      manifest.srcFile 'src/beta/AndroidManifest.xml' 
      java.srcDirs = ['src/beta/java'] 
     } 
     lab { 
      java.srcDirs = ['src/lab/java'] 
     } 
    } 

} 

dependencies { 
    compile 'com.android.support:support-v4:19.0.+' 
    compile 'com.android.support:appcompat-v7:19.0.+' 
    betaCompile 'com.crashlytics.android:crashlytics:1.+' 
} 
+0

在buildTypes部分中使用時似乎不起作用,而SO中的用戶在放置到productFlavors時報告 - 按預期工作。 –

+1

隨着新的fabric.io這不再起作用。解決方案是:Fabric.with(this,new Crashlytics.Builder()。core(new CrashlyticsCore.Builder()。disabled(BuildConfig.DEBUG).build())。build()); - – slott

+0

在哪裏添加該插槽? Gradle的哪一部分? – portfoliobuilder

40

有類似的問題:我在調試版本關閉crashlytics的報告。邁克爾的回答沒有幫助我:crashlytics在開始添加ext.enableCrashlytics = false到gradle配置後破壞了應用程序。由於Github上我發現了一個可行的解決方案:

的build.gradle:

//... 
android { 
    buildTypes { 
     debug { 
      // enable crashlytics where you need 
      buildConfigField "boolean", "USE_CRASHLYTICS", "false" 
      ext.enableCrashlytics = false 
     } 
    } 
} 
// ... 

應用程序類

@Override 
public void onCreate() { 
    //... 
    if (BuildConfig.USE_CRASHLYTICS) { 
     Crashlytics.start(this); 
    } 
    //... 
} 

編輯

slott's comment:與織物你應該使用這樣的事情:

Fabric.with(this, new Crashlytics.Builder().core(new CrashlyticsCore.Builder().disabled(!BuildConfig.USE_CRASHLYTICS).build()).build()); 
+1

所以在我的情況下,我不希望Crashlytics在我的谷歌或實驗室產品的風格中被編譯,這是ext.enableCrashlytics的工作原理。隨着產品的風味,我會在所有產品風味源中聲明MainActivity.java,但我不會引用Crashlytics。在你的情況下,因爲你只是使用buildtype,它會在代碼中引用Crashlytics,但是Crashlytics不會被編譯,所以它會崩潰。解決方法是創建一個用於調試的源文件夾,但這不是真正使用buildtypes的正確方法。 – michaelcarrano

+0

@lassana您的解決方案對我解決錯誤非常合適:'無法使用Gradle分發執行構建' –

+1

隨着新的fabric.io,這不再有效。解決方案是: Fabric.with(this,new Crashlytics.Builder()。core(new CrashlyticsCore.Builder()。disabled(BuildConfig.DEBUG).build())。build()); – slott

3

爲了其他任何人有這個問題,是該Crashlytics關鍵是不是在我的AndroidManifest.xml文件中定義了我的問題,例如:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.example.myapp" 
      android:versionCode="1" 
      android:versionName="1.0"> 

    <uses-permission android:name="android.permission.INTERNET"/> 

    <application android:label="@string/app_name"> 
     <activity android:name="MyActivity" android:label="@string/app_name" /> 

     <meta-data android:name="com.crashlytics.ApiKey" 
        android:value="YOUR_API_KEY"/> 
    </application> 
</manifest> 
+1

感謝這是實際記錄的任何地方,或者他們只是期望每個人都使用插件? – schwiz

+0

試圖今天安裝它,並堅持這一點。找到這個鏈接,但要聯繫支持。 https://dev.twitter.com/fabric/android/integrating –

0

如果我想通過crashlytics共享構建。

我需要安裝插件面料寄存器&後 的..

**

debug { ext.enableCrashlytics = true }

**

構建應用程序之後,我們就可以很容易地通過crashlytics共享

謝謝

0

停止調試版本的crashlytics,我在第一個(啓動)活動中初始化代碼後添加下面的代碼

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