福利大放送
這是對(duì)好多adb命令行的總結(jié),很實(shí)用,有些東西知道了之后就會(huì)特別酷炫:
內(nèi)容
指定目標(biāo)設(shè)備:
adb [-d|-e|-s ]
如果只有一個(gè)設(shè)備/模擬器連接時(shí),可以省略掉 [-d|-e|-s ] 這一部分,直接使用 adb 。為命令指定目標(biāo)設(shè)備,如果有多個(gè)設(shè)備/模擬器連接,則需要為命令指定目標(biāo)設(shè)備。
參數(shù)含義:
-d 指定當(dāng)前唯一通過(guò) USB 連接的 Android 設(shè)備為命令目標(biāo)
-e 指定當(dāng)前唯一運(yùn)行的模擬器為命令目標(biāo)
-s 指定相應(yīng) serialNumber 號(hào)的設(shè)備/模擬器為命令目標(biāo) 在多個(gè)設(shè)備/模擬器連接的情況下較常用的是 -s 參數(shù)。
serialNumber 可以通過(guò) adb devices 命令獲取。如:
$ adb devices
List of devices attached cf264b8f device emulator-5554 device 輸出里的 cf264b8f 和 emulator-5554 即為 serialNumber。比如這時(shí)想指定 cf264b8f 這個(gè)設(shè)備來(lái)運(yùn)行 adb 命令獲取屏幕分辨率:
adb -s cf264b8f shell wm size 遇到多設(shè)備/模擬器的情況均使用這幾個(gè)參數(shù)為命令指定目標(biāo)設(shè)備,下文中為簡(jiǎn)化描述,不再重復(fù)。
啟動(dòng)/停止
啟動(dòng) adb server 命令:
adb start-server (一般無(wú)需手動(dòng)執(zhí)行此命令,在運(yùn)行 adb 命令時(shí)若發(fā)現(xiàn) adb server 沒(méi)有啟動(dòng)會(huì)自動(dòng)調(diào)起。)
停止 adb server 命令:
adb kill-server
查看 adb 版本
adb version 示例輸出:
Android Debug Bridge version 1.0.36 Revision 8f855a3d9b35-android 以 root 權(quán)限運(yùn)行 adbd
adb 的運(yùn)行原理是 PC 端的 adb server 與手機(jī)端的守護(hù)進(jìn)程 adbd 建立連接,然后 PC 端的 adb client 通過(guò) adb server 轉(zhuǎn)發(fā)命令,adbd 接收命令后解析運(yùn)行。
所以如果 adbd 以普通權(quán)限執(zhí)行,有些需要 root 權(quán)限才能執(zhí)行的命令無(wú)法直接用 adb xxx 執(zhí)行。這時(shí)可以 adb shell 然后 su 后執(zhí)行命令,也可以讓 adbd 以 root 權(quán)限執(zhí)行,這個(gè)就能隨意執(zhí)行高權(quán)限命令了。
adb root 正常輸出:
restarting adbd as root 現(xiàn)在再運(yùn)行 adb shell,看看命令行提示符是不是變成 # 了?
有些手機(jī) root 后也無(wú)法通過(guò) adb root 命令讓 adbd 以 root 權(quán)限執(zhí)行,比如三星的部分機(jī)型,會(huì)提示 adbd cannot run as root in production builds,此時(shí)可以先安裝 adbd Insecure,然后 adb root 試試。
相應(yīng)地,如果要恢復(fù) adbd 為非 root 權(quán)限的話,可以使用 adb unroot 命令。
指定 adb server 的網(wǎng)絡(luò)端口
adb -P start-server 默認(rèn)端口為 5037。
設(shè)備連接管理
查詢已連接設(shè)備/模擬器
adb devices 輸出示例:List of devices attached cf264b8f device emulator-5554 device 輸出格式為 [serialNumber] [state]
serialNumber 即我們常說(shuō)的 SN,state 有如下幾種:
offline —— 表示設(shè)備未連接成功或無(wú)響應(yīng)。
device —— 設(shè)備已連接。注意這個(gè)狀態(tài)并不能標(biāo)識(shí) Android 系統(tǒng)已經(jīng)完全啟動(dòng)和可操作,在設(shè)備啟動(dòng)過(guò)程中設(shè)備實(shí)例就可連接到 adb,但啟動(dòng)完畢后系統(tǒng)才處于可操作狀態(tài)。
no device —— 沒(méi)有設(shè)備/模擬器連接。
以上輸出顯示當(dāng)前已經(jīng)連接了兩臺(tái)設(shè)備/模擬器,cf264b8f 與 emulator-5554 分別是它們的 SN。從 emulator-5554 這個(gè)名字可以看出它是一個(gè) Android 模擬器。
常見(jiàn)異常輸出:
沒(méi)有設(shè)備/模擬器連接成功。
List of devices attached 設(shè)備/模擬器未連接到 adb 或無(wú)響應(yīng)。
List of devices attached cf264b8f offline USB 連接
通過(guò) USB 連接來(lái)正常使用 adb 需要保證幾點(diǎn):
硬件狀態(tài)正常。
包括 Android 設(shè)備處于正常開(kāi)機(jī)狀態(tài),USB 連接線和各種接口完好。
Android 設(shè)備的開(kāi)發(fā)者選項(xiàng)和 USB 調(diào)試模式已開(kāi)啟。
可以到「設(shè)置」-「開(kāi)發(fā)者選項(xiàng)」-「Android 調(diào)試」查看。
如果在設(shè)置里找不到開(kāi)發(fā)者選項(xiàng),那需要通過(guò)一個(gè)彩蛋來(lái)讓它顯示出來(lái):在「設(shè)置」-「關(guān)于手機(jī)」連續(xù)點(diǎn)擊「版本號(hào)」7 次。
設(shè)備驅(qū)動(dòng)狀態(tài)正常。
這一點(diǎn)貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到需要安裝驅(qū)動(dòng)的情況,確認(rèn)這一點(diǎn)可以右鍵「計(jì)算機(jī)」-「屬性」,到「設(shè)備管理器」里查看相關(guān)設(shè)備上是否有黃色感嘆號(hào)或問(wèn)號(hào),如果沒(méi)有就說(shuō)明驅(qū)動(dòng)狀態(tài)已經(jīng)好了。否則可以下載一個(gè)手機(jī)助手類程序來(lái)安裝驅(qū)動(dòng)先。
通過(guò) USB 線連接好電腦和設(shè)備后確認(rèn)狀態(tài)。
adb devices
如果能看到,xxxxxx device 說(shuō)明連接成功。
無(wú)線連接(需要借助 USB 線)
除了可以通過(guò) USB 連接設(shè)備與電腦來(lái)使用 adb,也可以通過(guò)無(wú)線連接——雖然連接過(guò)程中也有需要使用 USB 的步驟,但是連接成功之后你的設(shè)備就可以在一定范圍內(nèi)擺脫 USB 連接線的限制啦!
操作步驟:
- 將 Android 設(shè)備與要運(yùn)行 adb 的電腦連接到同一個(gè)局域網(wǎng),比如連到同一個(gè) WiFi。
- 將設(shè)備與電腦通過(guò) USB 線連接。
- 應(yīng)確保連接成功(可運(yùn)行 adb devices 看是否能列出該設(shè)備)。
- 讓設(shè)備在 5555 端口監(jiān)聽(tīng) TCP/IP 連接:
- adb tcpip 5555 斷開(kāi) USB 連接。
- 找到設(shè)備的 IP 地址,一般能在「設(shè)置」-「關(guān)于手機(jī)」-「狀態(tài)信息」-「IP地址」找到。
- 通過(guò) IP 地址連接設(shè)備,adb connect 這里的 就是上一步中找到的設(shè)備 IP 地址。
- 確認(rèn)連接狀態(tài), devices 如果能看到:5555 device 說(shuō)明連接成功。
- 如果連接不了,請(qǐng)確認(rèn) Android 設(shè)備與電腦是連接到了同一個(gè) WiFi,然后再次執(zhí)行 adb connect 那一步;
- 如果還是不行的話,通過(guò) adb kill-server 重新啟動(dòng) adb 然后從頭再來(lái)一次試試。
斷開(kāi)無(wú)線連接
adb disconnect 無(wú)線連接(無(wú)需借助 USB 線)
注:需要 root 權(quán)限。
上一節(jié)「無(wú)線連接(需要借助 USB 線)」是官方文檔里介紹的方法,需要借助于 USB 數(shù)據(jù)線來(lái)實(shí)現(xiàn)無(wú)線連接。
既然我們想要實(shí)現(xiàn)無(wú)線連接,那能不能所有步驟下來(lái)都是無(wú)線的呢?答案是能的。
- 在 Android 設(shè)備上安裝一個(gè)終端模擬器,已經(jīng)安裝過(guò)的設(shè)備可以跳過(guò)此步。我使用的終端模擬器下載地址是:Terminal Emulator for Android Downloads
- 將 Android 設(shè)備與要運(yùn)行 adb 的電腦連接到同一個(gè)局域網(wǎng),比如連到同一個(gè) WiFi。
- 打開(kāi) Android 設(shè)備上的終端模擬器,在里面依次運(yùn)行命令:
su setprop service.adb.tcp.port 5555
- 找到 Android 設(shè)備的 IP 地址,一般能在「設(shè)置」-「關(guān)于手機(jī)」-「狀態(tài)信息」-「IP地址」找到。
- 在電腦上通過(guò) adb 和 IP 地址連接 Android 設(shè)備。
- adb connect 這里的 就是上一步中找到的設(shè)備 IP 地址。
如果能看到 connected to :5555 這樣的輸出則表示連接成功。
應(yīng)用管理
查看應(yīng)用列表
查看應(yīng)用列表的基本命令格式是
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [–user USER_ID] [FILTER]
即在 adb shell pm list packages 的基礎(chǔ)上可以加一些參數(shù)進(jìn)行過(guò)濾查看不同的列表,支持的過(guò)濾參數(shù)如下:
參數(shù) 顯示列表 無(wú) 所有應(yīng)用 -f 顯示應(yīng)用關(guān)聯(lián)的 apk 文件 -d 只顯示 disabled 的應(yīng)用 -e 只顯示 enabled 的應(yīng)用 -s 只顯示系統(tǒng)應(yīng)用 -3 只顯示第三方應(yīng)用 -i 顯示應(yīng)用的 installer -u 包含已卸載應(yīng)用 包名包含 字符串 所有應(yīng)用
命令:
adb shell pm list packages -s 第三方應(yīng)用
命令:
adb shell pm list packages -3 包名包含某字符串的應(yīng)用
比如要查看包名包含字符串 mazhuang 的應(yīng)用列表,命令:
adb shell pm list packages mazhuang 當(dāng)然也可以使用 grep 來(lái)過(guò)濾:
adb shell pm list packages | grep mazhuang 安裝 APK
命令格式:
adb install [-lrtsdg] 參數(shù):
adb install 后面可以跟一些可選參數(shù)來(lái)控制安裝 APK 的行為,可用參數(shù)及含義如下:
參數(shù) 含義 -l 將應(yīng)用安裝到保護(hù)目錄 /mnt/asec -r 允許覆蓋安裝,-t 允許安裝 AndroidManifest.xml 里 application 指定 android:testOnly=”true” 的應(yīng)用,-s 將應(yīng)用安裝到 sdcard,-d 允許降級(jí)覆蓋安裝, -g 授予所有運(yùn)行時(shí)權(quán)限 運(yùn)行命令后如果見(jiàn)到類似如下輸出(狀態(tài)為 Success)代表安裝成功:
[100%] /data/local/tmp/1.apk pkg: /data/local/tmp/1.apk Success 上面是當(dāng)前最新版 v1.0.36 的 adb 的輸出,會(huì)顯示 push apk 文件到手機(jī)的進(jìn)度百分比。
使用舊版本 adb 的輸出則是這樣的:
12040 KB/s (22205609 bytes in 1.801s) pkg: /data/local/tmp/SogouInput_android_v8.3_sweb.apk Success
而如果狀態(tài)為 Failure 則表示安裝失敗,比如:
[100%] /data/local/tmp/map-20160831.apk pkg: /data/local/tmp/map-20160831.apk Failure [INSTALL_FAILED_ALREADY_EXISTS]
常見(jiàn)安裝失敗輸出代碼、含義及可能的解決辦法如下:
輸出 含義 解決辦法
INSTALL_FAILED_ALREADY_EXISTS 應(yīng)用已經(jīng)存在 使用 -r 參數(shù)
INSTALL_FAILED_INVALID_APK 無(wú)效的 APK 文件
INSTALL_FAILED_INVALID_URI 無(wú)效的 APK 文件名 確保 APK 文件名里無(wú)中文
INSTALL_FAILED_INSUFFICIENT_STORAGE 空間不足 清理空間
INSTALL_FAILED_DUPLICATE_PACKAGE 已經(jīng)存在同名程序
INSTALL_FAILED_NO_SHARED_USER 請(qǐng)求的共享用戶不存在
INSTALL_FAILED_UPDATE_INCOMPATIBLE 已經(jīng)安裝過(guò)簽名不一樣的同名應(yīng)用,且數(shù)據(jù)沒(méi)有移除
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 請(qǐng)求的共享用戶存在但簽名不一致
INSTALL_FAILED_MISSING_SHARED_LIBRARY 安裝包使用了設(shè)備上不可用的共享庫(kù)
INSTALL_FAILED_REPLACE_COULDNT_DELETE 替換時(shí)無(wú)法刪除
INSTALL_FAILED_DEXOPT dex 優(yōu)化驗(yàn)證失敗或空間不足
INSTALL_FAILED_OLDER_SDK 設(shè)備系統(tǒng)版本低于應(yīng)用要求
INSTALL_FAILED_CONFLICTING_PROVIDER 設(shè)備里已經(jīng)存在與應(yīng)用里同名的 content provider
INSTALL_FAILED_NEWER_SDK 設(shè)備系統(tǒng)版本高于應(yīng)用要求
INSTALL_FAILED_TEST_ONLY 應(yīng)用是 test-only 的,但安裝時(shí)沒(méi)有指定 -t 參數(shù)
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE 包含不兼容設(shè)備 CPU 應(yīng)用程序二進(jìn)制接口的 native code
INSTALL_FAILED_MISSING_FEATURE 應(yīng)用使用了設(shè)備不可用的功能
INSTALL_FAILED_CONTAINER_ERROR sdcard 訪問(wèn)失敗 確認(rèn) sdcard 可用,或者安裝到內(nèi)置存儲(chǔ)
INSTALL_FAILED_INVALID_INSTALL_LOCATION 不能安裝到指定位置 切換安裝位置,添加或刪除 -s 參數(shù)
INSTALL_FAILED_MEDIA_UNAVAILABLE 安裝位置不可用 一般為 sdcard,確認(rèn) sdcard 可用或安裝到內(nèi)置存儲(chǔ)
INSTALL_FAILED_VERIFICATION_TIMEOUT 驗(yàn)證安裝包超時(shí)
INSTALL_FAILED_VERIFICATION_FAILURE 驗(yàn)證安裝包失敗
INSTALL_FAILED_PACKAGE_CHANGED 應(yīng)用與調(diào)用程序期望的不一致
INSTALL_FAILED_UID_CHANGED 以前安裝過(guò)該應(yīng)用,與本次分配的 UID 不一致 清除以前安裝過(guò)的殘留文件
INSTALL_FAILED_VERSION_DOWNGRADE 已經(jīng)安裝了該應(yīng)用更高版本 使用 -d 參數(shù)
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE 已安裝 target SDK 支持運(yùn)行時(shí)權(quán)限的同名應(yīng)用,要安裝的版本不支持運(yùn)行時(shí)權(quán)限
INSTALL_PARSE_FAILED_NOT_APK 指定路徑不是文件,或不是以 .apk 結(jié)尾
INSTALL_PARSE_FAILED_BAD_MANIFEST 無(wú)法解析的 AndroidManifest.xml 文件
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION 解析器遇到異常
INSTALL_PARSE_FAILED_NO_CERTIFICATES 安裝包沒(méi)有簽名
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES 已安裝該應(yīng)用,且簽名與 APK 文件不一致 先卸載設(shè)備上的該應(yīng)用,再安裝
INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING 解析 APK 文件時(shí)遇到 CertificateEncodingException
INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME manifest 文件里沒(méi)有或者使用了無(wú)效的包名
INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID manifest 文件里指定了無(wú)效的共享用戶 ID INSTALL_PARSE_FAILED_MANIFEST_MALFORMED 解析 manifest 文件時(shí)遇到結(jié)構(gòu)性錯(cuò)誤
INSTALL_PARSE_FAILED_MANIFEST_EMPTY 在 manifest 文件里找不到找可操作標(biāo)簽(instrumentation 或 application)
INSTALL_FAILED_INTERNAL_ERROR 因系統(tǒng)問(wèn)題安裝失敗
INSTALL_FAILED_USER_RESTRICTED 用戶被限制安裝應(yīng)用
INSTALL_FAILED_DUPLICATE_PERMISSION 應(yīng)用嘗試定義一個(gè)已經(jīng)存在的權(quán)限名稱
INSTALL_FAILED_NO_MATCHING_ABIS 應(yīng)用包含設(shè)備的應(yīng)用程序二進(jìn)制接口不支持的 native code
INSTALL_CANCELED_BY_USER 應(yīng)用安裝需要在設(shè)備上確認(rèn),但未操作設(shè)備或點(diǎn)了取消 在設(shè)備上同意安裝
INSTALL_FAILED_ACWF_INCOMPATIBLE 應(yīng)用程序與設(shè)備不兼容 does not contain AndroidManifest.xml 無(wú)效的 APK 文件 is not a valid zip file 無(wú)效的 APK 文件
Offline 設(shè)備未連接成功 先將設(shè)備與 adb 連接成功
- unauthorized 設(shè)備未授權(quán)允許調(diào)試
- error: device not found 沒(méi)有連接成功的設(shè)備 先將設(shè)備與 adb 連接成功
- protocol failure 設(shè)備已斷開(kāi)連接 先將設(shè)備與 adb 連接成功
- Unknown option: -s Android 2.2 以下不支持安裝到 sdcard 不使用 -s 參數(shù)
- No space left on devicerm 空間不足 清理空間
- Permission denied … sdcard … sdcard 不可用
adb install 內(nèi)部原理簡(jiǎn)介
adb install 實(shí)際是分三步完成:
- push apk 文件到 /data/local/tmp。
- 調(diào)用 pm install 安裝。
- 刪除 /data/local/tmp 下的對(duì)應(yīng) apk 文件。
所以,必要的時(shí)候也可以根據(jù)這個(gè)步驟,手動(dòng)分步執(zhí)行安裝過(guò)程。
卸載應(yīng)用
adb uninstall [-k] 表示應(yīng)用的包名,-k 參數(shù)可選,表示卸載應(yīng)用但保留數(shù)據(jù)和緩存目錄。
清除應(yīng)用數(shù)據(jù)與緩存
adb shell pm clear 表示應(yīng)用名包,這條命令的效果相當(dāng)于在設(shè)置里的應(yīng)用信息界面點(diǎn)擊了「清除緩存」和「清除數(shù)據(jù)」。
查看前臺(tái) Activity
adb shell dumpsys activity activities | grep mFocusedActivity
與應(yīng)用交互
主要是使用 am 命令,常用的 如下:
command 用途 start [options] 啟動(dòng) 指定的 Activity startservice [options] 啟動(dòng) 指定的 Service broadcast [options] 發(fā)送 指定的廣播 force-stop 停止 相關(guān)的進(jìn)程 參數(shù)很靈活,和寫(xiě) Android 程序時(shí)代碼里的 Intent 相對(duì)應(yīng)。
用于決定 intent 對(duì)象的選項(xiàng)如下:
參數(shù) 含義 -a 指定 action,比如 android.intent.action.VIEW -c 指定 category,比如 android.intent.category.APP_CONTACTS -n 指定完整 component 名,用于明確指定啟動(dòng)哪個(gè) Activity,如 com.example.app/.ExampleActivity 里還能帶數(shù)據(jù),就像寫(xiě)代碼時(shí)的 Bundle 一樣:
參數(shù) 含義 –esn null 值(只有 key 名) -e|–es string 值 –ez boolean 值 –ei integer 值 –el long 值 –ef float 值 –eu URI –ecn component name –eia [,
THR 線程數(shù)
VSS Virtual Set Size 虛擬耗用內(nèi)存(包含共享庫(kù)占用的內(nèi)存) RSS Resident Set Size 實(shí)際使用物理內(nèi)存(包含共享庫(kù)占用的內(nèi)存) PCY 調(diào)度策略優(yōu)先級(jí),SP_BACKGROUND/SPFOREGROUND UID 進(jìn)程所有者的用戶 ID NAME 進(jìn)程名 top 命令還支持一些命令行參數(shù),詳細(xì)用法如下:
Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
-m num 最多顯示多少個(gè)進(jìn)程 -n num 刷新多少次后退出 -d num 刷新時(shí)間間隔(單位秒,默認(rèn)值 5) -s col 按某列排序(可用 col 值:cpu, vss, rss, thr) -t 顯示線程信息 -h 顯示幫助文檔