gradle - the - Utilice Crashlytics dentro del sabor de un producto en Android Studio
install fabric (5)
Muchas gracias a @bonnell por responder mi pregunta por correo electrónico.
Simplemente agregue ext.enableCrashlytics = false a cualquier compilación / sabor del que no desee que forme parte Crashlytics.
Para una respuesta completa que resuelve mi problema:
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.+''
}
Estoy usando Android Studio para desarrollar mi aplicación y hacer uso de gradle creando algunos sabores de producto. Los sabores del producto son google, beta y lab.
Solo quiero integrar Crashlytics con un sabor de producto ( beta ) pero me encuentro con un problema que no he podido resolver.
Con el archivo build.gradle actual, puedo obtener la variante de compilación betaDebug y betaRelease para compilar, sin embargo, no puedo hacer que los demás compilen.
Además, no he podido lograr que Crashlytics reconozca mi aplicación después de iniciar con éxito la variante de compilación betaDebug.
El error que recibo cuando cambio a una variante de compilación diferente:
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''.
Aquí está mi archivo 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.+''
}
Aquí está la consola Gradle cuando la aplicación no puede compilar:
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
Para cualquier otra persona que tenga este problema, mi problema es que la clave Crashlytics no está definida en mi archivo AndroidManifest.xml, por ejemplo:
<?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>
Si quiero compartir la compilación a través de crashlytics.
Necesito instalar el complemento de Fabric & register Después de eso ...
**
debug {ext.enableCrashlytics = true}
**
después de compilar la aplicación, podemos compartirla fácilmente a través de crashlytics
Gracias
Tuve un problema similar: tuve que desactivar los informes de crashlytics en compilaciones de depuración. La respuesta de Michael no me ayudó: la aplicación destruida por crashlytics al inicio después de agregar ext.enableCrashlytics = false
a gradle configuration. Gracias a Github encontré una solución funcional:
build.gradle:
//...
android {
buildTypes {
debug {
// enable crashlytics where you need
buildConfigField "boolean", "USE_CRASHLYTICS", "false"
ext.enableCrashlytics = false
}
}
}
// ...
y clase de aplicación :
@Override
public void onCreate() {
//...
if ( BuildConfig.USE_CRASHLYTICS ) {
Crashlytics.start(this);
}
//...
}
EDITAR
De acuerdo con el comentario de slott : con Fabric deberías usar algo como esto:
Fabric.with(this, new Crashlytics.Builder().core(new CrashlyticsCore.Builder().disabled(!BuildConfig.USE_CRASHLYTICS).build()).build());
para detener crashlytics para compilaciones de depuración, agregué el código siguiente después del código de inicialización en la primera actividad (inicial)
CrashlyticsCore core = new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build();
Fabric.with(this, new Crashlytics.Builder().core(core).build(), new Crashlytics());