From e6d181a5fd36ddca190073156314e4c74d49c2e0 Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Thu, 11 Apr 2024 12:53:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/App.kt | 1 + .../io/legado/app/ui/about/AboutFragment.kt | 79 ++++++++++--------- .../app/ui/config/OtherConfigFragment.kt | 1 + .../main/java/io/legado/app/utils/LogUtils.kt | 30 +++++++ 4 files changed, 73 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/io/legado/app/App.kt b/app/src/main/java/io/legado/app/App.kt index 450c7a9f5..0ca2e8ffb 100644 --- a/app/src/main/java/io/legado/app/App.kt +++ b/app/src/main/java/io/legado/app/App.kt @@ -50,6 +50,7 @@ class App : Application() { override fun onCreate() { super.onCreate() LogUtils.d("App", "onCreate") + LogUtils.logDeviceInfo() oldConfig = Configuration(resources.configuration) CrashHandler(this) //预下载Cronet so diff --git a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt index 5d4294ead..52c9c6137 100644 --- a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt +++ b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt @@ -30,6 +30,8 @@ import io.legado.app.utils.sendMail import io.legado.app.utils.sendToClip import io.legado.app.utils.showDialogFragment import io.legado.app.utils.toastOnUi +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch import splitties.init.appCtx import java.io.File @@ -125,31 +127,8 @@ class AboutFragment : PreferenceFragmentCompat() { return@async } val doc = FileDoc.fromUri(Uri.parse(backupPath), true) - val files = FileDoc.fromFile(File(appCtx.externalCacheDir, "logs")).list() - if (!files.isNullOrEmpty()) { - doc.find("logs")?.delete() - val logsDoc = doc.createFolderIfNotExist("logs") - files.forEach { file -> - file.openInputStream().getOrNull()?.use { input -> - logsDoc.createFileIfNotExist(file.name).openOutputStream().getOrNull() - ?.use { - input.copyTo(it) - } - } - } - } - val heapFile = FileDoc.fromFile(File(appCtx.externalCacheDir, "heapDump")).list() - ?.firstOrNull() - if (heapFile != null) { - doc.find("heapDump")?.delete() - val heapDumpDoc = doc.createFolderIfNotExist("heapDump") - heapFile.openInputStream().getOrNull()?.use { input -> - heapDumpDoc.createFileIfNotExist(heapFile.name).openOutputStream().getOrNull() - ?.use { - input.copyTo(it) - } - } - } + copyLogs(doc) + copyHeapDump(doc) appCtx.toastOnUi("已保存至备份目录") }.onError { AppLog.put("保存日志出错\n${it.localizedMessage}", it, true) @@ -165,24 +144,48 @@ class AboutFragment : PreferenceFragmentCompat() { appCtx.toastOnUi("开始创建堆转储") System.gc() CrashHandler.doHeapDump() - val heapFile = FileDoc.fromFile(File(appCtx.externalCacheDir, "heapDump")).list() - ?.firstOrNull() ?: let { - appCtx.toastOnUi("未找到堆转储文件") - return@async - } val doc = FileDoc.fromUri(Uri.parse(backupPath), true) - doc.find("heapDump")?.delete() - val heapDumpDoc = doc.createFolderIfNotExist("heapDump") - heapFile.openInputStream().getOrNull()?.use { input -> - heapDumpDoc.createFileIfNotExist(heapFile.name).openOutputStream().getOrNull() - ?.use { - input.copyTo(it) - } + if (!copyHeapDump(doc)) { + appCtx.toastOnUi("未找到堆转储文件") + } else { + appCtx.toastOnUi("已保存至备份目录") } - appCtx.toastOnUi("已保存至备份目录") }.onError { AppLog.put("保存堆转储失败\n${it.localizedMessage}", it) } } + private suspend fun copyLogs(doc: FileDoc) = coroutineScope { + val files = FileDoc.fromFile(File(appCtx.externalCacheDir, "logs")).list() + if (files.isNullOrEmpty()) { + return@coroutineScope + } + doc.find("logs")?.delete() + val logsDoc = doc.createFolderIfNotExist("logs") + files.forEach { file -> + launch { + file.openInputStream().getOrNull()?.use { input -> + logsDoc.createFileIfNotExist(file.name).openOutputStream().getOrNull() + ?.use { + input.copyTo(it) + } + } + } + } + } + + private fun copyHeapDump(doc: FileDoc): Boolean { + val heapFile = FileDoc.fromFile(File(appCtx.externalCacheDir, "heapDump")).list() + ?.firstOrNull() ?: return false + doc.find("heapDump")?.delete() + val heapDumpDoc = doc.createFolderIfNotExist("heapDump") + heapFile.openInputStream().getOrNull()?.use { input -> + heapDumpDoc.createFileIfNotExist(heapFile.name).openOutputStream().getOrNull() + ?.use { + input.copyTo(it) + } + } + return true + } + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt index a1445c73d..b67ec42b1 100644 --- a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt @@ -174,6 +174,7 @@ class OtherConfigFragment : PreferenceFragment(), PreferKey.recordLog -> { LogUtils.upLevel() + LogUtils.logDeviceInfo() LiveEventBus.config().enableLogger(AppConfig.recordLog) } diff --git a/app/src/main/java/io/legado/app/utils/LogUtils.kt b/app/src/main/java/io/legado/app/utils/LogUtils.kt index 3d290c0cd..23f7b015f 100644 --- a/app/src/main/java/io/legado/app/utils/LogUtils.kt +++ b/app/src/main/java/io/legado/app/utils/LogUtils.kt @@ -3,7 +3,10 @@ package io.legado.app.utils import android.annotation.SuppressLint +import android.os.Build +import android.webkit.WebSettings import io.legado.app.BuildConfig +import io.legado.app.constant.AppConst import io.legado.app.help.config.AppConfig import splitties.init.appCtx import java.text.SimpleDateFormat @@ -107,6 +110,33 @@ object LogUtils { val sdf = SimpleDateFormat(pattern) return sdf.format(date) } + + fun logDeviceInfo() { + d("DeviceInfo") { + buildString { + kotlin.runCatching { + //获取系统信息 + append("MANUFACTURER=").append(Build.MANUFACTURER).append("\n") + append("BRAND=").append(Build.BRAND).append("\n") + append("MODEL=").append(Build.MODEL).append("\n") + append("SDK_INT=").append(Build.VERSION.SDK_INT).append("\n") + append("RELEASE=").append(Build.VERSION.RELEASE).append("\n") + val userAgent = try { + WebSettings.getDefaultUserAgent(appCtx) + } catch (e: Throwable) { + e.localizedMessage ?: "null" + } + append("WebViewUserAgent=").append(userAgent).append("\n") + //获取app版本信息 + AppConst.appInfo.let { + append("versionName=").append(it.versionName).append("\n") + append("versionCode=").append(it.versionCode).append("\n") + } + } + } + } + } + } fun Throwable.printOnDebug() {