Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 簡明adb使用教程

簡明adb使用教程

編輯:關於Android編程

adb簡介

adb介紹

全稱是:Android Debug Bridge,即安卓調試橋,是安卓sdk的一個工具;

B/S結構

adb工具是一個客戶端-服務器的應用程序,包含三個方面:
1. client:運行在PC上。其實就是shell,用來發送命令給Server。發送命令時,首先檢測PC上有沒有啟動Server,如果後台沒有Server,則自動啟動一個Server,然後將命令發送到Server,並不關心命令發送過去以後會怎樣。
2. daemon:一個以後台進程的形式運行於模擬器或設備上的守護程序(daemon)。
3. server:在PC機上作為後台進程運行的服務器。該服務器負責管理客戶端與運行模擬器或設備上的adb守護程序(daemon)之間的通信。
ADB Server檢測USB接口何時連接或者移除設備,管理著adb client和adb daemon的通信。它維護著一個“已連接的設備的鏈表”,並且為每一個設備標記了一個狀態:offline,bootloader,recovery或者online;Server一直在做一些循環和等待,以協調client和Server還有daemon之間的通信。

端口管理
adb server與client通信的端口是5037;

三者之間的通信

Client<—>Server<—>Daemon

Client發送的命令分類
不經過server處理就能夠成功的,如adb version和adb help;
和Server通信但不需要和手機通信的命令:adb devices;
需要Daemon進行處理的命令;

adb環境搭建

操作系統

windows xp/7/8/10等

軟件安裝

adb工具包
fastboot.exe、adb.exe、AdbWinApi.dll

android sdk
Software Development Kit,軟件開發工具包
adb工具在/platform-tools/目錄下;
usb驅動
各個手機廠商的usb驅動
需要在手機的開發者選項中打開usb調試;

配置環境變量

將adb可執行文件路徑添加到環境變量PATH中;
如果安裝了SDK,則將SDK目錄下的platform-tools文件夾路徑和tools文件夾路徑配置到環境變量PATH中;

命令詳解

命令行語法

命令的語法格式為:

adb [-d|-e|-s ] 
 

其中,[-d|-e|-s ]用來指定設備,後面會提到。除此之外,就是在adb後面跟上不同的命令即可。

通用命令

1 查看adb的用法:

adb help

adb

結果略;
2 打印adb的版本號:

adb version

結果:

Android Debug Bridge version 1.0.32
Revision eac51f2bb6a8-android

3 打印設備(usb設備或模擬器)列表;

adb devices

結果:

List of devices attached
19b3b70 device

參數-l可以列出設備的限定符;

設備列表格式為:

[serialNumber] [state]

[serialNumber]
[serialNumber]是一個由adb創建的,由控制台端口號唯一標識設備或模擬器的字符串;
如果連接的設備是USB設備,[serialNumber]為其序列號,如果是模擬器,[serialNumber]格式為 -
[state]
- offline
未連接到adb或者無響應;
- device
已連接到adb上;
- no device
沒有連接著的模擬器或設備;

常用命令

指定目標

命令格式:

adb [-d|-e|-s ]

adb只能對一個設備執行命令,當有設備和模擬器的數量大於1時,未指定設備執行命令時會報錯;
解決的方法是指定一個設備,有三種方式:
- -d
如果有多個模擬器和一個usb設備,就使用-d;
- -e
如果有多個usb設備和一個模擬器,就使用-e;
- -s
通過指定的序列號對指定的設備或模擬器執行一條命令,這是指定設備更通用的方式;

使用adb devices命令可以得到各個設備的serialNumber;

數據相關

從pc上拷貝文件到設備/模擬器上;
adb push

結果

2164 KB/s (303659 bytes in 0.137s)

使用參數-p用來顯示傳輸進度,結果:

Transferring: 303659/303659 (100%)
1202 KB/s (303659 bytes in 0.246s)

拷貝的過程中,命令行即時顯示進度;

從設備/模擬器上拷貝文件到pc上
adb pull

參數
-p 用來顯示傳輸進度;
-a 拷貝時保留時間戳和模式,相當於linux命令cp的-p參數;
- 安裝一個安卓應用(.apk文件的路徑要完整)到設備中;

adb install [-lrtsdg] 

參數

-l 指禁止將文件移動到手機設備以外的位置;
-r 指覆蓋安裝APP並保留舊數據;
-t 指先測試安裝一下;
-s 指安裝進SD卡中;
-d 指允許版本代碼降級;
-g 允許所有運行權限;

安裝多個安裝應用到設備中
adb install-multiple [-lrtsdpg] 

參數
同adb install的參數;

常見錯誤

INSTALL_FAILED_UNKNOWN_SOURCES
未知來源處於勾選狀態
INSTALL_FAILED_INVALID_URI apk
名字不能是中文的
INSTALL_FAILED_ALREADY_EXISTS
已安裝,需要用-r替換安裝
INSTALL_FAILED_INSUFFICIENT_STORAGE
空間不足

卸載軟件,但需要知道包名;
adb uninstall 

保留數據和緩存目錄;

adb uninstall [-k] 
導出系統命令,包括error的堆棧和log類打出的日志
adb logcat [

查看logcat的用法

[adb] logcat --help

過濾log輸出(tag:priority)

adb logcat [tag:priority [tag:priority ...]]

logcat命令支持多對tag:priority,用空格隔開,舉例:

adb logcat ActivityManager:I MyApp:D *:S

命令中的*表示除了前面列出的tag之外的所有tag。

如果在shell中執行命令可以設置環境變量,以簡化命令:

export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"

tag詳解
以下tag的priority從低到高排列;
- V — Verbose (lowest priority)
- D — Debug
- I — Info
- W — Warning
- E — Error
- F — Fatal
- S — Silent (highest priority,什麼都不打印)

每個安卓log都有一個tag和priority,在日志中的顯示為/

I/ActivityManager(  585): Starting activity: Intent { action=android.intent.action...}

控制log輸出格式(-v)

[adb] logcat [-v ]

注意:-v後面只能接一個format值;

adb logcat -v thread

參數含義
- brief — 顯示priority/tag和進程的PID(默認格式)
- process — 僅顯示PID
- tag — 僅顯示priority/tag
- raw — 顯示日志,不包含其它的元數據字段;
- time — 顯示日期、調用時間、priority/tag、進程的PID;
- threadtime — 顯示日期、調用時間、priority、tag、線程的PID和TID;
- long — 顯示所有的元數據字段,用空行分割;

查看緩沖區(-b)
除了tag和priority,安卓日志還有其他的元數據字段;
Android日志系統為日志消息保持了多個循環緩沖區,而且不是所有的消息都被發送到默認緩沖區;
用法
要想查看這些附加的緩沖區,可以使用-b選項

[adb] logcat [-b ]

舉例

adb logcat -b radio

adb logcat -b all查看所有的緩沖區

緩沖區
radio — 查看包含在無線/電話相關的緩沖區消息
events — 查看事件相關的消息
main — 查看主緩沖區 (默認緩沖區)
在/dev/log/下面,有main,radio,event,system,ksystem等

其它命令行參數
設置存儲日志的文件

adb logcat -f file

設置保存的日志文件名稱,也可以使用>和>>,後面加上&就可以拔掉數據線了;

將之前的所有日志信息清空並退出:

adb logcat -c 

設置日志輸出的最大數目, 需要 -r 參數,默認是4;

adb logcat -n  

輸出日志到屏幕上並退出;

adb logcat -d

打印最近的n條log,需要-d參數;

adb logcat -t 

以二進制方式輸出日志;

adb logcat -B

獲取log設備的ring buffer的大小並退出;

adb logcat -g

結果:

main: ring buffer is 2Mb (1Mb consumed), max entry is 5120b, max payload is 4076b
system: ring buffer is 256Kb (255Kb consumed), max entry is 5120b, max payload is 4076b

設置默認的過濾器為silent,等同於adb logcat *:s

adb logcat -s 

服務器管理

adb start-server

檢查adb server是否在運行中,沒有則啟動它;

adb kill-server

中止adb server進程;

進階命令

遠程連接

adb通常使用usb進行連接,也可以無線連接;
前提是:安卓設備和adb主機電腦在一個網絡中;
1 用usb數據線將設備和adb主機電腦連接起來,可以使用adb devices命令確認目標設備已連接;
如:

adb devices

結果:

List of devices attached
19b3b70 device

2 設備目標設備監聽TCP/IP連接,默認端口為5555,執行命令:

adb tcpip 5555

命令返回:

restarting in TCP mode port: 5555

此時usb線可以斷開了。

如果沒有連接的設備,則會返回:

error: device not found

3 獲取安卓設備的ip地址,命令格式:

adb connect 

如:

adb connect 172.29.75.21

命令返回:

connected to 172.29.75.21:5555

此時再執行adb devices顯示:

List of devices attached
172.29.75.21:5555       device

連接丟失處理
如果發生連接丟失,請優先確認設備和主機依然是在同一網絡下;
然後再使用adb connect重連,或者adb kill-server後重頭再來;
斷開鏈接
如果希望主動斷開連接,命令格式:

disconnect [[:]]

執行命令:

adb disconnect 172.29.75.21

再使用adb devices,之前連接的設備就不存在了:

List of devices attached

此時執行adb connect 172.29.75.21可以直接再次連接上。

有個安卓軟件adbWireless,實現的也是無線連接的功能,而且需要root權限,目前並未發現必須使用它的理由。

ADB shell commands

adb提供了一個可以在模擬器/連接著的設備上運行多種命令的unix shell;
shell執行的命令
命令的二進制文件在模擬器/連接著的設備的文件系統中,/system/bin/…
可以執行命令查看:

ls /system/bin/

結果:

ATFWD-daemon
PktRspTest
...略...
ylsecureserver
yulong_tw_test

BTW:
adb shell中ls的結果與linux ls結果格式的差異;

運行shell命令的兩種方式
- adb shell shell_command
每次執行一個單獨的shell命令,然後退出shell;
命令格式:

adb [-d|-e|-s ] shell 
先進入shell,再在shell中執行命令;
adb [-d|-e|-s ] shell

結束shell的方式
使用快捷鍵CTRL-D;
使用命令exit;

常用shell命令

logcat
同adb logcat的用法; screencap
截圖
usage: screencap [-hp] [-d display-id] [FILENAME]

參數:
-h: 顯示幫助;
-p: 保存為一個png文件;
-d: 指定要捕捉的顯示id,默認為0;
文件名是由.png結尾,則保存為一個png文件;如果由.bmp或.jpg結尾,則保持成對應的文件格式,但會比png文件大很多;
如果沒有指定文件名,則顯示到標准輸出中;

screenrecord
錄制視頻,mp4格式
語法
screenrecord [options] 
adb shell screenrecord [options] 

screenrecord選項
–help
顯示命令語法和選項;
–size
設置錄像大小,格式: 1280x720.如果支持的話,默認值是設備自身的顯示分辨率,否則是1280x720。 最好的情況是使用設備的高級視頻編碼(AVC)解碼器;
–bit-rate
設置路線的位比率,單位是兆位每秒。默認是4Mbps。增加位比率可以提升錄像質量,但也會使文件變大。
screenrecord –bit-rate 6000000 /sdcard/demo.mp4
–time-limit

注意
當保持屏幕長寬比時,screenrecord能夠錄制你設定的任何碼比率和分辨率;
該工具按默認的方向和分辨率錄制,且最長錄制3分鐘;
一些手機並不能錄制它們自身的分辨率,如遇此問題,可以錄制更小一些的分辨率;
錄制過程中不支持屏幕旋轉,旋轉可能會中斷錄制;

am
活動管理器命令,功能非常強大;

比如,可以啟動一個app,但需要知道包名和活動名:

am start -n 包(package)名/包名.活動(activity)名稱

介紹一個間接的方法:

monkey -p app.greyshirts.sslcapture -c android.intent.category.LAUNCHER 1

其它命令:

am start -n com.android.camera/com.android.camera.Camera 運行照相機
am start -a android.intent.action.CALL -d tel:10086 撥打電話
am start -a android.intent.action.VIEW -d  http://www.so.cn/ 啟動浏覽器
pm
包管理器,同樣功能非常強大;
列出設備中所有包的名稱和路徑;
pm list packages [-f]

列出指定包名的apk路徑:

pm path com.qihoo.map360.auto

結果:

package:/data/app/com.qihoo.map360.auto-2/base.apk
查看設備ip

比如無線連接需要查看手機ip,可以直接使用命令:

ifconfig wlan0

結果:

wlan0: ip 172.29.75.21 mask 255.255.0.0 flags [up broadcast running multicast]
busybox
adb shell中支持的命令跟linux shell相差很遠,比如想知道adb shell中支持的命令數量,使用命令:
ls /system/bin | wc -l

結果:

/system/bin/sh: wc: not found

如何解決?可以使用busybox:

ls /system/bin | busybox wc -l

結果:

301

單獨執行命令busybox顯示busybox的用法及支持的命令:

BusyBox v1.21.1 (2013-07-08 10:26:30 CDT) multi-call binary.
BusyBox is copyrighted by many authors between 1998-2012.
Licensed under GPLv2. See source distribution for detailed
copyright notices.

Usage: busybox [function [arguments]...]
   or: busybox --list[-full]
   or: busybox --install [-s] [DIR]
   or: function [arguments]...

        BusyBox is a multi-call binary that combines many common Unix
        utilities into a single executable.  Most people will create a
        link to busybox for each function they wish to use and BusyBox
        will act like whatever it was invoked as.

Currently defined functions:
        [, [[, acpid, add-shell, addgroup, adduser, adjtimex, arp, arping, ash,
        awk, base64, basename, beep, blkid, blockdev, bootchartd, brctl,
        bunzip2, bzcat, bzip2, cal, cat, catv, chat, chattr, chgrp, chmod,
        chown, chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm,
        conspy, cp, cpio, crond, crontab, cryptpw, cttyhack, cut, date, dc, dd,
        deallocvt, delgroup, deluser, depmod, devmem, df, dhcprelay, diff,
        dirname, dmesg, dnsd, dnsdomainname, dos2unix, du, dumpkmap,
        dumpleases, echo, ed, egrep, eject, env, envdir, envuidgid, ether-wake,
        expand, expr, fakeidentd, false, fbset, fbsplash, fdflush, fdformat,
        fdisk, fgconsole, fgrep, find, findfs, flock, fold, free, freeramdisk,
        fsck, fsck.minix, fsync, ftpd, ftpget, ftpput, fuser, getopt, getty,
        grep, groups, gunzip, gzip, halt, hd, hdparm, head, hexdump, hostid,
        hostname, httpd, hush, hwclock, id, ifconfig, ifdown, ifenslave,
        ifplugd, ifup, inetd, init, insmod, install, ionice, iostat, ip,
        ipaddr, ipcalc, ipcrm, ipcs, iplink, iproute, iprule, iptunnel,
        kbd_mode, kill, killall, killall5, klogd, last, less, linux32, linux64,
        linuxrc, ln, loadfont, loadkmap, logger, login, logname, logread,
        losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lsof, lspci, lsusb, lzcat,
        lzma, lzop, lzopcat, makedevs, makemime, man, md5sum, mdev, mesg,
        microcom, mkdir, mkdosfs, mke2fs, mkfifo, mkfs.ext2, mkfs.minix,
        mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, modinfo, modprobe, more,
        mount, mountpoint, mpstat, mt, mv, nameif, nanddump, nandwrite,
        nbd-client, nc, netstat, nice, nmeter, nohup, nslookup, ntpd, od,
        openvt, passwd, patch, pgrep, pidof, ping, ping6, pipe_progress,
        pivot_root, pkill, pmap, popmaildir, poweroff, powertop, printenv,
        printf, ps, pscan, pstree, pwd, pwdx, raidautorun, rdate, rdev,
        readahead, readlink, readprofile, realpath, reboot, reformime,
        remove-shell, renice, reset, resize, rev, rm, rmdir, rmmod, route, rpm,
        rpm2cpio, rtcwake, run-parts, runlevel, runsv, runsvdir, rx, script,
        scriptreplay, sed, sendmail, seq, setarch, setconsole, setfont,
        setkeycodes, setlogcons, setserial, setsid, setuidgid, sh, sha1sum,
        sha256sum, sha3sum, sha512sum, showkey, slattach, sleep, smemcap,
        softlimit, sort, split, start-stop-daemon, stat, strings, stty, su,
        sulogin, sum, sv, svlogd, swapoff, swapon, switch_root, sync, sysctl,
        syslogd, tac, tail, tar, tcpsvd, tee, telnet, telnetd, test, tftp,
        tftpd, time, timeout, top, touch, tr, traceroute, traceroute6, true,
        tty, ttysize, tunctl, udhcpc, udhcpd, udpsvd, umount, uname, unexpand,
        uniq, unix2dos, unlzma, unlzop, unxz, unzip, uptime, users, usleep,
        uudecode, uuencode, vconfig, vi, vlock, volname, wall, watch, watchdog,
        wc, wget, which, who, whoami, whois, xargs, xz, xzcat, yes, zcat, zcip

可以看到它支持的命令實用了很多。

比如在adb shell中無法用命令拼接的方式殺死一個後台運行的logcat,但用busybox下的命令就可以搞定:

ps | grep logcat | busybox awk '{print $2}' | busybox xargs kill -9

SHELL腳本

shell腳本是一個更大的話題,此處略;

logcat -v time -f /sdcard/$(date +%Y%m%d-%H%M%S).log *:V &
ls -l /sdcard/$(date +%Y%m%d)*.log

終端工具

使用終端工具可以在手機上用命令操作手機等等,推薦工具:超級終端;

獲取apk文件的包名

獲取apk包名的方式有很多,這裡介紹常用的幾種:
1. 借助第三方工具,如apk-info:
這裡寫圖片描述

如果按照了sdk,可以使用aapt工具(在sdk的build_tools目錄下),
aapt dump badging *.apk

結果的前幾行:

package: name='com.qihoo.map360.auto' versionCode='18' versionName='1.1.8' platformBuildVersionName='5.0-1521886'
sdkVersion:'8'
targetSdkVersion:'19'

常見問題

daemon not running. starting it now on port 5037

執行命令後出現:

* daemon not running. starting it now on port 5037 *
ADB server didn't ACK
* failed to start daemon *

一般是端口綁定失敗。
使用命令:

netstat -ano | findstr 5037

結果:

  TCP    127.0.0.1:5037         0.0.0.0:0              LISTENING       

最後一列是PID,再從tasklist中找到該PID對應的進程,結束掉;

tasklist  |  findstr 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved