优化
This commit is contained in:
@@ -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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user