Android adb命令的一些實際運用

張朝旭發表於2019-03-04

在開發應用的過程中,安卓平臺給大家提供了非常多的除錯工具,包括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)的所有屬性資訊:

image.png
image.png

如果我們想在其中提取出mShowingLockscreen屬性要怎麼做?

網上給了這樣一種方法:

adb shell dumpsys window policy | grep mShowingLockscreen複製程式碼

同樣在終端使用以及用python寫指令碼執行,出現問題:

系統終端測試.png
系統終端測試.png

git bash終端測試.png
git bash終端測試.png

(真是奇怪,同樣是終端,差別咋怎麼大,無法理解.......)

原因不明,下面給出幾種解決方案:

  • 使用findstr

findstr相當於Windows下的grep命令。

adb shell dumpsys window policy | findstr mShowingLockscreen複製程式碼

執行成功!

success1.png
success1.png

  • 使用^| grep

個人理解:^| 有點類似於轉義的作用

adb shell dumpsys window policy ^| grep mShowingLockscreen複製程式碼

執行成功!

success2.png
success2.png

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] # 獲取執行操作前後的日誌複製程式碼

這篇文章會同步到我的個人日誌,如有問題,請大家踴躍提出,謝謝大家!

相關文章