From ca76d8067f48c460dc2f157ec954eed573a3376d Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Mon, 2 Oct 2017 04:29:50 +0200 Subject: [PATCH] Further improved CrashHandler --- .../kuschku/quasseldroid_ng/QuasseldroidNG.kt | 5 +- .../quasseldroid_ng/ui/chat/ChatActivity.kt | 12 ++++ .../java/de/kuschku/malheur/CrashContext.kt | 3 +- .../java/de/kuschku/malheur/CrashHandler.kt | 12 +++- .../collectors/ConfigurationCollector.kt | 6 -- .../malheur/collectors/CrashCollector.kt | 29 +++------ .../malheur/collectors/DeviceCollector.kt | 45 +++++++++----- .../malheur/collectors/DisplayCollector.kt | 61 +++++++++++++++++++ .../malheur/collectors/EnvCollector.kt | 18 ++++-- .../malheur/collectors/LogCollector.kt | 16 +++-- .../malheur/collectors/ReportCollector.kt | 14 ++--- .../malheur/collectors/ThreadCollector.kt | 59 ++++++++++++++++++ .../de/kuschku/malheur/config/CrashConfig.kt | 6 +- .../de/kuschku/malheur/config/DeviceConfig.kt | 3 +- .../de/kuschku/malheur/config/EnvConfig.kt | 5 +- .../de/kuschku/malheur/config/ReportConfig.kt | 2 +- .../de/kuschku/malheur/config/ThreadConfig.kt | 6 ++ .../java/de/kuschku/malheur/data/CrashInfo.kt | 6 +- .../de/kuschku/malheur/data/DeviceInfo.kt | 3 +- .../de/kuschku/malheur/data/DisplayInfo.kt | 19 +----- .../java/de/kuschku/malheur/data/EnvInfo.kt | 9 +++ .../java/de/kuschku/malheur/data/Report.kt | 4 +- .../de/kuschku/malheur/data/ThreadInfo.kt | 12 +--- .../de/kuschku/malheur/data/ThreadsInfo.kt | 6 ++ .../de/kuschku/malheur/util/LogCatHelper.kt | 9 --- .../de/kuschku/malheur/util/ProcInfohelper.kt | 13 ---- .../kuschku/malheur/util/ThrowableHelper.kt | 11 ---- 27 files changed, 252 insertions(+), 142 deletions(-) create mode 100644 malheur/src/main/java/de/kuschku/malheur/collectors/DisplayCollector.kt create mode 100644 malheur/src/main/java/de/kuschku/malheur/collectors/ThreadCollector.kt create mode 100644 malheur/src/main/java/de/kuschku/malheur/config/ThreadConfig.kt create mode 100644 malheur/src/main/java/de/kuschku/malheur/data/EnvInfo.kt create mode 100644 malheur/src/main/java/de/kuschku/malheur/data/ThreadsInfo.kt delete mode 100644 malheur/src/main/java/de/kuschku/malheur/util/LogCatHelper.kt delete mode 100644 malheur/src/main/java/de/kuschku/malheur/util/ProcInfohelper.kt delete mode 100644 malheur/src/main/java/de/kuschku/malheur/util/ThrowableHelper.kt diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt index 78add5c87..8eac65731 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt @@ -18,7 +18,10 @@ class QuasseldroidNG : Application() { } override fun onCreate() { - CrashHandler.init(this, buildConfig = BuildConfig::class.java) + CrashHandler.init( + application = this, + buildConfig = BuildConfig::class.java + ) super.onCreate() // Init compatibility utils diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt index e34187119..be2ccd8d0 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt @@ -20,6 +20,7 @@ import de.kuschku.libquassel.session.SessionManager import de.kuschku.libquassel.session.SocketAddress import de.kuschku.libquassel.util.compatibility.LoggingHandler import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.INFO +import de.kuschku.malheur.CrashHandler import de.kuschku.quasseldroid_ng.Keys import de.kuschku.quasseldroid_ng.R import de.kuschku.quasseldroid_ng.persistence.AccountDatabase @@ -111,6 +112,17 @@ class ChatActivity : ServiceBoundActivity() { true ) } + CrashHandler.handle( + IllegalArgumentException( + "WRONG!", + RuntimeException( + "WRONG!", + NullPointerException( + "Super wrong!" + ) + ) + ) + ) } } }) diff --git a/malheur/src/main/java/de/kuschku/malheur/CrashContext.kt b/malheur/src/main/java/de/kuschku/malheur/CrashContext.kt index ec7719c1f..607f1e01c 100644 --- a/malheur/src/main/java/de/kuschku/malheur/CrashContext.kt +++ b/malheur/src/main/java/de/kuschku/malheur/CrashContext.kt @@ -11,5 +11,6 @@ data class CrashContext( val throwable: Throwable, val startTime: Date, val crashTime: Date, - val buildConfig: Class<*>? + val buildConfig: Class<*>?, + val stackTraces: Map<Thread, Array<StackTraceElement>>? ) diff --git a/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt b/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt index 4fe85518c..7d98d97cd 100644 --- a/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt +++ b/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt @@ -20,6 +20,8 @@ object CrashHandler { val reportCollector = ReportCollector(application) myHandler = Thread.UncaughtExceptionHandler { activeThread, throwable -> + val crashTime = Date() + val stackTraces = Thread.getAllStackTraces() Thread { try { val json = gson.toJson(reportCollector.collect(CrashContext( @@ -28,11 +30,13 @@ object CrashHandler { crashingThread = activeThread, throwable = throwable, startTime = startTime, - crashTime = Date(), - buildConfig = buildConfig + crashTime = crashTime, + buildConfig = buildConfig, + stackTraces = stackTraces ), config)) println(json) } catch (e: Throwable) { + e.printStackTrace() originalHandler?.uncaughtException(activeThread, throwable) } }.start() @@ -40,5 +44,9 @@ object CrashHandler { Thread.setDefaultUncaughtExceptionHandler(myHandler) } + fun handle(throwable: Throwable) { + myHandler?.uncaughtException(Thread.currentThread(), throwable) + } + var myHandler: Thread.UncaughtExceptionHandler? = null } diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/ConfigurationCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/ConfigurationCollector.kt index bb0bcfe4b..2d880d830 100644 --- a/malheur/src/main/java/de/kuschku/malheur/collectors/ConfigurationCollector.kt +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/ConfigurationCollector.kt @@ -11,12 +11,6 @@ class ConfigurationCollector(private val application: Application) : private val configValueInfo = mutableMapOf<String, SparseArray<String>>() private val configurationFields = listOf( - FieldDefinition( - fieldName = "mcc" - ), - FieldDefinition( - fieldName = "mnc" - ), FieldDefinition( fieldName = "screenHeightDp" ), diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/CrashCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/CrashCollector.kt index 99fc29c1c..7174dc019 100644 --- a/malheur/src/main/java/de/kuschku/malheur/collectors/CrashCollector.kt +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/CrashCollector.kt @@ -1,35 +1,22 @@ package de.kuschku.malheur.collectors -import android.app.Application import de.kuschku.malheur.CrashContext import de.kuschku.malheur.config.CrashConfig import de.kuschku.malheur.data.CrashInfo import de.kuschku.malheur.data.ExceptionInfo -import de.kuschku.malheur.data.ThreadInfo -import de.kuschku.malheur.util.printStackTraceToString -import java.text.SimpleDateFormat -import java.util.* - -class CrashCollector(application: Application) : Collector<CrashInfo, CrashConfig> { - private val configurationCollector = ConfigurationCollector(application) - private val isoFormatter = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX", Locale.US) +import java.io.PrintWriter +import java.io.StringWriter +class CrashCollector : Collector<CrashInfo, CrashConfig> { override fun collect(context: CrashContext, config: CrashConfig) = CrashInfo( cause = collectIf(config.cause) { ExceptionInfo(context.throwable) }, exception = collectIf(config.exception) { - context.throwable.printStackTraceToString() - }, - activeThread = collectIf(config.activeThread) { - ThreadInfo(context.crashingThread) - }, - startTime = collectIf(config.startTime) { - isoFormatter.format(context.startTime) - }, - crashTime = collectIf(config.crashTime) { - isoFormatter.format(context.crashTime) - }, - configuration = configurationCollector.collectIf(context, config.configuration) + val result = StringWriter() + val printWriter = PrintWriter(result) + context.throwable.printStackTrace(printWriter) + result.toString() + } ) } diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/DeviceCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/DeviceCollector.kt index 2768e1a06..fa2d2fd58 100644 --- a/malheur/src/main/java/de/kuschku/malheur/collectors/DeviceCollector.kt +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/DeviceCollector.kt @@ -7,23 +7,38 @@ import android.provider.Settings import de.kuschku.malheur.CrashContext import de.kuschku.malheur.config.DeviceConfig import de.kuschku.malheur.data.DeviceInfo -import de.kuschku.malheur.util.readProcInfo import de.kuschku.malheur.util.reflectionCollectConstants +import java.io.File class DeviceCollector(private val application: Application) : Collector<DeviceInfo, DeviceConfig> { + private val displayCollector = DisplayCollector(application) + @SuppressLint("HardwareIds") - override fun collect(context: CrashContext, config: DeviceConfig) = DeviceInfo( - build = collectIf(config.build) { - reflectionCollectConstants(Build::class.java) - }, - version = collectIf(config.version) { - reflectionCollectConstants(Build.VERSION::class.java) - }, - installationId = collectIf(config.installationId) { - Settings.Secure.getString(application.contentResolver, Settings.Secure.ANDROID_ID) - }, - processor = collectIf(config.processor) { - readProcInfo() - } - ) + override fun collect(context: CrashContext, config: DeviceConfig): DeviceInfo { + return DeviceInfo( + build = collectIf(config.build) { + reflectionCollectConstants(Build::class.java) + }, + version = collectIf(config.version) { + reflectionCollectConstants(Build.VERSION::class.java) + }, + installationId = collectIf(config.installationId) { + Settings.Secure.getString(application.contentResolver, Settings.Secure.ANDROID_ID) + }, + processor = collectIf(config.processor) { + readProcInfo() + }, + display = displayCollector.collectIf(context, config.display) + ) + } + + private fun readProcInfo() = File("/proc/cpuinfo") + .bufferedReader(Charsets.UTF_8) + .lineSequence() + .map { line -> line.split(":") } + .filter { split -> split.size == 2 } + .map { (key, value) -> key.trim() to value.trim() } + .filter { (key, _) -> key == "Hardware" } + .map { (_, value) -> value } + .firstOrNull() } diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/DisplayCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/DisplayCollector.kt new file mode 100644 index 000000000..c00c07610 --- /dev/null +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/DisplayCollector.kt @@ -0,0 +1,61 @@ +package de.kuschku.malheur.collectors + +import android.app.Application +import android.content.Context +import android.os.Build +import android.util.SparseArray +import android.view.Display +import android.view.WindowManager +import de.kuschku.malheur.CrashContext +import de.kuschku.malheur.data.DisplayInfo +import de.kuschku.malheur.data.MetricsInfo +import de.kuschku.malheur.util.getMetrics +import java.lang.reflect.Modifier + +class DisplayCollector(application: Application) : + Collector<DisplayInfo, Boolean> { + private val windowManager = application.getSystemService( + Context.WINDOW_SERVICE) as WindowManager + + @Suppress("DEPRECATION") + override fun collect(context: CrashContext, config: Boolean): DisplayInfo? { + val display = windowManager.defaultDisplay + val hdrCapabilities = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + val capabilitiesEnum = getHdrCapabilitiesEnum() + display.hdrCapabilities.supportedHdrTypes.map(capabilitiesEnum::get) + } else { + null + } + return DisplayInfo( + width = display.width, + height = display.height, + pixelFormat = display.pixelFormat, + refreshRate = display.refreshRate, + hdr = hdrCapabilities, + isWideGamut = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + display.isWideColorGamut + } else { + null + }, + metrics = MetricsInfo(display.getMetrics()) + ) + } + + private fun getHdrCapabilitiesEnum(): SparseArray<String> { + val hdrCapabilityEnums = SparseArray<String>() + Display.HdrCapabilities::class.java.declaredFields.filter { + Modifier.isStatic(it.modifiers) + }.filter { + it.name.startsWith("HDR_TYPE_") + }.filter { + it.type == Int::class.java + }.forEach { + try { + val value = it.getInt(null) + hdrCapabilityEnums.put(value, it.name.substring("HDR_TYPE_".length)) + } catch (e: IllegalAccessException) { + } + } + return hdrCapabilityEnums + } +} diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/EnvCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/EnvCollector.kt index fb5ca1e8a..5cb6e7d95 100644 --- a/malheur/src/main/java/de/kuschku/malheur/collectors/EnvCollector.kt +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/EnvCollector.kt @@ -5,13 +5,16 @@ import android.os.Debug import android.os.Environment import de.kuschku.malheur.CrashContext import de.kuschku.malheur.config.EnvConfig +import de.kuschku.malheur.data.EnvInfo import de.kuschku.malheur.data.MemoryInfo import de.kuschku.malheur.util.reflectionCollectGetters import java.io.File -class EnvCollector(application: Application) : Collector<Map<String, Any?>, EnvConfig> { - override fun collect(context: CrashContext, config: EnvConfig) = mapOf( - "paths" to collectIf(config.paths) { +class EnvCollector(application: Application) : Collector<EnvInfo, EnvConfig> { + private val configurationCollector = ConfigurationCollector(application) + + override fun collect(context: CrashContext, config: EnvConfig) = EnvInfo( + paths = collectIf(config.paths) { reflectionCollectGetters( Environment::class.java)?.map { (key, value) -> key to if (value is File) { @@ -21,10 +24,17 @@ class EnvCollector(application: Application) : Collector<Map<String, Any?>, EnvC } }?.toMap() }, - "memory" to collectIf(config.memory) { + memory = collectIf(config.memory) { val memoryInfo = Debug.MemoryInfo() Debug.getMemoryInfo(memoryInfo) MemoryInfo(memoryInfo) + }, + configuration = configurationCollector.collectIf(context, config.configuration), + startTime = collectIf(config.startTime) { + context.startTime.time + }, + crashTime = collectIf(config.crashTime) { + context.crashTime.time } ) } diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/LogCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/LogCollector.kt index a8d173313..8ea759ca2 100644 --- a/malheur/src/main/java/de/kuschku/malheur/collectors/LogCollector.kt +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/LogCollector.kt @@ -1,21 +1,25 @@ package de.kuschku.malheur.collectors -import android.app.Application -import android.os.Process import de.kuschku.malheur.CrashContext import de.kuschku.malheur.config.LogConfig -import de.kuschku.malheur.util.readLogCat import java.text.SimpleDateFormat import java.util.* -class LogCollector(application: Application) : Collector<Map<String, List<String>>, LogConfig> { +class LogCollector : Collector<Map<String, List<String>>, LogConfig> { private val logcatTimeFormatter = SimpleDateFormat("MM-dd HH:mm:ss.SSS", Locale.US) - private val pid = Process.myPid().toString() override fun collect(context: CrashContext, config: LogConfig): Map<String, List<String>> { val since = logcatTimeFormatter.format(context.startTime) return config.buffers.map { buffer -> - buffer to readLogCat(since, buffer, pid) + buffer to readLogCat(since, buffer) }.toMap() } + + private fun readLogCat(since: String, buffer: String) = ProcessBuilder() + .command("logcat", "-t", since, "-b", buffer) + .redirectErrorStream(true) + .start() + .inputStream + .bufferedReader(Charsets.UTF_8) + .readLines() } diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt index ebe95f841..7c0eb23e6 100644 --- a/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt @@ -4,24 +4,18 @@ import android.app.Application import de.kuschku.malheur.CrashContext import de.kuschku.malheur.config.ReportConfig import de.kuschku.malheur.data.Report -import de.kuschku.malheur.data.ThreadInfo class ReportCollector(application: Application) : Collector<Report, ReportConfig> { - private val logcatCollector = LogCollector(application) - private val crashCollector = CrashCollector(application) + private val crashCollector = CrashCollector() + private val threadCollector = ThreadCollector() + private val logcatCollector = LogCollector() private val applicationCollector = AppCollector(application) private val deviceCollector = DeviceCollector(application) private val environmentCollector = EnvCollector(application) override fun collect(context: CrashContext, config: ReportConfig) = Report( crash = crashCollector.collectIf(context, config.crash), - threads = collectIf(config.threads) { - Thread.getAllStackTraces() - .filterKeys { it != Thread.currentThread() } - .map { (thread, stackTrace) -> - ThreadInfo(thread, stackTrace) - } - }, + threads = threadCollector.collectIf(context, config.threads), logcat = logcatCollector.collectIf(context, config.logcat), application = applicationCollector.collectIf(context, config.application), device = deviceCollector.collectIf(context, config.device), diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/ThreadCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/ThreadCollector.kt new file mode 100644 index 000000000..e8d374e93 --- /dev/null +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/ThreadCollector.kt @@ -0,0 +1,59 @@ +package de.kuschku.malheur.collectors + +import de.kuschku.malheur.CrashContext +import de.kuschku.malheur.CrashHandler +import de.kuschku.malheur.config.ThreadConfig +import de.kuschku.malheur.data.ThreadInfo +import de.kuschku.malheur.data.ThreadsInfo +import de.kuschku.malheur.data.TraceElement + +class ThreadCollector : Collector<ThreadsInfo, ThreadConfig> { + override fun collect(context: CrashContext, config: ThreadConfig) = ThreadsInfo( + crashed = context.stackTraces?.filterKeys { + it == context.crashingThread + }?.map { (thread, stackTrace) -> + threadToInfo(thread, stackTrace) + }?.firstOrNull(), + others = context.stackTraces?.filterKeys { + it != Thread.currentThread() && it != context.crashingThread + }?.map { (thread, stackTrace) -> + threadToInfo(thread, stackTrace) + } + ) + + private fun threadToInfo(thread: Thread, stackTrace: Array<StackTraceElement>) = ThreadInfo( + id = thread.id, + name = thread.name, + group = thread.threadGroup?.name, + status = thread.state?.name, + stackTrace = ArrayList(sanitize(stackTrace.map(::TraceElement))), + isDaemon = thread.isDaemon, + priority = thread.priority + ) + + private fun sanitize(list: List<TraceElement>): List<TraceElement> { + var idx = 0 + while (idx < list.size) { + val traceElement = list[idx] + if (traceElement.className == CrashHandler::class.java.canonicalName) + break + idx++ + } + while (idx < list.size) { + val traceElement = list[idx] + if (traceElement.className != CrashHandler::class.java.canonicalName) + break + idx++ + } + val after = mutableListOf<TraceElement>() + while (idx < list.size) { + val traceElement = list[idx] + after.add(traceElement) + idx++ + } + + return if (after.size > 0) { + after + } else list + } +} diff --git a/malheur/src/main/java/de/kuschku/malheur/config/CrashConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/CrashConfig.kt index 05728d5be..e0fff5226 100644 --- a/malheur/src/main/java/de/kuschku/malheur/config/CrashConfig.kt +++ b/malheur/src/main/java/de/kuschku/malheur/config/CrashConfig.kt @@ -2,9 +2,5 @@ package de.kuschku.malheur.config data class CrashConfig( val cause: Boolean = true, - val exception: Boolean = true, - val activeThread: Boolean = true, - val startTime: Boolean = true, - val crashTime: Boolean = true, - val configuration: Boolean = true + val exception: Boolean = true ) diff --git a/malheur/src/main/java/de/kuschku/malheur/config/DeviceConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/DeviceConfig.kt index ca332a773..337e4f3a9 100644 --- a/malheur/src/main/java/de/kuschku/malheur/config/DeviceConfig.kt +++ b/malheur/src/main/java/de/kuschku/malheur/config/DeviceConfig.kt @@ -5,5 +5,6 @@ data class DeviceConfig( val version: Boolean = true, val installationId: Boolean = true, val processor: Boolean = true, - val runtime: Boolean = true + val runtime: Boolean = true, + val display: Boolean = true ) diff --git a/malheur/src/main/java/de/kuschku/malheur/config/EnvConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/EnvConfig.kt index 29c5fbbfa..aedd636e4 100644 --- a/malheur/src/main/java/de/kuschku/malheur/config/EnvConfig.kt +++ b/malheur/src/main/java/de/kuschku/malheur/config/EnvConfig.kt @@ -2,5 +2,8 @@ package de.kuschku.malheur.config data class EnvConfig( val paths: Boolean = true, - val memory: Boolean = true + val memory: Boolean = true, + val configuration: Boolean = true, + val startTime: Boolean = true, + val crashTime: Boolean = true ) diff --git a/malheur/src/main/java/de/kuschku/malheur/config/ReportConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/ReportConfig.kt index 4ee6eedec..9c3ae20ef 100644 --- a/malheur/src/main/java/de/kuschku/malheur/config/ReportConfig.kt +++ b/malheur/src/main/java/de/kuschku/malheur/config/ReportConfig.kt @@ -2,7 +2,7 @@ package de.kuschku.malheur.config data class ReportConfig( val crash: CrashConfig? = CrashConfig(), - val threads: Boolean = true, + val threads: ThreadConfig? = ThreadConfig(), val logcat: LogConfig? = LogConfig(), val application: AppConfig? = AppConfig(), val device: DeviceConfig? = DeviceConfig(), diff --git a/malheur/src/main/java/de/kuschku/malheur/config/ThreadConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/ThreadConfig.kt new file mode 100644 index 000000000..3a680c183 --- /dev/null +++ b/malheur/src/main/java/de/kuschku/malheur/config/ThreadConfig.kt @@ -0,0 +1,6 @@ +package de.kuschku.malheur.config + +data class ThreadConfig( + val current: Boolean = true, + val others: Boolean = true +) diff --git a/malheur/src/main/java/de/kuschku/malheur/data/CrashInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/CrashInfo.kt index 609624d65..6be355b19 100644 --- a/malheur/src/main/java/de/kuschku/malheur/data/CrashInfo.kt +++ b/malheur/src/main/java/de/kuschku/malheur/data/CrashInfo.kt @@ -2,9 +2,5 @@ package de.kuschku.malheur.data data class CrashInfo( val cause: ExceptionInfo?, - val exception: String?, - val activeThread: ThreadInfo?, - val startTime: String?, - val crashTime: String?, - val configuration: Map<String, Any?>? + val exception: String? ) diff --git a/malheur/src/main/java/de/kuschku/malheur/data/DeviceInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/DeviceInfo.kt index bd9a07ac5..661c9fbd0 100644 --- a/malheur/src/main/java/de/kuschku/malheur/data/DeviceInfo.kt +++ b/malheur/src/main/java/de/kuschku/malheur/data/DeviceInfo.kt @@ -4,5 +4,6 @@ data class DeviceInfo( val build: Map<String, Any?>?, val version: Map<String, Any?>?, val installationId: String?, - val processor: String? + val processor: String?, + val display: DisplayInfo? ) diff --git a/malheur/src/main/java/de/kuschku/malheur/data/DisplayInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/DisplayInfo.kt index 38e1b7a2d..a90e716f3 100644 --- a/malheur/src/main/java/de/kuschku/malheur/data/DisplayInfo.kt +++ b/malheur/src/main/java/de/kuschku/malheur/data/DisplayInfo.kt @@ -1,24 +1,11 @@ package de.kuschku.malheur.data -import android.view.Display -import de.kuschku.malheur.util.getMetrics - data class DisplayInfo( val width: Int, val height: Int, val pixelFormat: Int, val refreshRate: Float, - val isHdr: Boolean, - val isWideGamut: Boolean, + val hdr: List<String>?, + val isWideGamut: Boolean?, val metrics: MetricsInfo -) { - constructor(display: Display) : this( - width = display.width, - height = display.height, - pixelFormat = display.pixelFormat, - refreshRate = display.refreshRate, - isHdr = display.isHdr, - isWideGamut = display.isWideColorGamut, - metrics = MetricsInfo(display.getMetrics()) - ) -} +) diff --git a/malheur/src/main/java/de/kuschku/malheur/data/EnvInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/EnvInfo.kt new file mode 100644 index 000000000..c18f48876 --- /dev/null +++ b/malheur/src/main/java/de/kuschku/malheur/data/EnvInfo.kt @@ -0,0 +1,9 @@ +package de.kuschku.malheur.data + +data class EnvInfo( + val paths: Map<String, Any?>?, + val memory: MemoryInfo?, + val configuration: Map<String, Any?>?, + val startTime: Long?, + val crashTime: Long? +) diff --git a/malheur/src/main/java/de/kuschku/malheur/data/Report.kt b/malheur/src/main/java/de/kuschku/malheur/data/Report.kt index d0dfbb9dd..8cb399f44 100644 --- a/malheur/src/main/java/de/kuschku/malheur/data/Report.kt +++ b/malheur/src/main/java/de/kuschku/malheur/data/Report.kt @@ -2,9 +2,9 @@ package de.kuschku.malheur.data data class Report( val crash: CrashInfo?, - val threads: List<ThreadInfo>?, + val threads: ThreadsInfo?, val logcat: Map<String, List<String>?>?, val application: AppInfo?, val device: DeviceInfo?, - val environment: Map<String, Any?>? + val environment: EnvInfo? ) diff --git a/malheur/src/main/java/de/kuschku/malheur/data/ThreadInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/ThreadInfo.kt index e80b4fc76..6503d9b54 100644 --- a/malheur/src/main/java/de/kuschku/malheur/data/ThreadInfo.kt +++ b/malheur/src/main/java/de/kuschku/malheur/data/ThreadInfo.kt @@ -8,14 +8,4 @@ data class ThreadInfo( val stackTrace: List<TraceElement>?, val isDaemon: Boolean?, val priority: Int? -) { - constructor(thread: Thread, stackTrace: Array<StackTraceElement> = thread.stackTrace) : this( - id = thread.id, - name = thread.name, - group = thread.threadGroup?.name, - status = thread.state?.name, - stackTrace = ArrayList(stackTrace.map(::TraceElement)), - isDaemon = thread.isDaemon, - priority = thread.priority - ) -} +) diff --git a/malheur/src/main/java/de/kuschku/malheur/data/ThreadsInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/ThreadsInfo.kt new file mode 100644 index 000000000..10d94c6e0 --- /dev/null +++ b/malheur/src/main/java/de/kuschku/malheur/data/ThreadsInfo.kt @@ -0,0 +1,6 @@ +package de.kuschku.malheur.data + +data class ThreadsInfo( + val crashed: ThreadInfo?, + val others: List<ThreadInfo>? +) diff --git a/malheur/src/main/java/de/kuschku/malheur/util/LogCatHelper.kt b/malheur/src/main/java/de/kuschku/malheur/util/LogCatHelper.kt deleted file mode 100644 index 8837570c4..000000000 --- a/malheur/src/main/java/de/kuschku/malheur/util/LogCatHelper.kt +++ /dev/null @@ -1,9 +0,0 @@ -package de.kuschku.malheur.util - -fun readLogCat(since: String, buffer: String, pid: String) = ProcessBuilder() - .command("logcat", "-t", since, "-b", buffer, "--pid", pid) - .redirectErrorStream(true) - .start() - .inputStream - .bufferedReader(Charsets.UTF_8) - .readLines() diff --git a/malheur/src/main/java/de/kuschku/malheur/util/ProcInfohelper.kt b/malheur/src/main/java/de/kuschku/malheur/util/ProcInfohelper.kt deleted file mode 100644 index 0940b565a..000000000 --- a/malheur/src/main/java/de/kuschku/malheur/util/ProcInfohelper.kt +++ /dev/null @@ -1,13 +0,0 @@ -package de.kuschku.malheur.util - -import java.io.File - -fun readProcInfo() = File("/proc/cpuinfo") - .bufferedReader(Charsets.UTF_8) - .lineSequence() - .map { line -> line.split(":") } - .filter { split -> split.size == 2 } - .map { (key, value) -> key.trim() to value.trim() } - .filter { (key, _) -> key == "Hardware" } - .map { (_, value) -> value } - .firstOrNull() diff --git a/malheur/src/main/java/de/kuschku/malheur/util/ThrowableHelper.kt b/malheur/src/main/java/de/kuschku/malheur/util/ThrowableHelper.kt deleted file mode 100644 index c797860ed..000000000 --- a/malheur/src/main/java/de/kuschku/malheur/util/ThrowableHelper.kt +++ /dev/null @@ -1,11 +0,0 @@ -package de.kuschku.malheur.util - -import java.io.PrintWriter -import java.io.StringWriter - -fun Throwable.printStackTraceToString(): String? { - val result = StringWriter() - val printWriter = PrintWriter(result) - printStackTrace(printWriter) - return result.toString() -} -- GitLab