在開發應用的過程中,安卓平臺給大家提供了非常多的除錯工具,包括Android Studio本身自帶的工具,如果不想使用Studio的話,也可以在終端使用adb工具進行除錯。
關於adb的用法網上有很多教程,這裡推薦一個較為完整的指南github.com/mzlogin/awe…
今天記錄一下我在實際情況中對adb的運用。
1.關於adb shell input text的問題
在使用這個命令的時候,我遇到了一個情況,就是無法輸入"&"。我在網上搜了一下,在StackOverFlow裡面,解決方案是這樣的:
adb shell input text "\&"
這個方案在終端執行是可以的,但是我是用python寫指令碼執行的,這樣做是無法成功的。
cmd = "adb shell input text '\&'"
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)複製程式碼
想了很久,最後使用以下解決方法,原因我也不太理解,不知道有沒有人來解答一下~
cmd = "adb shell input text '\&'"
cmd = cmd.replace('&', "\"\&\"")
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)複製程式碼
2.關於grep
grep命令起源於Linux系統。grep命令全稱是Global Regular Expression Print,是一種強大的文字搜尋工具,它能使用正規表示式搜尋文字,並把匹配的行列印出來。在使用adb命令的時候,我們也經常需要使用到它。
舉一個例子:
adb shell dumpsys window policy複製程式碼
這個命令會展示出android當前視窗(window)的所有屬性資訊:
如果我們想在其中提取出mShowingLockscreen屬性要怎麼做?
網上給了這樣一種方法:
adb shell dumpsys window policy | grep mShowingLockscreen複製程式碼
同樣在終端使用以及用python寫指令碼執行,出現問題:
(真是奇怪,同樣是終端,差別咋怎麼大,無法理解.......)
原因不明,下面給出幾種解決方案:
- 使用findstr
findstr相當於Windows下的grep命令。
adb shell dumpsys window policy | findstr mShowingLockscreen複製程式碼
執行成功!
- 使用^| grep
個人理解:^| 有點類似於轉義的作用
adb shell dumpsys window policy ^| grep mShowingLockscreen複製程式碼
執行成功!
3.關於python執行adb命令返回結果的問題
一般情況下,使用python執行adb命令是非常方便的,例如:
import subprocess
cmd = "adb shell input text test"
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)複製程式碼
但其實它只對一些立即返回結果的命令有用,對於一些需要一定等待時間的命令,它有時就會出現錯誤,例如:
import subprocess
cmd = "adb shell ping -c 4 www.baidu.com"
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
print "test"複製程式碼
這樣執行會出現錯誤,會直接輸出"test"。
這是因為subprocess.Popen物件建立後,主程式並不會自動等待子程式完成。我們必須呼叫物件的wait()方法,父程式才會等待 (也就是阻塞block):
import subprocess
cmd = "adb shell ping -c 4 www.baidu.com"
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
p.wait()
print "test"複製程式碼
大家可以執行對比一下~
4.如何獲取一段時間的logcat日誌
使用的是adb logcat命令,具體的引數網上有很多,這裡就不詳細展開。
這裡記錄一下我是如何獲取一段時間的logcat日誌的:
cmd = "adb logcat -v time"
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
time.sleep(10) # 這裡用time.sleep模擬了一段時間,可以把它替換成你需要執行的操作
p.terminate() # 終止程式,相當於終端用Ctrl + C
result = p.communicate()[0] # 獲取執行操作前後的日誌複製程式碼
這篇文章會同步到我的個人日誌,如有問題,請大家踴躍提出,謝謝大家!