Commit edbfb041 authored by Daniel Wolf's avatar Daniel Wolf
Browse files

Ignore all exceptions when creating the Sentry client, only try to access it if it is initialized

parent 127cf86e
Pipeline #5984 passed with stage
in 2 minutes and 12 seconds
...@@ -94,7 +94,7 @@ fun Context.log( ...@@ -94,7 +94,7 @@ fun Context.log(
} }
fun Context.log(e: Throwable, extras: Map<String, String>? = null) { fun Context.log(e: Throwable, extras: Map<String, String>? = null) {
logErrorSentry(e, extras) if(SmokeScreen.sentryReady) logErrorSentry(e, extras)
getPreferences().lastCrashTimeStamp = System.currentTimeMillis() getPreferences().lastCrashTimeStamp = System.currentTimeMillis()
if (Logger.isEnabled(this)) { if (Logger.isEnabled(this)) {
Logger.getInstance(this).log(e) Logger.getInstance(this).log(e)
......
...@@ -45,7 +45,10 @@ import kotlin.system.exitProcess ...@@ -45,7 +45,10 @@ import kotlin.system.exitProcess
* You can contact the developer at daniel.wolf@frostnerd.com. * You can contact the developer at daniel.wolf@frostnerd.com.
*/ */
class SmokeScreen : Application() { class SmokeScreen : Application() {
companion object {
var sentryReady:Boolean = false
private set
}
private var defaultUncaughtExceptionHandler: Thread.UncaughtExceptionHandler? = null private var defaultUncaughtExceptionHandler: Thread.UncaughtExceptionHandler? = null
val customUncaughtExceptionHandler = EnrichableUncaughtExceptionHandler() val customUncaughtExceptionHandler = EnrichableUncaughtExceptionHandler()
private fun showCrashNotification() { private fun showCrashNotification() {
...@@ -95,65 +98,77 @@ class SmokeScreen : Application() { ...@@ -95,65 +98,77 @@ class SmokeScreen : Application() {
LeakSentry.watchIfEnabled(this) LeakSentry.watchIfEnabled(this)
} }
fun closeSentry() {
Sentry.close()
sentryReady = false
}
fun initSentry(forceStatus: Status = Status.NONE) { fun initSentry(forceStatus: Status = Status.NONE) {
if (!BuildConfig.DEBUG && BuildConfig.SENTRY_DSN != "dummy") { if (!BuildConfig.DEBUG && BuildConfig.SENTRY_DSN != "dummy") {
GlobalScope.launch(Dispatchers.IO) { GlobalScope.launch(Dispatchers.IO) {
val hostName = InetAddress.getLocalHost().hostName sentryReady = false
if(!hostName.startsWith("mars-sandbox", true)) { try {
val enabledType = getPreferences().crashreportingType val hostName = InetAddress.getLocalHost().hostName
if (forceStatus != Status.DATASAVING && (enabledType == Crashreporting.FULL || forceStatus == Status.ENABLED)) { if(!hostName.startsWith("mars-sandbox", true)) {
// Enable Sentry in full mode val enabledType = getPreferences().crashreportingType
// This passes some device-related data, but nothing which allows user actions to be tracked across the app if (forceStatus != Status.DATASAVING && (enabledType == Crashreporting.FULL || forceStatus == Status.ENABLED)) {
// Info: Some data is attached by the AndroidEventBuilderHelper class, which is present by default // Enable Sentry in full mode
// This passes some device-related data, but nothing which allows user actions to be tracked across the app
Sentry.init( // Info: Some data is attached by the AndroidEventBuilderHelper class, which is present by default
BuildConfig.SENTRY_DSN,
AndroidSentryClientFactory(this@SmokeScreen) Sentry.init(
) BuildConfig.SENTRY_DSN,
Sentry.getContext().user = AndroidSentryClientFactory(this@SmokeScreen)
User(getPreferences().crashReportingUUID, null, null, null)
Sentry.getStoredClient().apply {
addTag("user.language", Locale.getDefault().displayLanguage)
addTag("app.database_version", AppDatabase.currentVersion.toString())
addTag("app.dns_server_name", getPreferences().dnsServerConfig.name)
addTag(
"app.dns_server_primary",
getPreferences().dnsServerConfig.servers[0].address.formatToString()
) )
addTag( Sentry.getContext().user =
"app.dns_server_secondary", User(getPreferences().crashReportingUUID, null, null, null)
getPreferences().dnsServerConfig.servers.getOrNull(1)?.address?.formatToString() Sentry.getStoredClient().apply {
) addTag("user.language", Locale.getDefault().displayLanguage)
addTag( addTag("app.database_version", AppDatabase.currentVersion.toString())
"app.installer_package", addTag("app.dns_server_name", getPreferences().dnsServerConfig.name)
packageManager.getInstallerPackageName(packageName) addTag(
"app.dns_server_primary",
getPreferences().dnsServerConfig.servers[0].address.formatToString()
)
addTag(
"app.dns_server_secondary",
getPreferences().dnsServerConfig.servers.getOrNull(1)?.address?.formatToString()
)
addTag(
"app.installer_package",
packageManager.getInstallerPackageName(packageName)
)
addTag("richdata", "true")
addTag("app.fromCi", BuildConfig.FROM_CI.toString())
addTag("app.commit", BuildConfig.COMMIT_HASH)
}
sentryReady = true
} else if (enabledType == Crashreporting.MINIMAL || forceStatus == Status.DATASAVING) {
// Inits Sentry in datasaving mode
// Only data absolutely necessary is transmitted (Android version, app version).
// Only crashes will be reported, no regular events.
Sentry.init(
BuildConfig.SENTRY_DSN,
AndroidSentryClientFactory(this@SmokeScreen)
) )
addTag("richdata", "true") Sentry.getContext().user =
addTag("app.fromCi", BuildConfig.FROM_CI.toString()) User("anon-" + BuildConfig.VERSION_CODE, null, null, null)
addTag("app.commit", BuildConfig.COMMIT_HASH) Sentry.getStoredClient().apply {
} addTag("richdata", "false")
} else if (enabledType == Crashreporting.MINIMAL || forceStatus == Status.DATASAVING) { addTag("dist", BuildConfig.VERSION_CODE.toString())
// Inits Sentry in datasaving mode addTag("app.commit", BuildConfig.COMMIT_HASH)
// Only data absolutely necessary is transmitted (Android version, app version). addTag("app.fromCi", BuildConfig.FROM_CI.toString())
// Only crashes will be reported, no regular events. addExtra("dist", BuildConfig.VERSION_CODE)
Sentry.init( this.builderHelpers.forEach {
BuildConfig.SENTRY_DSN, this.removeBuilderHelper(it)
AndroidSentryClientFactory(this@SmokeScreen) }
) this.addBuilderHelper(DatasavingSentryEventHelper())
Sentry.getContext().user =
User("anon-" + BuildConfig.VERSION_CODE, null, null, null)
Sentry.getStoredClient().apply {
addTag("richdata", "false")
addTag("dist", BuildConfig.VERSION_CODE.toString())
addTag("app.commit", BuildConfig.COMMIT_HASH)
addTag("app.fromCi", BuildConfig.FROM_CI.toString())
addExtra("dist", BuildConfig.VERSION_CODE)
this.builderHelpers.forEach {
this.removeBuilderHelper(it)
} }
this.addBuilderHelper(DatasavingSentryEventHelper()) sentryReady = true
} }
} }
} catch(ex:Throwable) {
ex.printStackTrace()
} }
} }
} }
......
...@@ -58,7 +58,7 @@ class CrashReportingEnableDialog( ...@@ -58,7 +58,7 @@ class CrashReportingEnableDialog(
) { dialog, _ -> ) { dialog, _ ->
context.getPreferences().crashreportingType = Crashreporting.OFF context.getPreferences().crashreportingType = Crashreporting.OFF
context.getPreferences().crashReportingConsent = false context.getPreferences().crashReportingConsent = false
Sentry.close() (context.applicationContext as SmokeScreen).closeSentry()
dialog.dismiss() dialog.dismiss()
} }
setButton(DialogInterface.BUTTON_NEUTRAL, context.getString(R.string.dialog_crashreporting_neutral)) { _, _ -> setButton(DialogInterface.BUTTON_NEUTRAL, context.getString(R.string.dialog_crashreporting_neutral)) { _, _ ->
......
...@@ -428,10 +428,10 @@ class SettingsFragment : PreferenceFragmentCompat() { ...@@ -428,10 +428,10 @@ class SettingsFragment : PreferenceFragmentCompat() {
false false
} else { } else {
if(newValue == Crashreporting.MINIMAL.value) { if(newValue == Crashreporting.MINIMAL.value) {
Sentry.close() (requireContext().applicationContext as SmokeScreen).closeSentry()
(requireContext().applicationContext as SmokeScreen).initSentry(Status.DATASAVING) (requireContext().applicationContext as SmokeScreen).initSentry(Status.DATASAVING)
} else if(newValue == Crashreporting.OFF.value) { } else if(newValue == Crashreporting.OFF.value) {
Sentry.close() (requireContext().applicationContext as SmokeScreen).closeSentry()
} }
true true
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment