福利大放送
這是對(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)前唯一通過 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 可以通過 adb devices 命令獲取痹屹。如:
$ adb devices
List of devices attached cf264b8f device emulator-5554 device 輸出里的 cf264b8f 和 emulator-5554 即為 serialNumber。比如這時(shí)想指定 cf264b8f 這個(gè)設(shè)備來運(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 (一般無需手動(dòng)執(zhí)行此命令聊替,在運(yùn)行 adb 命令時(shí)若發(fā)現(xiàn) adb server 沒有啟動(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 通過 adb server 轉(zhuǎn)發(fā)命令惹悄,adbd 接收命令后解析運(yùn)行春叫。
所以如果 adbd 以普通權(quán)限執(zhí)行,有些需要 root 權(quán)限才能執(zhí)行的命令無法直接用 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 后也無法通過 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 即我們常說的 SN坪稽,state 有如下幾種:
offline —— 表示設(shè)備未連接成功或無響應(yīng)曼玩。
device —— 設(shè)備已連接鳞骤。注意這個(gè)狀態(tài)并不能標(biāo)識(shí) Android 系統(tǒng)已經(jīng)完全啟動(dòng)和可操作,在設(shè)備啟動(dòng)過程中設(shè)備實(shí)例就可連接到 adb黍判,但啟動(dòng)完畢后系統(tǒng)才處于可操作狀態(tài)豫尽。
no device —— 沒有設(shè)備/模擬器連接。
以上輸出顯示當(dāng)前已經(jīng)連接了兩臺(tái)設(shè)備/模擬器顷帖,cf264b8f 與 emulator-5554 分別是它們的 SN美旧。從 emulator-5554 這個(gè)名字可以看出它是一個(gè) Android 模擬器。
常見異常輸出:
沒有設(shè)備/模擬器連接成功贬墩。
List of devices attached 設(shè)備/模擬器未連接到 adb 或無響應(yīng)榴嗅。
List of devices attached cf264b8f offline USB 連接
通過 USB 連接來正常使用 adb 需要保證幾點(diǎn):
硬件狀態(tài)正常。
包括 Android 設(shè)備處于正常開機(jī)狀態(tài)陶舞,USB 連接線和各種接口完好嗽测。
Android 設(shè)備的開發(fā)者選項(xiàng)和 USB 調(diào)試模式已開啟。
可以到「設(shè)置」-「開發(fā)者選項(xiàng)」-「Android 調(diào)試」查看肿孵。
如果在設(shè)置里找不到開發(fā)者選項(xiàng)唠粥,那需要通過一個(gè)彩蛋來讓它顯示出來:在「設(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)或問號(hào)养涮,如果沒有就說明驅(qū)動(dòng)狀態(tài)已經(jīng)好了。否則可以下載一個(gè)手機(jī)助手類程序來安裝驅(qū)動(dòng)先眉抬。
通過 USB 線連接好電腦和設(shè)備后確認(rèn)狀態(tài)贯吓。
adb devices
如果能看到,xxxxxx device 說明連接成功蜀变。
無線連接(需要借助 USB 線)
除了可以通過 USB 連接設(shè)備與電腦來使用 adb悄谐,也可以通過無線連接——雖然連接過程中也有需要使用 USB 的步驟,但是連接成功之后你的設(shè)備就可以在一定范圍內(nèi)擺脫 USB 連接線的限制啦库北!
操作步驟:
- 將 Android 設(shè)備與要運(yùn)行 adb 的電腦連接到同一個(gè)局域網(wǎng)爬舰,比如連到同一個(gè) WiFi。
- 將設(shè)備與電腦通過 USB 線連接寒瓦。
- 應(yīng)確保連接成功(可運(yùn)行 adb devices 看是否能列出該設(shè)備)情屹。
- 讓設(shè)備在 5555 端口監(jiān)聽 TCP/IP 連接:
- adb tcpip 5555 斷開 USB 連接。
- 找到設(shè)備的 IP 地址杂腰,一般能在「設(shè)置」-「關(guān)于手機(jī)」-「狀態(tài)信息」-「IP地址」找到垃你。
- 通過 IP 地址連接設(shè)備,adb connect 這里的 就是上一步中找到的設(shè)備 IP 地址。
- 確認(rèn)連接狀態(tài)惜颇, devices 如果能看到:5555 device 說明連接成功皆刺。
- 如果連接不了,請(qǐng)確認(rèn) Android 設(shè)備與電腦是連接到了同一個(gè) WiFi凌摄,然后再次執(zhí)行 adb connect 那一步羡蛾;
- 如果還是不行的話,通過 adb kill-server 重新啟動(dòng) adb 然后從頭再來一次試試锨亏。
斷開無線連接
adb disconnect 無線連接(無需借助 USB 線)
注:需要 root 權(quán)限林说。
上一節(jié)「無線連接(需要借助 USB 線)」是官方文檔里介紹的方法,需要借助于 USB 數(shù)據(jù)線來實(shí)現(xiàn)無線連接屯伞。
既然我們想要實(shí)現(xiàn)無線連接,那能不能所有步驟下來都是無線的呢豪直?答案是能的劣摇。
- 在 Android 設(shè)備上安裝一個(gè)終端模擬器,已經(jīng)安裝過的設(shè)備可以跳過此步弓乙。我使用的終端模擬器下載地址是:Terminal Emulator for Android Downloads
- 將 Android 設(shè)備與要運(yùn)行 adb 的電腦連接到同一個(gè)局域網(wǎng)末融,比如連到同一個(gè) WiFi。
- 打開 Android 設(shè)備上的終端模擬器暇韧,在里面依次運(yùn)行命令:
su setprop service.adb.tcp.port 5555
- 找到 Android 設(shè)備的 IP 地址勾习,一般能在「設(shè)置」-「關(guān)于手機(jī)」-「狀態(tài)信息」-「IP地址」找到。
- 在電腦上通過 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)行過濾查看不同的列表涂乌,支持的過濾參數(shù)如下:
參數(shù) 顯示列表 無 所有應(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 來過濾:
adb shell pm list packages | grep mazhuang 安裝 APK
命令格式:
adb install [-lrtsdg] 參數(shù):
adb install 后面可以跟一些可選參數(shù)來控制安裝 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)行命令后如果見到類似如下輸出(狀態(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]
常見安裝失敗輸出代碼丈莺、含義及可能的解決辦法如下:
輸出 含義 解決辦法
INSTALL_FAILED_ALREADY_EXISTS 應(yīng)用已經(jīng)存在 使用 -r 參數(shù)
INSTALL_FAILED_INVALID_APK 無效的 APK 文件
INSTALL_FAILED_INVALID_URI 無效的 APK 文件名 確保 APK 文件名里無中文
INSTALL_FAILED_INSUFFICIENT_STORAGE 空間不足 清理空間
INSTALL_FAILED_DUPLICATE_PACKAGE 已經(jīng)存在同名程序
INSTALL_FAILED_NO_SHARED_USER 請(qǐng)求的共享用戶不存在
INSTALL_FAILED_UPDATE_INCOMPATIBLE 已經(jīng)安裝過簽名不一樣的同名應(yīng)用,且數(shù)據(jù)沒有移除
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 請(qǐng)求的共享用戶存在但簽名不一致
INSTALL_FAILED_MISSING_SHARED_LIBRARY 安裝包使用了設(shè)備上不可用的共享庫(kù)
INSTALL_FAILED_REPLACE_COULDNT_DELETE 替換時(shí)無法刪除
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í)沒有指定 -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 訪問失敗 確認(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 以前安裝過該應(yīng)用牵现,與本次分配的 UID 不一致 清除以前安裝過的殘留文件
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 無法解析的 AndroidManifest.xml 文件
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION 解析器遇到異常
INSTALL_PARSE_FAILED_NO_CERTIFICATES 安裝包沒有簽名
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 文件里沒有或者使用了無效的包名
INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID manifest 文件里指定了無效的共享用戶 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)問題安裝失敗
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 無效的 APK 文件 is not a valid zip file 無效的 APK 文件
Offline 設(shè)備未連接成功 先將設(shè)備與 adb 連接成功
- unauthorized 設(shè)備未授權(quán)允許調(diào)試
- error: device not found 沒有連接成功的設(shè)備 先將設(shè)備與 adb 連接成功
- protocol failure 設(shè)備已斷開連接 先將設(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í)行安裝過程。
卸載應(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ù)很靈活捶障,和寫 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ù)锭部,就像寫代碼時(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 顯示幫助文檔