This commit is contained in:
Horis
2024-07-10 16:21:39 +08:00
parent c940b51a59
commit 88c7bc2014
5 changed files with 52 additions and 22 deletions
+2
View File
@@ -17,6 +17,7 @@ import io.legado.app.constant.AppConst.channelIdReadAloud
import io.legado.app.constant.AppConst.channelIdWeb import io.legado.app.constant.AppConst.channelIdWeb
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.data.appDb import io.legado.app.data.appDb
import io.legado.app.help.AppFreezeMonitor
import io.legado.app.help.AppWebDav import io.legado.app.help.AppWebDav
import io.legado.app.help.CrashHandler import io.legado.app.help.CrashHandler
import io.legado.app.help.DefaultData import io.legado.app.help.DefaultData
@@ -70,6 +71,7 @@ class App : Application() {
registerActivityLifecycleCallbacks(LifecycleHelp) registerActivityLifecycleCallbacks(LifecycleHelp)
defaultSharedPreferences.registerOnSharedPreferenceChangeListener(AppConfig) defaultSharedPreferences.registerOnSharedPreferenceChangeListener(AppConfig)
DefaultData.upVersion() DefaultData.upVersion()
AppFreezeMonitor.init()
Coroutine.async { Coroutine.async {
URL.setURLStreamHandlerFactory(ObsoleteUrlFactory(okHttpClient)) URL.setURLStreamHandlerFactory(ObsoleteUrlFactory(okHttpClient))
launch { installGmsTlsProvider(appCtx) } launch { installGmsTlsProvider(appCtx) }
@@ -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)
}
}
@@ -38,6 +38,7 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
var themeMode = appCtx.getPrefString(PreferKey.themeMode, "0") var themeMode = appCtx.getPrefString(PreferKey.themeMode, "0")
var useDefaultCover = appCtx.getPrefBoolean(PreferKey.useDefaultCover, false) var useDefaultCover = appCtx.getPrefBoolean(PreferKey.useDefaultCover, false)
var optimizeRender = appCtx.getPrefBoolean(PreferKey.optimizeRender, false) var optimizeRender = appCtx.getPrefBoolean(PreferKey.optimizeRender, false)
var recordLog = appCtx.getPrefBoolean(PreferKey.recordLog)
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
when (key) { when (key) {
@@ -89,6 +90,8 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
PreferKey.optimizeRender -> optimizeRender = PreferKey.optimizeRender -> optimizeRender =
appCtx.getPrefBoolean(PreferKey.optimizeRender, false) 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 webDavDeviceName get() = appCtx.getPrefString(PreferKey.webDavDeviceName, Build.MODEL)
val recordLog get() = appCtx.getPrefBoolean(PreferKey.recordLog)
val recordHeapDump get() = appCtx.getPrefBoolean(PreferKey.recordHeapDump, false) val recordHeapDump get() = appCtx.getPrefBoolean(PreferKey.recordHeapDump, false)
val loadCoverOnlyWifi get() = appCtx.getPrefBoolean(PreferKey.loadCoverOnlyWifi, false) val loadCoverOnlyWifi get() = appCtx.getPrefBoolean(PreferKey.loadCoverOnlyWifi, false)
@@ -15,6 +15,7 @@ import io.legado.app.R
import io.legado.app.constant.EventBus import io.legado.app.constant.EventBus
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.databinding.DialogEditTextBinding 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.AppConfig
import io.legado.app.help.config.LocalConfig import io.legado.app.help.config.LocalConfig
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
@@ -176,6 +177,7 @@ class OtherConfigFragment : PreferenceFragment(),
LogUtils.upLevel() LogUtils.upLevel()
LogUtils.logDeviceInfo() LogUtils.logDeviceInfo()
LiveEventBus.config().enableLogger(AppConfig.recordLog) LiveEventBus.config().enableLogger(AppConfig.recordLog)
AppFreezeMonitor.init()
} }
PreferKey.processText -> sharedPreferences?.let { PreferKey.processText -> sharedPreferences?.let {
@@ -11,7 +11,6 @@ import io.legado.app.help.config.AppConfig
import splitties.init.appCtx import splitties.init.appCtx
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Date import java.util.Date
import java.util.logging.ConsoleHandler
import java.util.logging.FileHandler import java.util.logging.FileHandler
import java.util.logging.Level import java.util.logging.Level
import java.util.logging.LogRecord import java.util.logging.LogRecord
@@ -41,11 +40,10 @@ object LogUtils {
} }
val logger: Logger by lazy { val logger: Logger by lazy {
Logger.getGlobal().apply { Logger.getLogger("Leagdo").apply {
fileHandler?.let { fileHandler?.let {
addHandler(it) addHandler(it)
} }
addHandler(consoleHandler)
} }
} }
@@ -75,22 +73,6 @@ object LogUtils {
}.asynchronous() }.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() { fun upLevel() {
val level = if (AppConfig.recordLog) { val level = if (AppConfig.recordLog) {
Level.INFO Level.INFO
@@ -98,7 +80,6 @@ object LogUtils {
Level.OFF Level.OFF
} }
fileHandler?.level = level fileHandler?.level = level
consoleHandler.level = level
} }
/** /**