|
@@ -9,6 +9,7 @@ import io.legado.app.utils.FileUtils
|
|
|
import io.legado.app.utils.getFile
|
|
import io.legado.app.utils.getFile
|
|
|
import io.legado.app.utils.longToastOnUi
|
|
import io.legado.app.utils.longToastOnUi
|
|
|
import io.legado.app.utils.msg
|
|
import io.legado.app.utils.msg
|
|
|
|
|
+import splitties.init.appCtx
|
|
|
import java.io.PrintWriter
|
|
import java.io.PrintWriter
|
|
|
import java.io.StringWriter
|
|
import java.io.StringWriter
|
|
|
import java.text.SimpleDateFormat
|
|
import java.text.SimpleDateFormat
|
|
@@ -26,17 +27,6 @@ class CrashHandler(val context: Context) : Thread.UncaughtExceptionHandler {
|
|
|
*/
|
|
*/
|
|
|
private var mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler()
|
|
private var mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler()
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * 存储异常和参数信息
|
|
|
|
|
- */
|
|
|
|
|
- private val paramsMap = HashMap<String, String>()
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 格式化时间
|
|
|
|
|
- */
|
|
|
|
|
- @SuppressLint("SimpleDateFormat")
|
|
|
|
|
- private val format = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss")
|
|
|
|
|
-
|
|
|
|
|
init {
|
|
init {
|
|
|
//设置该CrashHandler为系统默认的
|
|
//设置该CrashHandler为系统默认的
|
|
|
Thread.setDefaultUncaughtExceptionHandler(this)
|
|
Thread.setDefaultUncaughtExceptionHandler(this)
|
|
@@ -56,62 +46,71 @@ class CrashHandler(val context: Context) : Thread.UncaughtExceptionHandler {
|
|
|
*/
|
|
*/
|
|
|
private fun handleException(ex: Throwable?) {
|
|
private fun handleException(ex: Throwable?) {
|
|
|
if (ex == null) return
|
|
if (ex == null) return
|
|
|
- //收集设备参数信息
|
|
|
|
|
- collectDeviceInfo()
|
|
|
|
|
//保存日志文件
|
|
//保存日志文件
|
|
|
saveCrashInfo2File(ex)
|
|
saveCrashInfo2File(ex)
|
|
|
context.longToastOnUi(ex.msg)
|
|
context.longToastOnUi(ex.msg)
|
|
|
Thread.sleep(3000)
|
|
Thread.sleep(3000)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * 收集设备参数信息
|
|
|
|
|
- */
|
|
|
|
|
- private fun collectDeviceInfo() {
|
|
|
|
|
- kotlin.runCatching {
|
|
|
|
|
- //获取系统信息
|
|
|
|
|
- paramsMap["MANUFACTURER"] = Build.MANUFACTURER
|
|
|
|
|
- paramsMap["BRAND"] = Build.BRAND
|
|
|
|
|
- //获取app版本信息
|
|
|
|
|
- AppConst.appInfo.let {
|
|
|
|
|
- paramsMap["versionName"] = it.versionName
|
|
|
|
|
- paramsMap["versionCode"] = it.versionCode.toString()
|
|
|
|
|
|
|
+ companion object {
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 存储异常和参数信息
|
|
|
|
|
+ */
|
|
|
|
|
+ private val paramsMap by lazy {
|
|
|
|
|
+ val map = HashMap<String, String>()
|
|
|
|
|
+ kotlin.runCatching {
|
|
|
|
|
+ //获取系统信息
|
|
|
|
|
+ map["MANUFACTURER"] = Build.MANUFACTURER
|
|
|
|
|
+ map["BRAND"] = Build.BRAND
|
|
|
|
|
+ //获取app版本信息
|
|
|
|
|
+ AppConst.appInfo.let {
|
|
|
|
|
+ map["versionName"] = it.versionName
|
|
|
|
|
+ map["versionCode"] = it.versionCode.toString()
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ map
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * 保存错误信息到文件中
|
|
|
|
|
- */
|
|
|
|
|
- private fun saveCrashInfo2File(ex: Throwable) {
|
|
|
|
|
- val sb = StringBuilder()
|
|
|
|
|
- for ((key, value) in paramsMap) {
|
|
|
|
|
- sb.append(key).append("=").append(value).append("\n")
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 格式化时间
|
|
|
|
|
+ */
|
|
|
|
|
+ @SuppressLint("SimpleDateFormat")
|
|
|
|
|
+ private val format = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss")
|
|
|
|
|
|
|
|
- val writer = StringWriter()
|
|
|
|
|
- val printWriter = PrintWriter(writer)
|
|
|
|
|
- ex.printStackTrace(printWriter)
|
|
|
|
|
- var cause: Throwable? = ex.cause
|
|
|
|
|
- while (cause != null) {
|
|
|
|
|
- cause.printStackTrace(printWriter)
|
|
|
|
|
- cause = cause.cause
|
|
|
|
|
- }
|
|
|
|
|
- printWriter.close()
|
|
|
|
|
- val result = writer.toString()
|
|
|
|
|
- sb.append(result)
|
|
|
|
|
- val timestamp = System.currentTimeMillis()
|
|
|
|
|
- val time = format.format(Date())
|
|
|
|
|
- val fileName = "crash-$time-$timestamp.log"
|
|
|
|
|
- context.externalCacheDir?.let { rootFile ->
|
|
|
|
|
- rootFile.getFile("crash").listFiles()?.forEach {
|
|
|
|
|
- if (it.lastModified() < System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7)) {
|
|
|
|
|
- it.delete()
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 保存错误信息到文件中
|
|
|
|
|
+ */
|
|
|
|
|
+ fun saveCrashInfo2File(ex: Throwable) {
|
|
|
|
|
+ val sb = StringBuilder()
|
|
|
|
|
+ for ((key, value) in paramsMap) {
|
|
|
|
|
+ sb.append(key).append("=").append(value).append("\n")
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ val writer = StringWriter()
|
|
|
|
|
+ val printWriter = PrintWriter(writer)
|
|
|
|
|
+ ex.printStackTrace(printWriter)
|
|
|
|
|
+ var cause: Throwable? = ex.cause
|
|
|
|
|
+ while (cause != null) {
|
|
|
|
|
+ cause.printStackTrace(printWriter)
|
|
|
|
|
+ cause = cause.cause
|
|
|
|
|
+ }
|
|
|
|
|
+ printWriter.close()
|
|
|
|
|
+ val result = writer.toString()
|
|
|
|
|
+ sb.append(result)
|
|
|
|
|
+ val timestamp = System.currentTimeMillis()
|
|
|
|
|
+ val time = format.format(Date())
|
|
|
|
|
+ val fileName = "crash-$time-$timestamp.log"
|
|
|
|
|
+ appCtx.externalCacheDir?.let { rootFile ->
|
|
|
|
|
+ rootFile.getFile("crash").listFiles()?.forEach {
|
|
|
|
|
+ if (it.lastModified() < System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7)) {
|
|
|
|
|
+ it.delete()
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ FileUtils.createFileIfNotExist(rootFile, "crash", fileName)
|
|
|
|
|
+ .writeText(sb.toString())
|
|
|
}
|
|
}
|
|
|
- FileUtils.createFileIfNotExist(rootFile, "crash", fileName)
|
|
|
|
|
- .writeText(sb.toString())
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|