被Bug搞瘋了?給你的應(yīng)用嵌入一個(gè)Logcat吧
作者:椎鋒陷陳
https://www.jianshu.com/u/9bfd80e684ad
前言

allprojects {
repositories {
...
maven{ url "https://dl.bintray.com/madchan/maven" }
}
}
implementation 'com.madchan.library:embeddedlogcat:1.0.0'
startActivity(Intent(this, LogcatActivity::class.java))
https://github.com/madchan/EmbeddedLogcat
正文
知識(shí)儲(chǔ)備

Verbose:顯示所有日志消息(默認(rèn)值)。 Debug:顯示僅在開發(fā)期間有用的調(diào)試日志消息,以及此列表中較低的消息級(jí)別。 Info:顯示常規(guī)使用情況的預(yù)期日志消息,以及此列表中較低的消息級(jí)別。 Warn:顯示尚不是錯(cuò)誤的潛在問題,以及此列表中較低的消息級(jí)別。 Error:顯示已經(jīng)引發(fā)錯(cuò)誤的問題,以及此列表中較低的消息級(jí)別。 Assert:顯示開發(fā)者預(yù)計(jì)絕不會(huì)發(fā)生的問題。
Show only selected application:僅顯示通過應(yīng)用代碼生成的消息(默認(rèn)選項(xiàng))。Logcat 使用正在運(yùn)行的應(yīng)用的 PID 來過濾日志消息。 No Filters:不應(yīng)用過濾器。無論您選擇哪個(gè)進(jìn)程,logcat 都會(huì)顯示設(shè)備中的所有日志消息。 Edit Filter Configuration:創(chuàng)建或修改自定義過濾器。例如,您可以創(chuàng)建一個(gè)過濾器,以同時(shí)查看兩個(gè)應(yīng)用中的日志消息。
adb logcat --help
方案實(shí)現(xiàn)
data class Command(var level: String = " *:V") { // 級(jí)別
var pid: Int? = 0 // 進(jìn)程ID
var expr: String? = null // 關(guān)鍵詞
override fun toString(): String {
val builder = StringBuilder("logcat -d -v time $level")
pid?.let {
builder.append(" --pid=$pid")
}
if (!TextUtils.isEmpty(expr)) {
builder.append(" -e $expr+")
}
return builder.toString()
}
}
adb logcat -d
// LogcatExecutor.kt
...
private fun execOutputCommand(command: Command?) {
try {
val command = command?.toString() ?: "logcat -d"
val process = Runtime.getRuntime().exec(command)
val bufferedReader = BufferedReader(InputStreamReader(process.inputStream))
val log = StringBuilder()
var line: String? = bufferedReader.readLine()
while (line != null) {
log.append(line)
log.append("\n\n")
line = bufferedReader.readLine()
}
callback?.onLogOutput(log.toString())
} catch (e: IOException) {
Log.e("LogcatHandler", "執(zhí)行Logcat命令行失?。? + e.message)
}
}
...
// LogcatActivity.kt
...
private lateinit var process: Spinner
...
process.onItemSelectedListener = object : OnItemSelectedListener {
override fun onItemSelected(
adapterView: AdapterView<*>?,
view: View,
position: Int,
l: Long
) {
command.pid = processMap[(process.adapter.getItem(position) as String)]
startOutput()
}
override fun onNothingSelected(adapterView: AdapterView<*>?) {}
}
...
// LogcatActivity.kt
...
private lateinit var level: Spinner
...
level.onItemSelectedListener = object : OnItemSelectedListener {
override fun onItemSelected(
adapterView: AdapterView<*>?,
view: View,
i: Int,
l: Long
) {
when (i) {
0 -> command.level = "*:V"
1 -> command.level = "*:D"
2 -> command.level = "*:I"
3 -> command.level = "*:W"
4 -> command.level = "*:E"
else -> {
}
}
startOutput()
}
override fun onNothingSelected(adapterView: AdapterView<*>?) {}
}
...
// LogcatActivity.kt
...
private lateinit var search: EditText
...
search.addTextChangedListener (object : TextWatcher{
override fun afterTextChanged(s: Editable?) {
command.expr = s.toString().trim()
startOutput()
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
})
...
使用場(chǎng)景
https://www.jianshu.com/p/6ae1794d8fca
總結(jié)
推薦閱讀
? 耗時(shí)2年,Android進(jìn)階三部曲第三部《Android進(jìn)階指北》出版!
推薦我的技術(shù)博客
推薦一下我的獨(dú)立博客: liuwangshu.cn ,內(nèi)含Android最強(qiáng)原創(chuàng)知識(shí)體系,一直在更新,歡迎體驗(yàn)和收藏!
BATcoder技術(shù)群,讓一部分人先進(jìn)大廠
你好,我是劉望舒,百度百科收錄的騰訊云TVP專家,著有三本技術(shù)暢銷書,蟬聯(lián)四屆電子工業(yè)出版社年度優(yōu)秀作者,谷歌開發(fā)者社區(qū)特邀講師。
前華為面試官,現(xiàn)大廠技術(shù)負(fù)責(zé)人。
歡迎添加我的微信 henglimogan ,備注:BATcoder,加入BATcoder技術(shù)群。
明天見(??ω??)
評(píng)論
圖片
表情
