一:工作環境:
adb的工作方式比較特殊采用監聽Socket TCP 5554等端口的方式讓IDE和Qemu通訊,默認情況下adb會daemon相關的網絡端口,所以當我們運行Eclipse時adb進程就會自動運行。
1.通過adb可以輕松的執行Linux Shell命令,如adb shell dir 就是列舉目錄,在Linux中根目錄為/而不是Windows上的C盤、D盤。
2.安裝apk程序到模擬器則執行adb install android123.apk,這樣名為android123的安裝包就會安裝到Android模擬器中,前提是android123.apk文件需要放到SDK/Tools目錄下。
3.向emulator傳送文件, 使用adb push android123.txt /tmp/android123.txt命令可以把SDK/Tools下的android123.txt文件傳輸到模擬器的/tmp/文件夾中,需要注意的是/tmp/文件夾中內容會在Android模擬器重新啟動時清空。
4.從Android仿真器中回傳文件到電腦
通過adb pull /tmp/android123.txt android123.txt命令就會把仿真器的tmp文件夾下android123.txt文件回傳到電腦SDK/Tools目錄下
二:常用命令大全
1. 顯示系統中全部Android平台:
android list targets
2. 顯示系統中全部AVD(模擬器):
android list avd
3. 創建AVD(模擬器):
android create avd --name 名稱 --target 平台編號
4. 啟動模擬器:
emulator -avd 名稱 -sdcard ~/名稱.img (-skin 1280x800)
5. 刪除AVD(模擬器):
android delete avd --name 名稱
6. 創建SDCard:
mksdcard 1024M ~/名稱.img
7. AVD(模擬器)所在位置:
Linux(~/.android/avd) Windows(C:\Documents and Settings\Administrator\.android\avd)
8. 啟動DDMS:
ddms
9. 顯示當前運行的全部模擬器:
adb devices
10. 對某一模擬器執行命令:
abd -s 模擬器編號 命令
11. 安裝應用程序:
adb install -r 應用程序.apk
12. 獲取模擬器中的文件:
adb pull <remote> <local>
13. 向模擬器中寫文件:
adb push <local> <remote>
14. 進入模擬器的shell模式:
adb shell
15. 啟動SDK,文檔,實例下載管理器:
android
16. 缷載apk包:
adb shell
cd data/app
rm apk包
exit
adb uninstall apk包的主包名
adb install -r apk包
17. 查看adb命令幫助信息:
adb help
18. 在命令行中查看LOG信息:
adb logcat -s 標簽名
19. adb shell后面跟的命令主要來自:
源碼\system\core\toolbox目錄和源碼\frameworks\base\cmds目錄。
20. 刪除系統應用:
adb remount (重新掛載系統分區,使系統分區重新可寫)。
adb shell
cd system/app
rm *.apk
21. 獲取管理員權限:
adb root
22. 啟動Activity:
adb shell am start -n 包名/包名+類名(-n 類名,-a action,-d date,-m MIME-TYPE,-ccategory,-e 擴展數據,等)。
23、發布端口:
你可以設置任意的端口號,作為主機向模擬器或設備的請求端口。如:
adb forward tcp:5555 tcp:8000
24、復制文件:
你可向一個設備或從一個設備中復制文件,
復制一個文件或目錄到設備或模擬器上:
adb push <source> <destination></destination></source>
如:adb push test.txt /tmp/test.txt
從設備或模擬器上復制一個文件或目錄:
adb pull <source><destination></destination></source>
如:adb pull /addroid/lib/libwebcore.so .
25、搜索模擬器/設備的實例:
取得當前運行的模擬器/設備的實例的列表及每個實例的狀態:
adb devices
26、查看bug報告:
adb bugreport
27、記錄無線通訊日志:
一般來說,無線通訊的日志非常多,在運行時沒必要去記錄,但我們還是可以通過命令,設置記錄:
adb shell
logcat -b radio
28、獲取設備的ID和序列號:
adb get-product
adb get-serialno
29、訪問數據庫SQLite3
adb shell
sqlite3
#cd system/sd/data //進入系統內指定文件夾
#ls //列表顯示當前文件夾內容
#rm -r xxx //刪除名字為xxx的文件夾及其里面的所有文件
#rm xxx //刪除文件xxx
#rmdir xxx //刪除xxx的文件夾
30、點亮屏幕
adb shellinput keyevent 82
31、日志相關:
日志
命令行顯示Log
復制代碼 代碼如下:
adb logcat
根據tagname過濾
復制代碼 代碼如下:
adb logcat -s TAG_NAME
adb logcat -s TAG_NAME_1 TAG_NAME_2
#example
adb logcat -s TEST
adb logcat -s TEST MYAPP
優先過濾
顯示一個特定的優先級警告及以上的日志。
復制代碼 代碼如下:
adb logcat "*:PRIORITY"
# example
adb logcat "*:W"
優先級:
V — 細則 (最低優先級)
D — 調試
I — 信息
W — 警告
E — 錯誤
F — 致命
S — 靜默 (最高優先級,不會打印任何信息)
使用grep過濾
這個很像在Linux上使用管道命令一樣,需系統支持
復制代碼 代碼如下:
adb logcat | grep "SEARCH_TERM"
adb logcat | grep "SEARCH_TERM_1\|SEARCH_TERM_2"
#example
adb logcat | grep "Exception"
adb logcat | grep "Exception\|Error"
清除日志塊
使用來清除舊的日志
復制代碼 代碼如下:
adb logcat -c
adb對於Android程序員來說在日常的工作中使用頻率很高,現將自己工作中常用的adb命令總結一下備忘,方便查詢,也供大家參考。查看應用內存占用,耗電信息,啟動時間,wakelock,跑monkey的命令在之前的應用性能優化中起了不小的作用。以下adb命令的測試機器為小米3,其中package_name代表包名。
基礎腳本:
1、啟動adb服務
adb start-server
2、終止adb服務
adb kill-server
3、進入adb運行環境
adb shell
4、獲取幫助 里面有adb的各種命令和參數的介紹
adb help
5、查看adb版本
adb version
6、以root權限重啟adb
adb root
7、將system分區重新掛在為可讀寫分區,此命令在操作系統目錄時很重要
adb remount
8、重啟設備,可選參數進入bootloader(刷機模式)或recovery(恢復模式)
adb reboot [bootloader|recovery]
apk相關:
1、安裝apk
adb install test.apk -r 覆蓋安裝,保留數據和緩存文件 -d 解決低版本version問題 -s 安裝apk到sd卡
2、卸載apk
adb uninstall -k <package_name>
可選參數-k的作用為卸載軟件但是保留配置和緩存文件
3、查看app相關所有信息,包括action,codepath,version,需要的權限等等信息
adb shell dumpsys package <package_name>
4、查看app的路徑
adb shell pm path <package_name>
查看了一個普通app的路徑,如下,位於data/app下面的普通app
package:/data/app/com.tencent.test-1/base.apk
5、查看apk的版本信息
adb shell dumpsys package <package_name> | grepversion
如果你得到的是下圖的兩個version版本,則為系統app,下面是系統app本身的版本,上面是升級之后的系統app的版本信息
versionCode=8 targetSdk=22 versionName=V0.08 versionCode=6targetSdk=22 versionName=V0.0
6、啟動activity
查看:
adb shell dumpsys window | findstr mCurrentFocus 命令查看當前運行的包名和Activity
adb shell am start -n<package_name>/.<activity_class_name>
C:\Users\lenovo>adb shell
venus:/ $ ^C
C:\Users\lenovo>adb shell dumpsys window | findstrmCurrentFocus
mCurrentFocus=Window{3bd0b18 u0com.android.settings/com.asu.msettings.AsuSettingsActiv
C:\Users\lenovo>adb shell am start -ncom.android.settings/com.asu.msettings.AsuSettingsA
Starting: Intent { cmp=com.android.settings/com.asu.msettings.AsuSettingsActivityAlias}
6.16
清楚應用數據adb shell pm path <PACKAGE>
輸出安裝包的APK路徑
adb shell pm clear <PACKAGE>
刪除與包相關的所有數據:清除數據和緩存
7、獲得應用的啟動時間,可以很方便地獲取應用的啟動時間
adb shell am start -W<package_name>/.<activity_class_name>
試驗結果如下:
adb shell am start -Wcom.cc.test/com.painter.test.PainterMainActivity Starting: Intent {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]cmp=com.cc.test/com.painter.test.PainterMainActivity } Status: ok Activity:com.cc.test/com.painter.test.PainterMainActivity ThisTime: 355 TotalTime: 355WaitTime: 365 Complete
返回的幾個結果,以WaitTime為准,返回的是從startActivity到應用第一幀完全顯示的時間。
8、啟動service,am的-n參數表示組件,-a參數表示命令,-a后面的參數為manifest中定義的service的action
adb shell am startservice -n<package_name>/.<service_class_name>
也可:
adb shell am startservice -a"android.intent.action.CALL"
9、發送廣播
adb shell am broadcast -a"android.intent.action.AdupsFota.WriteCommandReceiver"
廣播可以帶上不同類型的參數,–es為string參數類型,–ei為int參數類型,–ez為boolean參數類型
adb shell am broadcast -a "android.intent.action.AdupsFota.WriteCommandReceiver"--es test_string "this is test string"
10、查看某個app的進程相關信息
10.1
adb shell ps <package_name|PID>
例如
adb shell ps com.ma.app:push USER PID PPID VSIZE RSS WCHAN PC NAME u0_a116 5483 304 1776564 55112sys_epoll_ 00000000 S com.ma.app:push
小米手機上測試成功,在另外一個設備上,如果ps后面的參數是包名則顯示不了進程的詳細信息,參見下面的方式獲取
10.2
adb shell ps | grep <package_name>
11、殺掉某個進程,一般用於模擬某個bug復現
adb shell kill pidNumber
12、查看某一個app的內存占用
adb shell dumpsys meminfo <package_name|PID>
結果如下,其中的Heap size包括了Dalvik Heap和Native Heap,平時我們所說的內存限制指的是Dalvik Heap。
Pss PrivatePrivate Swapped Heap Heap Heap Total Dirty CleanDirty Size Alloc Free ------ ------ ------ ------ ------ ------ ------ Native Heap 1895618940 0 4696 44288 21352 22935 Dalvik Heap 60102 60088 0 26192 104486 88285 16201 App Summary Pss(KB) ------ Java Heap: 61640 Native Heap:18940 Code: 3356 Stack: 428 Graphics: 16876 Private Other: 3840 System: 2031 ...
13、查看單個應用程序的最大內存限制
adb shell getprop | grep heapgrowthlimit
得到的結果為128M: [dalvik.vm.heapgrowthlimit]: [128m]
這就是說Dalvik Heap size的最大值超過了128M,就很可能發生OOM
14、獲取單個應用的電量消耗信息
Battery Historian是Android 5.0開始引入的,下面的命令為獲取單個app的電量消耗信息,獲取系統耗電信息見下節
adb shell dumpsys batterystats ><package_name> > xxx.txt
上面的電量信息為原始數據,可以通過google編寫的historian.py腳本把數據信息轉換為可讀性很好的html文件,類似TraceView生成的列表數據,之前在做app性能優化的時候起了很大的作用
python historian.py xxx.txt > xxx.html
15、跑monkey,個人很喜歡這個命令,運行過程中,應用程序會不斷切換畫面,按照選定的不同級別反饋信息,還可以看到執行過程報告和生成的事件。測試應用的穩定性時很實用。現在studio也有了monkeyrunner的tool
adb shell monkey -v -p <package_name> 500 -p 對象包 -v 反饋信息級別
:Monkey: seed=1493061025112 count=500 :AllowPackage:com.tencent.mm.app:push :IncludeCategory: android.intent.category.LAUNCHER:IncludeCategory: android.intent.category.MONKEY ** No activities found to run,monkey aborted.
系統相關
1、查看設備名稱,豌豆莢等應用就是通過此來獲得設備的名稱
adb shell cat /system/build.prop/
結果:
ro.product.model=MI 3W ro.product.brand=Xiaomi
2、查看手機分辨率有兩種方法,第二種方法最為簡潔
2.1
adb shell dumpsys window | grep Surface
grep是一個非常有用的參數,具體含義和用法大家自行google一下,試驗結果為1080 * 1920:
Surface: shown=false layer=21000 alpha=1.0rect=(0.0,0.0) 1080.0 x 1920.0
2.2.
adb shell wm size
返回結果為:
Physical size: 1080x1920
3、查看手機sdk版本
adb shell getprop | grep version
運行上面的命令后,列出來的version中[ro.build.version.release]: [6.0.1]即為手機sdk版本
4、查看手機型號信息
adb shell getprop | grep product
運行此命令之后,能看到product,board,brand和cpu等等的型號
5、獲取序列號,獲取到的序列號即為adb devices列出來的序列號
adb get-serialno
6、查看連接的設備
adb devices
如果有多個設備連接,想對其中的某一設備進行操作,就需要在此命令的后面加參數
adb [-d|-e|-s <serial Number>] <command> -d:真機(多個設備中只有一個真機時適用) -e:模擬器(多個設備中只有一個模擬器時適用) -s:序列號
假如有兩個真機連接了我的電腦,adb devices獲取到的數據如下
List of devices attached 1b71651 device 12sdfsd device
進入1b71651設備的命令為:
adb -s 1b71651 shell
7、查看wifi密碼(需要root權限)
adb shell cat data/misc/wifi/*.conf
8、查看wifi_mac
adb shell cat /sys/class/net/wlan0/address
運行此命令,93:a1:a2:91:d1:c1是小米3的wifi_mac地址
9、查看后台services信息
adb shell service list
運行結果為
Found 126 services: 0 miui.whetstone.net:[miui.whetstone.INetworkService] 1 miui.whetstone.power: [miui.whetstone.power]...
10、查看系統當前內存占用,為總述
adb shell cat /proc/meminfo
運行結果:
MemTotal: 1893504 kB MemFree: 81200 kBBuffers: 14828 kB Cached: 244152 kB SwapCached: 15152 kB Active: 541680 kB Inactive: 575280 kB ...
11、查看各進程詳細內存占用和系統的內存占用有幾種方法
11.1
adb shell dumpsys meminfo
Total PSS SWAP by process: 97858 kB: 34944 kB: com.android.systemui (pid2769) ... Total RAM: 1893504 kB (statusnormal) Free RAM: 344212 kB (117992 cached pss + 136016 cached kernel + 90204free)
Total PSS 信息就是你的應用真正占據的內存大小,通過這個信息,可以輕松判別手機中哪些程序占內存比較大。
11.2 查看各進程內存的另一方法 不是所有設備都支持
adb shell procrank
運行結果如下:
PID Vss Rss Pss Uss cmdline 496 1810184K92744K 57607K 48348K system_server 743 1847492K 84492K 52117K 46796Kcom.android.systemui .... ------------ ------ 328259K 261484K TOTALRAM: 2061012K total, 889152K free, 40940K buffers, 612032K cached, 300K shmem,62556K slab
其中
VSS – Virtual Set Size 虛擬耗用內存(包含共享庫占用的內存) RSS – Resident Set Size 實際使用物理內存(包含共享庫占用的內存) PSS – Proportional Set Size 實際使用的物理內存(比例分配共享庫占用的內存) USS – Unique Set Size 進程獨自占用的物理內存(不包含共享庫占用的內存)
11.3 查看設備上進程的cpu和內存占用情況
adb shell top
12、查看系統耗電情況
adb shell dumpsys batterystats > xxx.txt
13、查看系統設置的鬧鍾
adb shell dumpsys alarm
14、查看系統的wakelock,不合理的使用wakelock會導致系統耗電加劇
adb shell dumpsys power
返回結果:
Wake Locks: size=2 PARTIAL_WAKE_LOCK 'AudioMix' (uid=1013, pid=236,ws=WorkSource{10018}) PARTIAL_WAKE_LOCK 'Android.media.MediaPlayer' ON_AFTER_RELEASE (uid=10018, pid=24023,ws=null)
文件操作相關:
1、拷貝文件/目錄到設備
adb push <local>...<remote>
2、從設備拷貝文件/目錄,-a參數保留了文件的時間戳和模式
adb pull [-a] <remote>...<local>
3、查看設備log,和studio和eclipse的logcat相同,可通過參數控制輸出的日志
adb logcat -s 過濾指定參數log -v time 保留日志時間 >> 追加寫 > 覆蓋寫
下面的命令含義為:打印出log信息中的時間並且包含關鍵字“Test” 的所有log以覆蓋寫的方式保存到test文件
adb logcat -v time -s Test > test.txt
4、列出目錄下的文件和文件夾,可選參數-al可查看文件和文件夾的詳細信息
adb shell ls [-al]
5、進入文件夾
adb shell cd <folder>
6、查看文件
adb shell cat <filename>
7、重命名文件
adb shell rename path/oldfilename path/newfilename
8、刪除文件/文件夾
adb shell rm path/filename -r 可選參數用於刪除文件夾及下面的所有文件 eg:adb shell rm -r <folder>
9、移動文件
adb shell mv path/filename newpath/filename
10、拷貝文件
adb shell cp file newpath/file1
11、創建目錄
adb shell mkdir path/folder
12、設置文件最高讀寫權限
adb shell chmod 777 filename
13、手機未root 查看data/data/某一app文件信息
筆者的小米3沒有root,但是又想方便地查看data/data/目錄下的一些文件,直接進入data會提示沒有權限,查看的方式為進入data/data/后,運行下面的命令,就能直接進入你應用的包下了,可通用cp或者mv拷貝或移動到sdcard目錄進行其他操作
run-as package_name
數據庫相關
數據庫的操作和今天的主題關系不大,增刪改查操作不再列舉。但是平時的開發過程中只是查看數據庫中某個表或者某個字段,也無需每次都pull出來之后再查看,用命令行會更加方便快捷,進入到test.db的目錄后,運行如下命令
1、操作db
sqlite3 test.db
操作:
通過adb操作手機UI並不常用,但在有的場景下會非常有用,比如測試自動化,訪問在遠端服務器上的手機等。
發送keyevent和文本
命令行
adb shell input keyevent {key_code}
adb shell input text {text}
keyevent列表
0 –> “KEYCODE_UNKNOWN”1 –> “KEYCODE_MENU”
2 –> “KEYCODE_SOFT_RIGHT”
3 –> “KEYCODE_HOME”
4 –> “KEYCODE_BACK”
5 –> “KEYCODE_CALL”
6 –> “KEYCODE_ENDCALL”
7 –> “KEYCODE_0”
8 –> “KEYCODE_1”
9 –> “KEYCODE_2”
10 –> “KEYCODE_3”
11 –> “KEYCODE_4”
12 –> “KEYCODE_5”
13 –> “KEYCODE_6”
14 –> “KEYCODE_7”
15 –> “KEYCODE_8”
16 –> “KEYCODE_9”
17 –> “KEYCODE_STAR”
18 –> “KEYCODE_POUND”
19 –> “KEYCODE_DPAD_UP”
20 –> “KEYCODE_DPAD_DOWN”
21 –> “KEYCODE_DPAD_LEFT”
22 –> “KEYCODE_DPAD_RIGHT”
23 –> “KEYCODE_DPAD_CENTER”
24 –> “KEYCODE_VOLUME_UP”
25 –> “KEYCODE_VOLUME_DOWN”
26 –> “KEYCODE_POWER”
27 –> “KEYCODE_CAMERA”
28 –> “KEYCODE_CLEAR”
29 –> “KEYCODE_A”
30 –> “KEYCODE_B”
31 –> “KEYCODE_C”
32 –> “KEYCODE_D”
33 –> “KEYCODE_E”
34 –> “KEYCODE_F”
35 –> “KEYCODE_G”
36 –> “KEYCODE_H”
37 –> “KEYCODE_I”
38 –> “KEYCODE_J”
39 –> “KEYCODE_K”
40 –> “KEYCODE_L”
41 –> “KEYCODE_M”
42 –> “KEYCODE_N”
43 –> “KEYCODE_O”
44 –> “KEYCODE_P”
45 –> “KEYCODE_Q”
46 –> “KEYCODE_R”
47 –> “KEYCODE_S”
48 –> “KEYCODE_T”
49 –> “KEYCODE_U”
50 –> “KEYCODE_V”
51 –> “KEYCODE_W”
52 –> “KEYCODE_X”
53 –> “KEYCODE_Y”
54 –> “KEYCODE_Z”
55 –> “KEYCODE_COMMA”
56 –> “KEYCODE_PERIOD”
57 –> “KEYCODE_ALT_LEFT”
58 –> “KEYCODE_ALT_RIGHT”
59 –> “KEYCODE_SHIFT_LEFT”
60 –> “KEYCODE_SHIFT_RIGHT”
61 –> “KEYCODE_TAB”
62 –> “KEYCODE_SPACE”
63 –> “KEYCODE_SYM”
64 –> “KEYCODE_EXPLORER”
65 –> “KEYCODE_ENVELOPE”
66 –> “KEYCODE_ENTER”
67 –> “KEYCODE_DEL”
68 –> “KEYCODE_GRAVE”
69 –> “KEYCODE_MINUS”
70 –> “KEYCODE_EQUALS”
71 –> “KEYCODE_LEFT_BRACKET”
72 –> “KEYCODE_RIGHT_BRACKET”
73 –> “KEYCODE_BACKSLASH”
74 –> “KEYCODE_SEMICOLON”
75 –> “KEYCODE_APOSTROPHE”
76 –> “KEYCODE_SLASH”
77 –> “KEYCODE_AT”
78 –> “KEYCODE_NUM”
79 –> “KEYCODE_HEADSETHOOK”
80 –> “KEYCODE_FOCUS”
81 –> “KEYCODE_PLUS”
82 –> “KEYCODE_MENU”
83 –> “KEYCODE_NOTIFICATION”
84 –> “KEYCODE_SEARCH”
85 –> “TAG_LAST_KEYCODE”
比如:按Home鍵:adb shell input keyevent KEYCODE_HOME
滑動屏幕
命令行
#
從(x1, y1)滑動到(x2, y2)
adb shell input touchscreen swipe {x1} {y1} {x2} {y2}
點擊屏幕
命令行
#
點擊屏幕坐標(x, y)
adb shell input touchscreen tap {x} {y}
ADB 錄制屏幕命令
對於Android4.4的上的手機,系統自帶了一個命令screenrecord,我們可以很方便的使用。
· 錄制命令
·
adb shell screenrecord /sdcard/test.mp4
視頻保存目錄可以自己指定,如上面的/sdcard/test.mp4,命令執行后會一直錄制180s,按下ctrl+c可以提前結束錄制
輸入 –time-limit N,限制視頻錄制時間為N秒
· 設定視頻分辨率
對於高分辨率的手機,錄制的視頻很大,我們分享又不需要這么大的
我們可以設置錄制的視頻分辨率
adb shell screenrecord --size 848*480 /sdcard/test.mp4
· 設定視頻比特率
默認比特率是4M/s,為了分享方便,我們可以調低比特率為2M
adb shell screenrecord --bit-rate 2000000 /sdcard/test.mp4
· 獲取視頻文件
使用adb pull 即可把手機SD卡中視頻獲取到本地
adb pull /sdcard/test.mp4 .
設置時間:
查看內存:
adb shell
df
打電話:adb shell am start -a android.intent.action.CALL -d tel:10086
獲取devicesname
cat /system/build.prop | grep "product"
adb shellgetprop ro.product.name
自動填充內存:adb shell ddif=/dev/zero of=/mnt/sdcard/bigfile
dd命令創建文件 可以跟參數,比如創建一個1G的文件....可以根據想創建的大小 更改后邊的參數值(bs=xx count=xx)
adb shelldd if=/dev/zero of=/mnt/sdcard bs=1Mcount=1024