From e63512e8c7890f3748adafd7bba7c8b08afe3275 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Wed, 10 Jul 2024 16:21:39 +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 | 2 + .../io/legado/app/help/AppFreezeMonitor.kt | 44 +++++++++++++++++++ .../io/legado/app/help/config/AppConfig.kt | 5 ++- .../app/ui/config/OtherConfigFragment.kt | 2 + .../main/java/io/legado/app/utils/LogUtils.kt | 21 +-------- 5 files changed, 52 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/io/legado/app/help/AppFreezeMonitor.kt diff --git a/app/src/main/java/io/legado/app/App.kt b/app/src/main/java/io/legado/app/App.kt index 2dc1b8efc..0407bd9b8 100644 --- a/app/src/main/java/io/legado/app/App.kt +++ b/app/src/main/java/io/legado/app/App.kt @@ -17,6 +17,7 @@ import io.legado.app.constant.AppConst.channelIdReadAloud import io.legado.app.constant.AppConst.channelIdWeb import io.legado.app.constant.PreferKey import io.legado.app.data.appDb +import io.legado.app.help.AppFreezeMonitor import io.legado.app.help.AppWebDav import io.legado.app.help.CrashHandler import io.legado.app.help.DefaultData @@ -70,6 +71,7 @@ class App : Application() { registerActivityLifecycleCallbacks(LifecycleHelp) defaultSharedPreferences.registerOnSharedPreferenceChangeListener(AppConfig) DefaultData.upVersion() + AppFreezeMonitor.init() Coroutine.async { URL.setURLStreamHandlerFactory(ObsoleteUrlFactory(okHttpClient)) launch { installGmsTlsProvider(appCtx) } diff --git a/app/src/main/java/io/legado/app/help/AppFreezeMonitor.kt b/app/src/main/java/io/legado/app/help/AppFreezeMonitor.kt new file mode 100644 index 000000000..4a3f2960b --- /dev/null +++ b/app/src/main/java/io/legado/app/help/AppFreezeMonitor.kt @@ -0,0 +1,44 @@ +package io.legado.app.help + +import android.os.Handler +import android.os.HandlerThread +import android.os.SystemClock +import io.legado.app.help.config.AppConfig +import io.legado.app.utils.LogUtils + +object AppFreezeMonitor { + + private const val TAG = "AppFreezeMonitor" + + val handler by lazy { + Handler(HandlerThread("AppFreezeMonitor").apply { start() }.looper) + } + + fun init() { + if (!AppConfig.recordLog) { + return + } + + var previous = SystemClock.uptimeMillis() + + val runnable = object : Runnable { + override fun run() { + val current = SystemClock.uptimeMillis() + val elapsed = current - previous + val extra = elapsed - 3000 + + if (extra > 100) { + LogUtils.d(TAG, "检测到应用被系统冻结,时长:$extra 毫秒") + } + + previous = current + + if (AppConfig.recordLog) { + handler.postDelayed(this, 3000) + } + } + } + handler.postDelayed(runnable, 3000) + } + +} diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index 2773f69c7..3da59f7fb 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -38,6 +38,7 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { var themeMode = appCtx.getPrefString(PreferKey.themeMode, "0") var useDefaultCover = appCtx.getPrefBoolean(PreferKey.useDefaultCover, false) var optimizeRender = appCtx.getPrefBoolean(PreferKey.optimizeRender, false) + var recordLog = appCtx.getPrefBoolean(PreferKey.recordLog) override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { when (key) { @@ -89,6 +90,8 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { PreferKey.optimizeRender -> optimizeRender = appCtx.getPrefBoolean(PreferKey.optimizeRender, false) + PreferKey.recordLog -> recordLog = appCtx.getPrefBoolean(PreferKey.recordLog) + } } @@ -456,8 +459,6 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { val webDavDeviceName get() = appCtx.getPrefString(PreferKey.webDavDeviceName, Build.MODEL) - val recordLog get() = appCtx.getPrefBoolean(PreferKey.recordLog) - val recordHeapDump get() = appCtx.getPrefBoolean(PreferKey.recordHeapDump, false) val loadCoverOnlyWifi get() = appCtx.getPrefBoolean(PreferKey.loadCoverOnlyWifi, false) 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 b67ec42b1..ddeae47be 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 @@ -15,6 +15,7 @@ import io.legado.app.R import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.databinding.DialogEditTextBinding +import io.legado.app.help.AppFreezeMonitor import io.legado.app.help.config.AppConfig import io.legado.app.help.config.LocalConfig import io.legado.app.lib.dialogs.alert @@ -176,6 +177,7 @@ class OtherConfigFragment : PreferenceFragment(), LogUtils.upLevel() LogUtils.logDeviceInfo() LiveEventBus.config().enableLogger(AppConfig.recordLog) + AppFreezeMonitor.init() } PreferKey.processText -> sharedPreferences?.let { 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 23f7b015f..f82951535 100644 --- a/app/src/main/java/io/legado/app/utils/LogUtils.kt +++ b/app/src/main/java/io/legado/app/utils/LogUtils.kt @@ -11,7 +11,6 @@ import io.legado.app.help.config.AppConfig import splitties.init.appCtx import java.text.SimpleDateFormat import java.util.Date -import java.util.logging.ConsoleHandler import java.util.logging.FileHandler import java.util.logging.Level import java.util.logging.LogRecord @@ -41,11 +40,10 @@ object LogUtils { } val logger: Logger by lazy { - Logger.getGlobal().apply { + Logger.getLogger("Leagdo").apply { fileHandler?.let { addHandler(it) } - addHandler(consoleHandler) } } @@ -75,22 +73,6 @@ object LogUtils { }.asynchronous() } - private val consoleHandler by lazy { - ConsoleHandler().apply { - formatter = object : java.util.logging.Formatter() { - override fun format(record: LogRecord): String { - // 设置文件输出格式 - return (getCurrentDateStr(TIME_PATTERN) + ": " + record.message + "\n") - } - } - level = if (AppConfig.recordLog) { - Level.INFO - } else { - Level.OFF - } - }.asynchronous() - } - fun upLevel() { val level = if (AppConfig.recordLog) { Level.INFO @@ -98,7 +80,6 @@ object LogUtils { Level.OFF } fileHandler?.level = level - consoleHandler.level = level } /**