Horis 2 лет назад
Родитель
Сommit
88c7bc2014

+ 2 - 0
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) }

+ 44 - 0
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)
+    }
+
+}

+ 3 - 2
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)

+ 2 - 0
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 {

+ 1 - 20
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
     }
 
     /**