Cómo deshabilitar Fabric cuando se ejecuta la testing

¿Cómo puedo desactivar Fabric: Crashlytics y Answer cuando ejecuto la testing?

¿Hay alguna otra forma de desactivar Crashlytics durante la testing en lugar de poner este código antes de cada testing?

@LargeTest @RunWith(AndroidJUnit4::class) class AcceptanceTest { @Before fun setUp() { val crashlyticsKit = Crashlytics.Builder() .core(CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) .build() Fabric.with(InstrumentationRegistry.getContext(), crashlyticsKit) } } 

y evitando poner un boolean global como IS_TEST_MODE

Encuentro una forma mejor y más limpia de deshabilitar y administrar Fabric.

En mi aplicación uso slf4j-api , una API de logging que se usa mucho en el desarrollo web. Con esta API puedes crear un appender, así que decidí crear un apéndice Fabric y usar este appender solo cuando se ejecuta la aplicación.

Cómo

Instalar slf4j con Logback

Establece tu build.gradle

 dependencies { ... // Log compile 'com.github.tony19:logback-android-core:1.1.1-6' compile 'com.github.tony19:logback-android-classic:1.1.1-6' compile 'org.slf4j:slf4j-api:1.7.21' } 

Agregar src/main/assets/logback.xml

 <configuration> <appender name="FABRIC" class="path/to/your/FabricAppender" /> <appender name="LOGCAT" class="ch.qos.logback.classic.android.LogcatAppender"> <tagEncoder> <pattern>%logger{0}</pattern> </tagEncoder> <encoder> <pattern>[PUP] %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="LOGCAT" /> <appender-ref ref="FABRIC" /> </root> 

De forma pnetworkingeterminada, Logback tiene un appender personalizado que trabaja con Logback . Puede comentar la parte FABRIC que explicaremos más adelante.

Agregar src/androidTest/assets/logback.xml

 <configuration> <appender name="LOGCAT" class="ch.qos.logback.classic.android.LogcatAppender"> <tagEncoder> <pattern>%logger{0}</pattern> </tagEncoder> <encoder> <pattern>[PUP] %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="LOGCAT" /> </root> </configuration> 

¡No quieres tener un astackdor de Tejidos aquí! porque quieres que tu testing instrumentada se ejecute solo con Logcat

Usar Logback

Ahora puede iniciar session fácilmente utilizando la poderosa API de slf4j como a continuación

 class MainActivity : AppCompatActivity() { private val log = LoggerFactory.getLogger(javaClass)!! // Call your logger in each class with this line override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) log.info("Activity start") // ... } } 

Establecer tejido para Logback

Crea en tu proyecto FabricAppender.kt

 package your.package.log import android.content.Context import ch.qos.logback.classic.Level import ch.qos.logback.classic.spi.ILoggingEvent import ch.qos.logback.classic.spi.ThrowableProxy import ch.qos.logback.core.UnsynchronizedAppenderBase import com.crashlytics.android.Crashlytics import com.crashlytics.android.answers.Answers import com.crashlytics.android.answers.CustomEvent import io.fabric.sdk.android.Fabric class FabricAppender : UnsynchronizedAppenderBase<ILoggingEvent>() { companion object { private var isFabricInit = false fun init(context: Context) { Fabric.with(context, Crashlytics(), Answers()) isFabricInit = true } } override fun append(event: ILoggingEvent) { if (isFabricInit.not()) return when (event.level.levelInt) { Level.ERROR_INT -> { val throwable = (event.throwableProxy as ThrowableProxy).throwable if (throwable != null) { Crashlytics.logException(throwable) } else { Crashlytics.log(event.message.replace(": {}", "")) } } } } } 

Este appender enviará una exception a Crashlytics cada vez que llame a log.error("Something wrong happen!!") Ha log.error("Something wrong happen!!") . Como puede ver, puede personalizar completamente el appender.

Inicia el appender cuando el inicio de la aplicación

 class MainActivity : AppCompatActivity() { private val log = LoggerFactory.getLogger(javaClass)!! // Call your logger in each class with this line override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) FabricAppender.init(this) // Init before the first log log.info("Activity start") // ... } } 

Finalmente

Ahora su tela estará totalmente aislada de su código mediante el uso de la API slf4j , y no se utilizará durante su testing instrumentada yataaa !!! Puede encontrar otro appender en internet (enviar a ELK, file, etc.)

Usa sabores.

Por defecto, tiene un sabor llamado main , donde debe poner toda la base de su código, activos y manifiestos, que se utilizan en desarrollo, testing y producción. Puede crear fácilmente un nuevo sabor agregando su nombre de sabor en buildTypes { ... } en el file build.gradle de su module. Esto le permite dividir las dependencies y eliminar fácilmente todo lo que no quiera o incluso necesite en sus versiones de lanzamiento. Puedes leer más sobre sabores aquí . De esta forma, podrás separar el código central en el sabor principal y agregar crashlytics solo en tus comstackciones de lanzamiento.

Por ejemplo, en tu sabor principal:

 open class BaseApplication : Application() { fun onCreate() { [common code between flavors] } } 

Luego en tu sabor de lanzamiento

 open class MainApplication : BaseApplication() { fun onCreate() { [initialize crashlytics] } } 

Y en tus otros sabores

 open class MainApplication : BaseApplication() 

Nota: Use MainApplication lugar de BaseApplication en su manifiesto.

  • reproducir cualquier video embedded en la vista web en Android con intención
  • ¿Cómo puedo declarar una list con valores en una sola línea en kotlin?
  • Cómo forzar que algún método sea visible solo para kotlin
  • Java / Kotlin Encrypt AES key con key privada y pública
  • Mockito querido pero no invocado
  • Kotlin: ¿Java no puede resolver el símbolo de Kotlin?
  • Cómo crear el controller de respuesta genérica para el error y validar la respuesta utilizando retrofit, rxjava y dagger
  • Kotlin no puede acceder a kotlin.jvm.functions.Function1 cuando llama a la function kotlin con java lambda
  • La variable de vista de Kotlin es inesperadamente nula en el método Activity onCreate
  • Cuando la expresión en kotlin no funciona como se esperaba
  • El contenido del fragment está oculto detrás de BottomNavigationView cuando se desplaza