From c0d1c29b7fcd21803e8174fdf522fbda215fd249 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 3 Mar 2024 10:55:35 -0500 Subject: [PATCH] feat: Show error logs on crash when unprivileged ...however, don't do this in privileged mode because OpenEuiccService is supposed to be background, and we don't want to just randomly show up when things go wrong. --- .../im/angry/openeuicc/ui/LogsActivity.kt | 12 ++-------- .../java/im/angry/openeuicc/util/Utils.kt | 11 +++++++++ app-unpriv/src/main/AndroidManifest.xml | 2 +- .../UnprivilegedOpenEuiccApplication.kt | 23 +++++++++++++++++++ 4 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 app-unpriv/src/main/java/im/angry/openeuicc/UnprivilegedOpenEuiccApplication.kt diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/LogsActivity.kt b/app-common/src/main/java/im/angry/openeuicc/ui/LogsActivity.kt index 9a2a855..ba15e37 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/LogsActivity.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/LogsActivity.kt @@ -8,6 +8,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import im.angry.openeuicc.common.R +import im.angry.openeuicc.util.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -44,16 +45,7 @@ class LogsActivity : AppCompatActivity() { private suspend fun reload() = withContext(Dispatchers.Main) { swipeRefresh.isRefreshing = true - val logStr = withContext(Dispatchers.IO) { - try { - Runtime.getRuntime().exec("logcat -t 1024").inputStream.readBytes() - .decodeToString() - } catch (_: Exception) { - "" - } - } - - logText.text = logStr + logText.text = intent.extras?.getString("log") ?: readSelfLog() swipeRefresh.isRefreshing = false diff --git a/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt b/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt index b2690b0..dc90ab1 100644 --- a/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt +++ b/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt @@ -8,9 +8,11 @@ import androidx.fragment.app.Fragment import im.angry.openeuicc.OpenEuiccApplication import im.angry.openeuicc.core.EuiccChannel import im.angry.openeuicc.core.EuiccChannelManager +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.withContext import net.typeblog.lpac_jni.LocalProfileInfo import java.lang.RuntimeException import kotlin.coroutines.resume @@ -26,6 +28,15 @@ val Context.selfAppVersion: String throw RuntimeException(e) } +suspend fun readSelfLog(lines: Int = 2048): String = withContext(Dispatchers.IO) { + try { + Runtime.getRuntime().exec("logcat -t $lines").inputStream.readBytes() + .decodeToString() + } catch (_: Exception) { + "" + } +} + interface OpenEuiccContextMarker { val openEuiccMarkerContext: Context get() = when (this) { diff --git a/app-unpriv/src/main/AndroidManifest.xml b/app-unpriv/src/main/AndroidManifest.xml index bce6831..e72b112 100644 --- a/app-unpriv/src/main/AndroidManifest.xml +++ b/app-unpriv/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ + Intent(this, LogsActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + putExtra("log", runBlocking { readSelfLog() }) + startActivity(this) + exitProcess(-1) + } + } + } +} \ No newline at end of file