Replace Crashlytics with ACRA

Signed-off-by: William Brawner <me@wbrawner.com>
This commit is contained in:
William Brawner 2020-04-19 08:50:24 -07:00
parent c01581dbd2
commit 5c04dd0e8f
6 changed files with 65 additions and 17 deletions

1
app/.gitignore vendored
View file

@ -1,3 +1,4 @@
/build /build
*.apk *.apk
/release /release
acra.properties

View file

@ -2,7 +2,6 @@ apply plugin: 'com.android.application'
apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-kapt'
apply plugin: 'io.fabric'
apply plugin: 'jacoco' apply plugin: 'jacoco'
def keystoreProperties = new Properties() def keystoreProperties = new Properties()
@ -17,6 +16,17 @@ try {
keystoreProperties['storePassword'] = "" keystoreProperties['storePassword'] = ""
} }
def acraProperties = new Properties()
try {
def acraPropertiesFile = project.file("acra.properties")
acraProperties.load(new FileInputStream(acraPropertiesFile))
} catch (FileNotFoundException ignored) {
logger.warn("Unable to load ACRA properties. Error reporting won't be available")
acraProperties['url'] = ""
acraProperties['user'] = ""
acraProperties['pass'] = ""
}
android { android {
configurations.all { configurations.all {
resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.1' resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.1'
@ -42,6 +52,9 @@ android {
versionName "0.8.2" versionName "0.8.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
buildConfigField "boolean", "ENABLE_CUSTOM_CSS", "false" buildConfigField "boolean", "ENABLE_CUSTOM_CSS", "false"
buildConfigField "String", "ACRA_URL", "\"${acraProperties['url']}\""
buildConfigField "String", "ACRA_USER", "\"${acraProperties['user']}\""
buildConfigField "String", "ACRA_PASS", "\"${acraProperties['pass']}\""
} }
signingConfigs { signingConfigs {
release { release {
@ -95,7 +108,6 @@ dependencies {
implementation 'com.commonsware.cwac:anddown:0.3.0' implementation 'com.commonsware.cwac:anddown:0.3.0'
implementation 'com.google.firebase:firebase-core:17.2.3' implementation 'com.google.firebase:firebase-core:17.2.3'
implementation 'com.android.billingclient:billing:2.1.0' implementation 'com.android.billingclient:billing:2.1.0'
implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
implementation "androidx.core:core-ktx:1.2.0" implementation "androidx.core:core-ktx:1.2.0"
implementation 'androidx.browser:browser:1.2.0' implementation 'androidx.browser:browser:1.2.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
@ -107,9 +119,14 @@ dependencies {
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
kapt "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" kapt "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation 'eu.crydee:syllable-counter:4.0.2' implementation 'eu.crydee:syllable-counter:4.0.2'
def acraVersion = '5.2.0-rc1'
implementation "ch.acra:acra-http:$acraVersion"
implementation "ch.acra:acra-advanced-scheduler:$acraVersion"
} }
apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.gms.google-services'
repositories { repositories {
mavenCentral() mavenCentral()
} }

View file

@ -1,27 +1,35 @@
package com.wbrawner.simplemarkdown package com.wbrawner.simplemarkdown
import android.app.Application import android.app.Application
import android.content.Context
import android.os.StrictMode import android.os.StrictMode
import com.wbrawner.simplemarkdown.utility.CrashlyticsErrorHandler import androidx.preference.PreferenceManager
import com.wbrawner.simplemarkdown.utility.AcraErrorHandler
import com.wbrawner.simplemarkdown.utility.ErrorHandler import com.wbrawner.simplemarkdown.utility.ErrorHandler
class MarkdownApplication : Application() { class MarkdownApplication : Application() {
val errorHandler: ErrorHandler by lazy { val errorHandler: ErrorHandler by lazy {
CrashlyticsErrorHandler() AcraErrorHandler()
} }
override fun onCreate() { override fun onCreate() {
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder() StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()
.detectAll() .detectAll()
.penaltyDeath() .penaltyLog()
.build()) .build())
StrictMode.setVmPolicy(StrictMode.VmPolicy.Builder() StrictMode.setVmPolicy(StrictMode.VmPolicy.Builder()
.detectAll() .detectAll()
.penaltyLog() .penaltyLog()
.penaltyDeath()
.build()) .build())
} }
super.onCreate() super.onCreate()
} }
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
val enableErrorLogging = PreferenceManager.getDefaultSharedPreferences(this)
.getBoolean(getString(R.string.pref_key_error_reports_enabled), true)
if (enableErrorLogging) errorHandler.init(this)
}
} }

View file

@ -1,33 +1,56 @@
package com.wbrawner.simplemarkdown.utility package com.wbrawner.simplemarkdown.utility
import android.content.Context import android.app.Application
import android.util.Log import android.util.Log
import com.crashlytics.android.Crashlytics import com.evernote.android.job.JobRequest
import com.wbrawner.simplemarkdown.BuildConfig import com.wbrawner.simplemarkdown.BuildConfig
import io.fabric.sdk.android.Fabric import org.acra.ACRA
import org.acra.config.CoreConfigurationBuilder
import org.acra.config.HttpSenderConfigurationBuilder
import org.acra.config.SchedulerConfigurationBuilder
import org.acra.data.StringFormat
import org.acra.sender.HttpSender
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
interface ErrorHandler { interface ErrorHandler {
fun init(context: Context) fun init(application: Application)
fun reportException(t: Throwable, message: String? = null) fun reportException(t: Throwable, message: String? = null)
} }
class CrashlyticsErrorHandler : ErrorHandler { class AcraErrorHandler : ErrorHandler {
private val isInitialized = AtomicBoolean(false) private val isInitialized = AtomicBoolean(false)
override fun init(context: Context) { override fun init(application: Application) {
if (BuildConfig.ACRA_URL.isBlank()
|| BuildConfig.ACRA_USER.isBlank()
|| BuildConfig.ACRA_PASS.isBlank()) {
return
}
if (!isInitialized.getAndSet(true)) { if (!isInitialized.getAndSet(true)) {
Fabric.with(context, Crashlytics()) val builder = CoreConfigurationBuilder(application)
.setBuildConfigClass(BuildConfig::class.java)
.setReportFormat(StringFormat.JSON)
builder.getPluginConfigurationBuilder(HttpSenderConfigurationBuilder::class.java)
.setUri(BuildConfig.ACRA_URL)
.setHttpMethod(HttpSender.Method.POST)
.setBasicAuthLogin(BuildConfig.ACRA_USER)
.setBasicAuthPassword(BuildConfig.ACRA_PASS)
.setEnabled(true)
builder.getPluginConfigurationBuilder(SchedulerConfigurationBuilder::class.java)
.setRequiresNetworkType(JobRequest.NetworkType.UNMETERED)
.setRequiresBatteryNotLow(true)
.setEnabled(true)
ACRA.init(application, builder)
} }
} }
override fun reportException(t: Throwable, message: String?) { override fun reportException(t: Throwable, message: String?) {
@Suppress("ConstantConditionIf") @Suppress("ConstantConditionIf")
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
Log.e("CrashlyticsErrorHandler", "Caught exception: $message", t) Log.e("AcraErrorHandler", "Caught exception: $message", t)
return return
} }
if (!isInitialized.get()) return if (!isInitialized.get()) return
Crashlytics.logException(t) ACRA.getErrorReporter().handleException(t)
} }
} }

View file

@ -34,7 +34,7 @@
<string name="action_lock_swipe">Lock Swiping</string> <string name="action_lock_swipe">Lock Swiping</string>
<string name="action_select">Select</string> <string name="action_select">Select</string>
<string name="action_privacy">Privacy</string> <string name="action_privacy">Privacy</string>
<string name="error_reports_enabled">crashlytics.enable</string> <string name="pref_key_error_reports_enabled">acra.enable</string>
<string name="pref_title_error_reports">Enable automated error reports</string> <string name="pref_title_error_reports">Enable automated error reports</string>
<string name="pref_error_reports_off">Error reports will not be sent</string> <string name="pref_error_reports_off">Error reports will not be sent</string>
<string name="pref_error_reports_on">Error reports will be sent</string> <string name="pref_error_reports_on">Error reports will be sent</string>

View file

@ -12,7 +12,6 @@ buildscript {
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.6.1' classpath 'com.android.tools.build:gradle:3.6.1'
classpath 'com.google.gms:google-services:4.3.3' classpath 'com.google.gms:google-services:4.3.3'
classpath 'io.fabric.tools:gradle:1.31.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
} }
} }