Jelajahi Sumber

Include debug info in dumped crash logs

arkon 4 tahun lalu
induk
melakukan
0586e1d3ad

+ 5 - 14
app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutController.kt

@@ -1,7 +1,6 @@
 package eu.kanade.tachiyomi.ui.more
 
 import android.app.Dialog
-import android.os.Build
 import android.os.Bundle
 import androidx.core.os.bundleOf
 import androidx.preference.PreferenceScreen
@@ -15,6 +14,7 @@ import eu.kanade.tachiyomi.data.updater.github.GithubUpdateChecker
 import eu.kanade.tachiyomi.ui.base.controller.DialogController
 import eu.kanade.tachiyomi.ui.base.controller.openInBrowser
 import eu.kanade.tachiyomi.ui.setting.SettingsController
+import eu.kanade.tachiyomi.util.CrashLogUtil
 import eu.kanade.tachiyomi.util.lang.launchNow
 import eu.kanade.tachiyomi.util.lang.toDateTimestampString
 import eu.kanade.tachiyomi.util.preference.onClick
@@ -201,19 +201,10 @@ class AboutController : SettingsController() {
     }
 
     private fun copyDebugInfo() {
-        val deviceInfo =
-            """
-            App version: ${BuildConfig.VERSION_NAME} (${BuildConfig.FLAVOR}, ${BuildConfig.COMMIT_SHA}, ${BuildConfig.VERSION_CODE})
-            Android version: ${Build.VERSION.RELEASE} (SDK ${Build.VERSION.SDK_INT})
-            Android build ID: ${Build.DISPLAY}
-            Device brand: ${Build.BRAND}
-            Device manufacturer: ${Build.MANUFACTURER}
-            Device name: ${Build.DEVICE}
-            Device model: ${Build.MODEL}
-            Device product name: ${Build.PRODUCT}
-            """.trimIndent()
-
-        activity?.copyToClipboard("Debug information", deviceInfo)
+        activity?.let {
+            val deviceInfo = CrashLogUtil(it).getDebugInfo()
+            activity?.copyToClipboard("Debug information", deviceInfo)
+        }
     }
 
     private fun getFormattedBuildTime(): String {

+ 26 - 7
app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt

@@ -2,15 +2,18 @@ package eu.kanade.tachiyomi.util
 
 import android.content.Context
 import android.net.Uri
+import android.os.Build
+import eu.kanade.tachiyomi.BuildConfig
 import eu.kanade.tachiyomi.R
 import eu.kanade.tachiyomi.data.notification.NotificationReceiver
 import eu.kanade.tachiyomi.data.notification.Notifications
+import eu.kanade.tachiyomi.util.lang.launchIO
+import eu.kanade.tachiyomi.util.lang.withUIContext
 import eu.kanade.tachiyomi.util.storage.getUriCompat
 import eu.kanade.tachiyomi.util.system.createFileInCacheDir
 import eu.kanade.tachiyomi.util.system.notificationBuilder
 import eu.kanade.tachiyomi.util.system.notificationManager
 import eu.kanade.tachiyomi.util.system.toast
-import java.io.IOException
 
 class CrashLogUtil(private val context: Context) {
 
@@ -19,16 +22,32 @@ class CrashLogUtil(private val context: Context) {
     }
 
     fun dumpLogs() {
-        try {
-            val file = context.createFileInCacheDir("tachiyomi_crash_logs.txt")
-            Runtime.getRuntime().exec("logcat *:E -d -f ${file.absolutePath}")
+        launchIO {
+            try {
+                val file = context.createFileInCacheDir("tachiyomi_crash_logs.txt")
+                Runtime.getRuntime().exec("logcat *:E -d -f ${file.absolutePath}").waitFor()
+                file.appendText(getDebugInfo())
 
-            showNotification(file.getUriCompat(context))
-        } catch (e: IOException) {
-            context.toast("Failed to get logs")
+                showNotification(file.getUriCompat(context))
+            } catch (e: Throwable) {
+                withUIContext { context.toast("Failed to get logs") }
+            }
         }
     }
 
+    fun getDebugInfo(): String {
+        return """
+            App version: ${BuildConfig.VERSION_NAME} (${BuildConfig.FLAVOR}, ${BuildConfig.COMMIT_SHA}, ${BuildConfig.VERSION_CODE})
+            Android version: ${Build.VERSION.RELEASE} (SDK ${Build.VERSION.SDK_INT})
+            Android build ID: ${Build.DISPLAY}
+            Device brand: ${Build.BRAND}
+            Device manufacturer: ${Build.MANUFACTURER}
+            Device name: ${Build.DEVICE}
+            Device model: ${Build.MODEL}
+            Device product name: ${Build.PRODUCT}
+        """.trimIndent()
+    }
+
     private fun showNotification(uri: Uri) {
         context.notificationManager.cancel(Notifications.ID_CRASH_LOGS)