@@ -18,39 +18,38 @@ import kotlin.concurrent.thread
18
18
class CrashHandler private constructor(val application : Application , val debug : Boolean ) : Thread.UncaughtExceptionHandler {
19
19
// 系统默认的UncaughtException处理类
20
20
private var mDefaultHandler: Thread .UncaughtExceptionHandler = Thread .getDefaultUncaughtExceptionHandler()
21
- private var sb: StringBuffer = StringBuffer ()
22
- private var map: HashMap <String , String >
21
+ private var info: HashMap <String , String > // 设备及应用信息
23
22
private var callback: CrashHandlerCallback ? = null
24
23
25
24
init {
26
25
// 设置该CrashHandler为程序的默认处理器
27
26
Thread .setDefaultUncaughtExceptionHandler(this )
28
27
// 设施信息
29
- map = HashMap ()
28
+ info = HashMap ()
30
29
try {
31
30
val mPackageManager = application.packageManager
32
31
val mPackageInfo: PackageInfo = mPackageManager.getPackageInfo(application.packageName, PackageManager .GET_ACTIVITIES )
33
32
// APP显示的版本名
34
- map [APP_VERSION_NAME ] = mPackageInfo.versionName
33
+ info [APP_VERSION_NAME ] = mPackageInfo.versionName
35
34
// APP的版本编号
36
35
if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .P ) {
37
- map [APP_VERSION_CODE ] = " ${mPackageInfo.longVersionCode} "
36
+ info [APP_VERSION_CODE ] = " ${mPackageInfo.longVersionCode} "
38
37
} else {
39
- map [APP_VERSION_CODE ] = " ${mPackageInfo.versionCode} "
38
+ info [APP_VERSION_CODE ] = " ${mPackageInfo.versionCode} "
40
39
}
41
40
} catch (e: PackageManager .NameNotFoundException ) {
42
41
e.printStackTrace()
43
42
}
44
43
45
44
// Android版本Int
46
- map [SYS_RELEASE_CODE ] = " ${Build .VERSION .SDK_INT } "
45
+ info [SYS_RELEASE_CODE ] = " ${Build .VERSION .SDK_INT } "
47
46
// Android显示的版本号
48
- map [SYS_RELEASE_NAME ] = Build .VERSION .RELEASE
47
+ info [SYS_RELEASE_NAME ] = Build .VERSION .RELEASE
49
48
// ABI
50
49
if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .LOLLIPOP ) {
51
- map [ABIS ] = Build .SUPPORTED_ABIS ?.contentToString() ? : " "
50
+ info [ABIS ] = Build .SUPPORTED_ABIS ?.contentToString() ? : " "
52
51
} else {
53
- map [ABIS ] = mutableListOf<String >().apply {
52
+ info [ABIS ] = mutableListOf<String >().apply {
54
53
if (Build .CPU_ABI .isNotEmpty()) {
55
54
add(Build .CPU_ABI )
56
55
}
@@ -62,30 +61,30 @@ class CrashHandler private constructor(val application: Application, val debug:
62
61
}
63
62
}
64
63
// 主板名称
65
- map [BOARD ] = Build .BOARD
64
+ info [BOARD ] = Build .BOARD
66
65
// 手机品牌
67
- map [BRAND ] = Build .BRAND
66
+ info [BRAND ] = Build .BRAND
68
67
// 工业品设计外观名称,名称没什么规律
69
- map [DEVICE ] = Build .DEVICE
68
+ info [DEVICE ] = Build .DEVICE
70
69
// 显示给用户的名称
71
- map [DISPLAY ] = Build .DISPLAY
70
+ info [DISPLAY ] = Build .DISPLAY
72
71
// 设备指纹,由厂商、型号、等内容组成的字符,一般同一型号同一系统手机这个值相同
73
- map [FINGERPRINT ] = Build .FINGERPRINT
72
+ info [FINGERPRINT ] = Build .FINGERPRINT
74
73
// 硬件名称,一般为CPU名称
75
- map [HARDWARE ] = Build .HARDWARE
74
+ info [HARDWARE ] = Build .HARDWARE
76
75
// 变更列表编号,可能是品牌和设备名
77
- map [ID ] = Build .ID
76
+ info [ID ] = Build .ID
78
77
// 硬件制造商
79
- map [MANUFACTURER ] = Build .MANUFACTURER
78
+ info [MANUFACTURER ] = Build .MANUFACTURER
80
79
// 产品具体型号
81
- map [MODEL ] = Build .MODEL
80
+ info [MODEL ] = Build .MODEL
82
81
}
83
82
84
83
override fun uncaughtException (t : Thread ? , e : Throwable ? ) {
85
- e?.let {
86
- saveException(application, it )
87
- }
88
- callback?.submitLog(map, sb.toString() )
84
+ val exception = e?.let { obtainExceptionInfo(it) } ? : " "
85
+ callback?.addParam(info )
86
+ saveException(exception)
87
+ callback?.submitLog(info, exception )
89
88
if (debug) {
90
89
mDefaultHandler.uncaughtException(t, e)
91
90
} else {
@@ -107,18 +106,12 @@ class CrashHandler private constructor(val application: Application, val debug:
107
106
/* *
108
107
* 保存log
109
108
*/
110
- private fun saveException (application : Application , ex : Throwable ) {
111
- val sb = getLog(ex)
109
+ private fun saveException (ex : String ) {
110
+ val sb = StringBuffer ()
111
+ info.map { entry -> sb.append(entry.key).append(" = " ).append(entry.value).append(" \n " ) }
112
112
val filename = FileUtil .createFileName(" log" , " .txt" )
113
113
// 存储至外部私有目录
114
- File (FileUtil .getExternalStoragePrivateLogPath(application), filename).writeText(sb.toString())
115
- }
116
-
117
- private fun getLog (ex : Throwable ): StringBuffer {
118
- sb = StringBuffer ()
119
- map.map { entry -> sb.append(entry.key).append(" = " ).append(entry.value).append(" \n " ) }
120
- sb.append(obtainExceptionInfo(ex))
121
- return sb
114
+ File (FileUtil .getExternalStoragePrivateLogPath(application), filename).writeText(sb.toString() + ex)
122
115
}
123
116
124
117
/* *
@@ -137,9 +130,19 @@ class CrashHandler private constructor(val application: Application, val debug:
137
130
}
138
131
139
132
interface CrashHandlerCallback {
133
+ /* *
134
+ * 添加KV参数
135
+ */
136
+ fun addParam (info : HashMap <String , String >)
137
+ /* *
138
+ * 结束所有界面
139
+ */
140
140
fun finishAll ()
141
141
142
- fun submitLog (deviceInfo : Map <String , String >, exception : String )
142
+ /* *
143
+ * 提交保存异常
144
+ */
145
+ fun submitLog (info : Map <String , String >, exception : String )
143
146
}
144
147
145
148
companion object {
0 commit comments