一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

adb命令大全

 zsz6405 2019-01-18

目錄

基本用法

命令語法

為命令指定目標(biāo)設(shè)備

啟動(dòng)/停止

查看 adb 版本

以 root 權(quán)限運(yùn)行 adbd

指定 adb server 的網(wǎng)絡(luò)端口

設(shè)備連接管理

查詢已連接設(shè)備/模擬器

USB 連接

無線連接(需要借助 USB 線)

無線連接(無需借助 USB 線)

應(yīng)用管理

查看應(yīng)用列表

安裝 APK

卸載應(yīng)用

清除應(yīng)用數(shù)據(jù)與緩存

查看前臺(tái) Activity

查看正在運(yùn)行的 Services

查看應(yīng)用詳細(xì)信息

與應(yīng)用交互

調(diào)起 Activity

調(diào)起 Service

發(fā)送廣播

強(qiáng)制停止應(yīng)用

文件管理

復(fù)制設(shè)備里的文件到電腦

復(fù)制電腦里的文件到設(shè)備

模擬按鍵/輸入

電源鍵

菜單鍵

HOME 鍵

返回鍵

音量控制

媒體控制

點(diǎn)亮/熄滅屏幕

滑動(dòng)解鎖

輸入文本

查看日志

Android 日志

內(nèi)核日志

查看設(shè)備信息

型號(hào)

電池狀況

屏幕分辨率

屏幕密度

顯示屏參數(shù)

android_id

IMEI

Android 系統(tǒng)版本

IP 地址

Mac 地址

CPU 信息

內(nèi)存信息

更多硬件與系統(tǒng)屬性

修改設(shè)置

分辨率

屏幕密度

顯示區(qū)域

關(guān)閉 USB 調(diào)試模式

狀態(tài)欄和導(dǎo)航欄的顯示隱藏

實(shí)用功能

屏幕截圖

錄制屏幕

重新掛載 system 分區(qū)為可寫

查看連接過的 WiFi 密碼

設(shè)置系統(tǒng)日期和時(shí)間

重啟手機(jī)

檢測設(shè)備是否已 root

使用 Monkey 進(jìn)行壓力測試

開啟/關(guān)閉 WiFi

刷機(jī)相關(guān)命令

重啟到 Recovery 模式

從 Recovery 重啟到 Android

重啟到 Fastboot 模式

通過 sideload 更新系統(tǒng)

安全相關(guān)命令

啟用/禁用 SELinux

啟用/禁用 dm_verity

更多 adb shell 命令

查看進(jìn)程

查看實(shí)時(shí)資源占用情況

查看進(jìn)程 UID

其它

常見問題

啟動(dòng) adb server 失敗

com.android.ddmlib.AdbCommandRejectedException

查看版本

查看連接設(shè)備

安裝一個(gè)apk,執(zhí)行以下命令:

直接卸載:

啟動(dòng)/停止 Server

啟動(dòng) adb server :

停止 adb server :

列出手機(jī)裝的所有app的包名:

列出系統(tǒng)應(yīng)用的所有包名:

列出除了系統(tǒng)應(yīng)用的第三方應(yīng)用包名:

使用 grep 來過濾:

清除應(yīng)用數(shù)據(jù)與緩存

啟動(dòng)應(yīng)用

強(qiáng)制停止應(yīng)用

查看日志

重啟

獲取序列號(hào)

獲取 MAC 地址

查看設(shè)備型號(hào)

查看 Android 系統(tǒng)版本

查看屏幕分辨率

查看屏幕密度

adb 的非官方實(shí)現(xiàn)

致謝

參考鏈接

 

基本用法

命令語法

adb 命令的基本語法如下:

adb [-d|-e|-s <serialNumber>] <command>

如果只有一個(gè)設(shè)備/模擬器連接時(shí),可以省略掉 [-d|-e|-s <serialNumber>] 這一部分,直接使用 adb <command>

為命令指定目標(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 <serialNumber> 指定相應(yīng) serialNumber 號(hào)的設(shè)備/模擬器為命令目標(biāo)

在多個(gè)設(shè)備/模擬器連接的情況下較常用的是 -s <serialNumber> 參數(shù),serialNumber 可以通過 adb devices 命令獲取。如:

$ adb devices

List of devices attached
cf264b8f	device
emulator-5554	device
10.129.164.6:5555	device

輸出里的 cf264b8f、emulator-5554 和 10.129.164.6:5555 即為 serialNumber。

比如這時(shí)想指定 cf264b8f 這個(gè)設(shè)備來運(yùn)行 adb 命令獲取屏幕分辨率:

adb -s cf264b8f shell wm size

又如想給 10.129.164.6:5555 這個(gè)設(shè)備安裝應(yīng)用(這種形式的 serialNumber 格式為 <IP>:<Port>,一般為無線連接的設(shè)備或 Genymotion 等第三方 Android 模擬器):

adb -s 10.129.164.6:5555 install test.apk

遇到多設(shè)備/模擬器的情況均使用這幾個(gè)參數(shù)為命令指定目標(biāo)設(shè)備,下文中為簡化描述,不再重復(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 <port> start-server

默認(rèn)端口為 5037。

設(shè)備連接管理

查詢已連接設(shè)備/模擬器

命令:

adb devices

輸出示例:

List of devices attached
cf264b8f	device
emulator-5554	device
10.129.164.6:5555	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 和 10.129.164.6:5555 分別是它們的 SN。從 emulator-5554 這個(gè)名字可以看出它是一個(gè) Android 模擬器,而 10.129.164.6:5555 這種形為 <IP>:<Port> 的 serialNumber 一般是無線連接的設(shè)備或 Genymotion 等第三方 Android 模擬器。

常見異常輸出:

  1. 沒有設(shè)備/模擬器連接成功。

    List of devices attached
  2. 設(shè)備/模擬器未連接到 adb 或無響應(yīng)。

    List of devices attached
    cf264b8f	offline

USB 連接

通過 USB 連接來正常使用 adb 需要保證幾點(diǎn):

  1. 硬件狀態(tài)正常。

    包括 Android 設(shè)備處于正常開機(jī)狀態(tài),USB 連接線和各種接口完好。

  2. 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 次。

  3. 設(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)先。

  4. 通過 USB 線連接好電腦和設(shè)備后確認(rèn)狀態(tài)。

    adb devices

    如果能看到

    xxxxxx device

    說明連接成功。

無線連接(需要借助 USB 線)

除了可以通過 USB 連接設(shè)備與電腦來使用 adb,也可以通過無線連接——雖然連接過程中也有需要使用 USB 的步驟,但是連接成功之后你的設(shè)備就可以在一定范圍內(nèi)擺脫 USB 連接線的限制啦!

操作步驟:

  1. 將 Android 設(shè)備與要運(yùn)行 adb 的電腦連接到同一個(gè)局域網(wǎng),比如連到同一個(gè) WiFi。

  2. 將設(shè)備與電腦通過 USB 線連接。

    應(yīng)確保連接成功(可運(yùn)行 adb devices 看是否能列出該設(shè)備)。

  3. 讓設(shè)備在 5555 端口監(jiān)聽 TCP/IP 連接:

    adb tcpip 5555
  4. 斷開 USB 連接。

  5. 找到設(shè)備的 IP 地址。

    一般能在「設(shè)置」-「關(guān)于手機(jī)」-「狀態(tài)信息」-「IP地址」找到,也可以使用下文里 查看設(shè)備信息 - IP 地址 一節(jié)里的方法用 adb 命令來查看。

  6. 通過 IP 地址連接設(shè)備。

    adb connect <device-ip-address>

    這里的 <device-ip-address> 就是上一步中找到的設(shè)備 IP 地址。

  7. 確認(rèn)連接狀態(tài)。

    adb devices

    如果能看到

    <device-ip-address>:5555 device

    說明連接成功。

如果連接不了,請確認(rèn) Android 設(shè)備與電腦是連接到了同一個(gè) WiFi,然后再次執(zhí)行 adb connect <device-ip-address> 那一步;

如果還是不行的話,通過 adb kill-server 重新啟動(dòng) adb 然后從頭再來一次試試。

斷開無線連接

命令:

adb disconnect <device-ip-address>

無線連接(無需借助 USB 線)

注:需要 root 權(quán)限。

上一節(jié)「無線連接(需要借助 USB 線)」是官方文檔里介紹的方法,需要借助于 USB 數(shù)據(jù)線來實(shí)現(xiàn)無線連接。

既然我們想要實(shí)現(xiàn)無線連接,那能不能所有步驟下來都是無線的呢?答案是能的。

  1. 在 Android 設(shè)備上安裝一個(gè)終端模擬器。

    已經(jīng)安裝過的設(shè)備可以跳過此步。我使用的終端模擬器下載地址是:Terminal Emulator for Android Downloads

  2. 將 Android 設(shè)備與要運(yùn)行 adb 的電腦連接到同一個(gè)局域網(wǎng),比如連到同一個(gè) WiFi。

  3. 打開 Android 設(shè)備上的終端模擬器,在里面依次運(yùn)行命令:

    su
    setprop service.adb.tcp.port 5555
  4. 找到 Android 設(shè)備的 IP 地址。

    一般能在「設(shè)置」-「關(guān)于手機(jī)」-「狀態(tài)信息」-「IP地址」找到,也可以使用下文里 查看設(shè)備信息 - IP 地址 一節(jié)里的方法用 adb 命令來查看。

  5. 在電腦上通過 adb 和 IP 地址連接 Android 設(shè)備。

    adb connect <device-ip-address>

    這里的 <device-ip-address> 就是上一步中找到的設(shè)備 IP 地址。

    如果能看到 connected to <device-ip-address>:5555 這樣的輸出則表示連接成功。

節(jié)注一:

有的設(shè)備,比如小米 5S + MIUI 8.0 + Android 6.0.1 MXB48T,可能在第 5 步之前需要重啟 adbd 服務(wù),在設(shè)備的終端模擬器上運(yùn)行:

restart adbd

如果 restart 無效,嘗試以下命令:

stop adbd
start adbd

應(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)用
<FILTER> 包名包含 <FILTER> 字符串

所有應(yīng)用

命令:

adb shell pm list packages

輸出示例:

package:com.android.smoketest
package:com.example.android.livecubes
package:com.android.providers.telephony
package:com.google.android.googlequicksearchbox
package:com.android.providers.calendar
package:com.android.providers.media
package:com.android.protips
package:com.android.documentsui
package:com.android.gallery
package:com.android.externalstorage
...
// other packages here
...

系統(tǒ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] <path_to_apk>

參數(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)存在,或卸載了但沒卸載干凈 adb install 時(shí)使用 -r 參數(shù),或者先 adb uninstall <packagename> 再安裝
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 請求的共享用戶不存在  
INSTALL_FAILED_UPDATE_INCOMPATIBLE 以前安裝過同名應(yīng)用,但卸載時(shí)數(shù)據(jù)沒有移除;或者已安裝該應(yīng)用,但簽名不一致 先 adb uninstall <packagename> 再安裝
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 請求的共享用戶存在但簽名不一致  
INSTALL_FAILED_MISSING_SHARED_LIBRARY 安裝包使用了設(shè)備上不可用的共享庫  
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 1. sdcard 訪問失敗;
2. 應(yīng)用簽名與 ROM 簽名一致,被當(dāng)作內(nèi)置應(yīng)用。
1. 確認(rèn) sdcard 可用,或者安裝到內(nèi)置存儲(chǔ);
2. 打包時(shí)不與 ROM 使用相同簽名。
INSTALL_FAILED_INVALID_INSTALL_LOCATION 1. 不能安裝到指定位置;
2. 應(yīng)用簽名與 ROM 簽名一致,被當(dāng)作內(nèi)置應(yīng)用。
1. 切換安裝位置,添加或刪除 -s 參數(shù);
2. 打包時(shí)不與 ROM 使用相同簽名。
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 device 空間不足 清理空間
Permission denied ... sdcard ... sdcard 不可用  
signatures do not match the previously installed version; ignoring! 已安裝該應(yīng)用且簽名不一致 先卸載設(shè)備上的該應(yīng)用,再安裝

參考:PackageManager.java

adb install 內(nèi)部原理簡介

adb install 實(shí)際是分三步完成:

  1. push apk 文件到 /data/local/tmp。

  2. 調(diào)用 pm install 安裝。

  3. 刪除 /data/local/tmp 下的對(duì)應(yīng) apk 文件。

所以,必要的時(shí)候也可以根據(jù)這個(gè)步驟,手動(dòng)分步執(zhí)行安裝過程。

卸載應(yīng)用

命令:

adb uninstall [-k] <packagename>

<packagename> 表示應(yīng)用的包名,-k 參數(shù)可選,表示卸載應(yīng)用但保留數(shù)據(jù)和緩存目錄。

命令示例:

adb uninstall com.qihoo360.mobilesafe

表示卸載 360 手機(jī)衛(wèi)士。

清除應(yīng)用數(shù)據(jù)與緩存

命令:

adb shell pm clear <packagename>

<packagename> 表示應(yīng)用名包,這條命令的效果相當(dāng)于在設(shè)置里的應(yīng)用信息界面點(diǎn)擊了「清除緩存」和「清除數(shù)據(jù)」。

命令示例:

adb shell pm clear com.qihoo360.mobilesafe

表示清除 360 手機(jī)衛(wèi)士的數(shù)據(jù)和緩存。

查看前臺(tái) Activity

命令:

adb shell dumpsys activity activities | grep mFocusedActivity

輸出示例:

mFocusedActivity: ActivityRecord{8079d7e u0 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher t42}

其中的 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher 就是當(dāng)前處于前臺(tái)的 Activity。

查看正在運(yùn)行的 Services

命令:

adb shell dumpsys activity services [<packagename>]

<packagename> 參數(shù)不是必須的,指定 <packagename> 表示查看與某個(gè)包名相關(guān)的 Services,不指定表示查看所有 Services。

<packagename> 不一定要給出完整的包名,比如運(yùn)行 adb shell dumpsys activity services org.mazhuang,那么包名 org.mazhuang.demo1org.mazhuang.demo2 和 org.mazhuang123 等相關(guān)的 Services 都會(huì)列出來。

查看應(yīng)用詳細(xì)信息

命令:

adb shell dumpsys package <packagename>

輸出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安裝后的文件資源代碼等路徑、版本信息、權(quán)限信息和授予狀態(tài)、簽名版本信息等。

<packagename> 表示應(yīng)用包名。

輸出示例:

Activity Resolver Table:
  Non-Data Actions:
      android.intent.action.MAIN:
        5b4cba8 org.mazhuang.guanggoo/.SplashActivity filter 5ec9dcc
          Action: "android.intent.action.MAIN"
          Category: "android.intent.category.LAUNCHER"
          AutoVerify=false

Registered ContentProviders:
  org.mazhuang.guanggoo/com.tencent.bugly.beta.utils.BuglyFileProvider:
    Provider{7a3c394 org.mazhuang.guanggoo/com.tencent.bugly.beta.utils.BuglyFileProvider}

ContentProvider Authorities:
  [org.mazhuang.guanggoo.fileProvider]:
    Provider{7a3c394 org.mazhuang.guanggoo/com.tencent.bugly.beta.utils.BuglyFileProvider}
      applicationInfo=ApplicationInfo{7754242 org.mazhuang.guanggoo}

Key Set Manager:
  [org.mazhuang.guanggoo]
      Signing KeySets: 501

Packages:
  Package [org.mazhuang.guanggoo] (c1d7f):
    userId=10394
    pkg=Package{55f714c org.mazhuang.guanggoo}
    codePath=/data/app/org.mazhuang.guanggoo-2
    resourcePath=/data/app/org.mazhuang.guanggoo-2
    legacyNativeLibraryDir=/data/app/org.mazhuang.guanggoo-2/lib
    primaryCpuAbi=null
    secondaryCpuAbi=null
    versionCode=74 minSdk=15 targetSdk=25
    versionName=1.1.74
    splits=[base]
    apkSigningVersion=2
    applicationInfo=ApplicationInfo{7754242 org.mazhuang.guanggoo}
    flags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
    privateFlags=[ RESIZEABLE_ACTIVITIES ]
    dataDir=/data/user/0/org.mazhuang.guanggoo
    supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]
    timeStamp=2017-10-22 23:50:53
    firstInstallTime=2017-10-22 23:50:25
    lastUpdateTime=2017-10-22 23:50:55
    installerPackageName=com.miui.packageinstaller
    signatures=PackageSignatures{af09595 [53c7caa2]}
    installPermissionsFixed=true installStatus=1
    pkgFlags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
    requested permissions:
      android.permission.READ_PHONE_STATE
      android.permission.INTERNET
      android.permission.ACCESS_NETWORK_STATE
      android.permission.ACCESS_WIFI_STATE
      android.permission.READ_LOGS
      android.permission.WRITE_EXTERNAL_STORAGE
      android.permission.READ_EXTERNAL_STORAGE
    install permissions:
      android.permission.INTERNET: granted=true
      android.permission.ACCESS_NETWORK_STATE: granted=true
      android.permission.ACCESS_WIFI_STATE: granted=true
    User 0: ceDataInode=1155675 installed=true hidden=false suspended=false stopped=true notLaunched=false enabled=0
      gids=[3003]
      runtime permissions:
        android.permission.READ_EXTERNAL_STORAGE: granted=true
        android.permission.READ_PHONE_STATE: granted=true
        android.permission.WRITE_EXTERNAL_STORAGE: granted=true
    User 999: ceDataInode=0 installed=false hidden=false suspended=false stopped=true notLaunched=true enabled=0
      gids=[3003]
      runtime permissions:


Dexopt state:
  [org.mazhuang.guanggoo]
    Instruction Set: arm64
      path: /data/app/org.mazhuang.guanggoo-2/base.apk
      status: /data/app/org.mazhuang.guanggoo-2/oat/arm64/base.odex [compilation_filter=speed-profile, status=kOatUpToDa
      te]

與應(yīng)用交互

主要是使用 am <command> 命令,常用的 <command> 如下:

command 用途
start [options] <INTENT> 啟動(dòng) <INTENT> 指定的 Activity
startservice [options] <INTENT> 啟動(dòng) <INTENT> 指定的 Service
broadcast [options] <INTENT> 發(fā)送 <INTENT> 指定的廣播
force-stop <packagename> 停止 <packagename> 相關(guān)的進(jìn)程

<INTENT> 參數(shù)很靈活,和寫 Android 程序時(shí)代碼里的 Intent 相對(duì)應(yīng)。

用于決定 intent 對(duì)象的選項(xiàng)如下:

參數(shù) 含義
-a <ACTION> 指定 action,比如 android.intent.action.VIEW
-c <CATEGORY> 指定 category,比如 android.intent.category.APP_CONTACTS
-n <COMPONENT> 指定完整 component 名,用于明確指定啟動(dòng)哪個(gè) Activity,如 com.example.app/.ExampleActivity

<INTENT> 里還能帶數(shù)據(jù),就像寫代碼時(shí)的 Bundle 一樣:

參數(shù) 含義
--esn <EXTRA_KEY> null 值(只有 key 名)
`-e --es <EXTRA_KEY> <EXTRA_STRING_VALUE>`
--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> boolean 值
--ei <EXTRA_KEY> <EXTRA_INT_VALUE> integer 值
--el <EXTRA_KEY> <EXTRA_LONG_VALUE> long 值
--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> float 值
--eu <EXTRA_KEY> <EXTRA_URI_VALUE> URI
--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE> component name
--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...] integer 數(shù)組
--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...] long 數(shù)組

調(diào)起 Activity

命令格式:

adb shell am start [options] <INTENT>

例如:

adb shell am start -n com.tencent.mm/.ui.LauncherUI

表示調(diào)起微信主界面。

adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"

表示調(diào)起 org.mazhuang.boottimemeasure/.MainActivity 并傳給它 string 數(shù)據(jù)鍵值對(duì) toast - hello, world

調(diào)起 Service

命令格式:

adb shell am startservice [options] <INTENT>

例如:

adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService

表示調(diào)起微信的某 Service。

發(fā)送廣播

命令格式:

adb shell am broadcast [options] <INTENT>

可以向所有組件廣播,也可以只向指定組件廣播。

例如,向所有組件廣播 BOOT_COMPLETED

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED

又例如,只向 org.mazhuang.boottimemeasure/.BootCompletedReceiver 廣播 BOOT_COMPLETED

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver

這類用法在測試的時(shí)候很實(shí)用,比如某個(gè)廣播的場景很難制造,可以考慮通過這種方式來發(fā)送廣播。

既能發(fā)送系統(tǒng)預(yù)定義的廣播,也能發(fā)送自定義廣播。如下是部分系統(tǒng)預(yù)定義廣播及正常觸發(fā)時(shí)機(jī):

action 觸發(fā)時(shí)機(jī)
android.net.conn.CONNECTIVITY_CHANGE 網(wǎng)絡(luò)連接發(fā)生變化
android.intent.action.SCREEN_ON 屏幕點(diǎn)亮
android.intent.action.SCREEN_OFF 屏幕熄滅
android.intent.action.BATTERY_LOW 電量低,會(huì)彈出電量低提示框
android.intent.action.BATTERY_OKAY 電量恢復(fù)了
android.intent.action.BOOT_COMPLETED 設(shè)備啟動(dòng)完畢
android.intent.action.DEVICE_STORAGE_LOW 存儲(chǔ)空間過低
android.intent.action.DEVICE_STORAGE_OK 存儲(chǔ)空間恢復(fù)
android.intent.action.PACKAGE_ADDED 安裝了新的應(yīng)用
android.net.wifi.STATE_CHANGE WiFi 連接狀態(tài)發(fā)生變化
android.net.wifi.WIFI_STATE_CHANGED WiFi 狀態(tài)變?yōu)閱⒂?關(guān)閉/正在啟動(dòng)/正在關(guān)閉/未知
android.intent.action.BATTERY_CHANGED 電池電量發(fā)生變化
android.intent.action.INPUT_METHOD_CHANGED 系統(tǒng)輸入法發(fā)生變化
android.intent.action.ACTION_POWER_CONNECTED 外部電源連接
android.intent.action.ACTION_POWER_DISCONNECTED 外部電源斷開連接
android.intent.action.DREAMING_STARTED 系統(tǒng)開始休眠
android.intent.action.DREAMING_STOPPED 系統(tǒng)停止休眠
android.intent.action.WALLPAPER_CHANGED 壁紙發(fā)生變化
android.intent.action.HEADSET_PLUG 插入耳機(jī)
android.intent.action.MEDIA_UNMOUNTED 卸載外部介質(zhì)
android.intent.action.MEDIA_MOUNTED 掛載外部介質(zhì)
android.os.action.POWER_SAVE_MODE_CHANGED 省電模式開啟

(以上廣播均可使用 adb 觸發(fā))

強(qiáng)制停止應(yīng)用

命令:

adb shell am force-stop <packagename>

命令示例:

adb shell am force-stop com.qihoo360.mobilesafe

表示停止 360 安全衛(wèi)士的一切進(jìn)程與服務(wù)。

文件管理

復(fù)制設(shè)備里的文件到電腦

命令:

adb pull <設(shè)備里的文件路徑> [電腦上的目錄]

其中 電腦上的目錄 參數(shù)可以省略,默認(rèn)復(fù)制到當(dāng)前目錄。

例:

adb pull /sdcard/sr.mp4 ~/tmp/

*小技巧:*設(shè)備上的文件路徑可能需要 root 權(quán)限才能訪問,如果你的設(shè)備已經(jīng) root 過,可以先使用 adb shell 和 su 命令在 adb shell 里獲取 root 權(quán)限后,先 cp /path/on/device /sdcard/filename 將文件復(fù)制到 sdcard,然后 adb pull /sdcard/filename /path/on/pc

復(fù)制電腦里的文件到設(shè)備

命令:

adb push <電腦上的文件路徑> <設(shè)備里的目錄>

例:

adb push ~/sr.mp4 /sdcard/

*小技巧:*設(shè)備上的文件路徑普通權(quán)限可能無法直接寫入,如果你的設(shè)備已經(jīng) root 過,可以先 adb push /path/on/pc /sdcard/filename,然后 adb shell 和 su 在 adb shell 里獲取 root 權(quán)限后,cp /sdcard/filename /path/on/device

模擬按鍵/輸入

在 adb shell 里有個(gè)很實(shí)用的命令叫 input,通過它可以做一些有趣的事情。

input 命令的完整 help 信息如下:

Usage: input [<source>] <command> [<arg>...]

The sources are:
      mouse
      keyboard
      joystick
      touchnavigation
      touchpad
      trackball
      stylus
      dpad
      gesture
      touchscreen
      gamepad

The commands and default sources are:
      text <string> (Default: touchscreen)
      keyevent [--longpress] <key code number or name> ... (Default: keyboard)
      tap <x> <y> (Default: touchscreen)
      swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
      press (Default: trackball)
      roll <dx> <dy> (Default: trackball)

比如使用 adb shell input keyevent <keycode> 命令,不同的 keycode 能實(shí)現(xiàn)不同的功能,完整的 keycode 列表詳見 KeyEvent,摘引部分我覺得有意思的如下:

keycode 含義
3 HOME 鍵
4 返回鍵
5 打開撥號(hào)應(yīng)用
6 掛斷電話
24 增加音量
25 降低音量
26 電源鍵
27 拍照(需要在相機(jī)應(yīng)用里)
64 打開瀏覽器
82 菜單鍵
85 播放/暫停
86 停止播放
87 播放下一首
88 播放上一首
122 移動(dòng)光標(biāo)到行首或列表頂部
123 移動(dòng)光標(biāo)到行末或列表底部
126 恢復(fù)播放
127 暫停播放
164 靜音
176 打開系統(tǒng)設(shè)置
187 切換應(yīng)用
207 打開聯(lián)系人
208 打開日歷
209 打開音樂
210 打開計(jì)算器
220 降低屏幕亮度
221 提高屏幕亮度
223 系統(tǒng)休眠
224 點(diǎn)亮屏幕
231 打開語音助手
276 如果沒有 wakelock 則讓系統(tǒng)休眠

下面是 input 命令的一些用法舉例。

電源鍵

命令:

adb shell input keyevent 26

執(zhí)行效果相當(dāng)于按電源鍵。

菜單鍵

命令:

adb shell input keyevent 82

HOME 鍵

命令:

adb shell input keyevent 3

返回鍵

命令:

adb shell input keyevent 4

音量控制

增加音量:

adb shell input keyevent 24

降低音量:

adb shell input keyevent 25

靜音:

adb shell input keyevent 164

媒體控制

播放/暫停:

adb shell input keyevent 85

停止播放:

adb shell input keyevent 86

播放下一首:

adb shell input keyevent 87

播放上一首:

adb shell input keyevent 88

恢復(fù)播放:

adb shell input keyevent 126

暫停播放:

adb shell input keyevent 127

點(diǎn)亮/熄滅屏幕

可以通過上文講述過的模擬電源鍵來切換點(diǎn)亮和熄滅屏幕,但如果明確地想要點(diǎn)亮或者熄滅屏幕,那可以使用如下方法。

點(diǎn)亮屏幕:

adb shell input keyevent 224

熄滅屏幕:

adb shell input keyevent 223

滑動(dòng)解鎖

如果鎖屏沒有密碼,是通過滑動(dòng)手勢解鎖,那么可以通過 input swipe 來解鎖。

命令(參數(shù)以機(jī)型 Nexus 5,向上滑動(dòng)手勢解鎖舉例):

adb shell input swipe 300 1000 300 500

參數(shù) 300 1000 300 500 分別表示起始點(diǎn)x坐標(biāo) 起始點(diǎn)y坐標(biāo) 結(jié)束點(diǎn)x坐標(biāo) 結(jié)束點(diǎn)y坐標(biāo)

輸入文本

在焦點(diǎn)處于某文本框時(shí),可以通過 input 命令來輸入文本。

命令:

adb shell input text hello

現(xiàn)在 hello 出現(xiàn)在文本框了。

查看日志

Android 系統(tǒng)的日志分為兩部分,底層的 Linux 內(nèi)核日志輸出到 /proc/kmsg,Android 的日志輸出到 /dev/log。

Android 日志

命令格式:

[adb] logcat [<option>] ... [<filter-spec>] ...

常用用法列舉如下:

按級(jí)別過濾日志

Android 的日志分為如下幾個(gè)優(yōu)先級(jí)(priority):

  • V —— Verbose(最低,輸出得最多)
  • D —— Debug
  • I —— Info
  • W —— Warning
  • E —— Error
  • F —— Fatal
  • S —— Silent(最高,啥也不輸出)

按某級(jí)別過濾日志則會(huì)將該級(jí)別及以上的日志輸出。

比如,命令:

adb logcat *:W

會(huì)將 Warning、Error、Fatal 和 Silent 日志輸出。

(注: 在 macOS 下需要給 *:W 這樣以 * 作為 tag 的參數(shù)加雙引號(hào),如 adb logcat "*:W",不然會(huì)報(bào)錯(cuò) no matches found: *:W。)

按 tag 和級(jí)別過濾日志

<filter-spec> 可以由多個(gè) <tag>[:priority] 組成。

比如,命令:

adb logcat ActivityManager:I MyApp:D *:S

表示輸出 tag ActivityManager 的 Info 以上級(jí)別日志,輸出 tag MyApp 的 Debug 以上級(jí)別日志,及其它 tag 的 Silent 級(jí)別日志(即屏蔽其它 tag 日志)。

日志格式

可以用 adb logcat -v <format> 選項(xiàng)指定日志輸出格式。

日志支持按以下幾種 <format>

  • brief

    默認(rèn)格式。格式為:

    <priority>/<tag>(<pid>): <message>

    示例:

    D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
  • process

    格式為:

    <priority>(<pid>) <message>

    示例:

    D( 1785) Disconnected process message: 10, size: 0  (HeadsetStateMachine)
  • tag

    格式為:

    <priority>/<tag>: <message>

    示例:

    D/HeadsetStateMachine: Disconnected process message: 10, size: 0
  • raw

    格式為:

    <message>

    示例:

    Disconnected process message: 10, size: 0
  • time

    格式為:

    <datetime> <priority>/<tag>(<pid>): <message>

    示例:

    08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
  • threadtime

    格式為:

    <datetime> <pid> <tid> <priority> <tag>: <message>

    示例:

    08-28 22:39:39.974  1785  1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0
  • long

    格式為:

    [ <datetime> <pid>:<tid> <priority>/<tag> ]
    <message>

    示例:

    [ 08-28 22:39:39.974  1785: 1832 D/HeadsetStateMachine ]
    Disconnected process message: 10, size: 0

指定格式可與上面的過濾同時(shí)使用。比如:

adb logcat -v long ActivityManager:I *:S

清空日志

adb logcat -c

內(nèi)核日志

命令:

adb shell dmesg

輸出示例:

<6>[14201.684016] PM: noirq resume of devices complete after 0.982 msecs
<6>[14201.685525] PM: early resume of devices complete after 0.838 msecs
<6>[14201.753642] PM: resume of devices complete after 68.106 msecs
<4>[14201.755954] Restarting tasks ... done.
<6>[14201.771229] PM: suspend exit 2016-08-28 13:31:32.679217193 UTC
<6>[14201.872373] PM: suspend entry 2016-08-28 13:31:32.780363596 UTC
<6>[14201.872498] PM: Syncing filesystems ... done.

中括號(hào)里的 [14201.684016] 代表內(nèi)核開始啟動(dòng)后的時(shí)間,單位為秒。

通過內(nèi)核日志我們可以做一些事情,比如衡量內(nèi)核啟動(dòng)時(shí)間,在系統(tǒng)啟動(dòng)完畢后的內(nèi)核日志里找到 Freeing init memory 那一行前面的時(shí)間就是。

查看設(shè)備信息

型號(hào)

命令:

adb shell getprop ro.product.model

輸出示例:

Nexus 5

電池狀況

命令:

adb shell dumpsys battery

輸入示例:

Current Battery Service state:
  AC powered: false
  USB powered: true
  Wireless powered: false
  status: 2
  health: 2
  present: true
  level: 44
  scale: 100
  voltage: 3872
  temperature: 280
  technology: Li-poly

其中 scale 代表最大電量,level 代表當(dāng)前電量。上面的輸出表示還剩下 44% 的電量。

屏幕分辨率

命令:

adb shell wm size

輸出示例:

Physical size: 1080x1920

該設(shè)備屏幕分辨率為 1080px * 1920px。

如果使用命令修改過,那輸出可能是:

Physical size: 1080x1920
Override size: 480x1024

表明設(shè)備的屏幕分辨率原本是 1080px * 1920px,當(dāng)前被修改為 480px * 1024px。

屏幕密度

命令:

adb shell wm density

輸出示例:

Physical density: 420

該設(shè)備屏幕密度為 420dpi。

如果使用命令修改過,那輸出可能是:

Physical density: 480
Override density: 160

表明設(shè)備的屏幕密度原來是 480dpi,當(dāng)前被修改為 160dpi。

顯示屏參數(shù)

命令:

adb shell dumpsys window displays

輸出示例:

WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
  Display: mDisplayId=0
    init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1810x1731
    deferred=false layoutNeeded=false

其中 mDisplayId 為 顯示屏編號(hào),init 是初始分辨率和屏幕密度,app 的高度比 init 里的要小,表示屏幕底部有虛擬按鍵,高度為 1920 - 1794 = 126px 合 42dp。

android_id

命令:

adb shell settings get secure android_id

輸出示例:

51b6be48bac8c569

IMEI

在 Android 4.4 及以下版本可通過如下命令獲取 IMEI:

adb shell dumpsys iphonesubinfo

輸出示例:

Phone Subscriber Info:
  Phone Type = GSM
  Device ID = 860955027785041

其中的 Device ID 就是 IMEI。

而在 Android 5.0 及以上版本里這個(gè)命令輸出為空,得通過其它方式獲取了(需要 root 權(quán)限):

adb shell
su
service call iphonesubinfo 1

輸出示例:

Result: Parcel(
  0x00000000: 00000000 0000000f 00360038 00390030 '........8.6.0.9.'
  0x00000010: 00350035 00320030 00370037 00350038 '5.5.0.2.7.7.8.5.'
  0x00000020: 00340030 00000031                   '0.4.1...        ')

把里面的有效內(nèi)容提取出來就是 IMEI 了,比如這里的是 860955027785041

參考:adb shell dumpsys iphonesubinfo not working since Android 5.0 Lollipop

Android 系統(tǒng)版本

命令:

adb shell getprop ro.build.version.release

輸出示例:

5.0.2

IP 地址

每次想知道設(shè)備的 IP 地址的時(shí)候都得「設(shè)置」-「關(guān)于手機(jī)」-「狀態(tài)信息」-「IP地址」很煩對(duì)不對(duì)?通過 adb 可以方便地查看。

命令:

adb shell ifconfig | grep Mask

輸出示例:

inet addr:10.130.245.230  Mask:255.255.255.252
inet addr:127.0.0.1  Mask:255.0.0.0

那么 10.130.245.230 就是設(shè)備 IP 地址。

在有的設(shè)備上這個(gè)命令沒有輸出,如果設(shè)備連著 WiFi,可以使用如下命令來查看局域網(wǎng) IP:

adb shell ifconfig wlan0

輸出示例:

wlan0: ip 10.129.160.99 mask 255.255.240.0 flags [up broadcast running multicast]

wlan0     Link encap:UNSPEC
          inet addr:10.129.168.57  Bcast:10.129.175.255  Mask:255.255.240.0
          inet6 addr: fe80::66cc:2eff:fe68:b6b6/64 Scope: Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:496520 errors:0 dropped:0 overruns:0 frame:0
          TX packets:68215 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3000
          RX bytes:116266821 TX bytes:8311736

如果以上命令仍然不能得到期望的信息,那可以試試以下命令(部分系統(tǒng)版本里可用):

adb shell netcfg

輸出示例:

wlan0    UP                               10.129.160.99/20  0x00001043 f8:a9:d0:17:42:4d
lo       UP                                   127.0.0.1/8   0x00000049 00:00:00:00:00:00
p2p0     UP                                     0.0.0.0/0   0x00001003 fa:a9:d0:17:42:4d
sit0     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
rmnet0   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rmnet1   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rmnet3   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rmnet2   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rmnet4   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rmnet6   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rmnet5   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rmnet7   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00
rev_rmnet3 DOWN                                   0.0.0.0/0   0x00001002 4e:b7:e4:2e:17:58
rev_rmnet2 DOWN                                   0.0.0.0/0   0x00001002 4e:f0:c8:bf:7a:cf
rev_rmnet4 DOWN                                   0.0.0.0/0   0x00001002 a6:c0:3b:6b:c4:1f
rev_rmnet6 DOWN                                   0.0.0.0/0   0x00001002 66:bb:5d:64:2e:e9
rev_rmnet5 DOWN                                   0.0.0.0/0   0x00001002 0e:1b:eb:b9:23:a0
rev_rmnet7 DOWN                                   0.0.0.0/0   0x00001002 7a:d9:f6:81:40:5a
rev_rmnet8 DOWN                                   0.0.0.0/0   0x00001002 4e:e2:a9:bb:d0:1b
rev_rmnet0 DOWN                                   0.0.0.0/0   0x00001002 fe:65:d0:ca:82:a9
rev_rmnet1 DOWN                                   0.0.0.0/0   0x00001002 da:d8:e8:4f:2e:fe

可以看到網(wǎng)絡(luò)連接名稱、啟用狀態(tài)、IP 地址和 Mac 地址等信息。

Mac 地址

命令:

adb shell cat /sys/class/net/wlan0/address

輸出示例:

f8:a9:d0:17:42:4d

這查看的是局域網(wǎng) Mac 地址,移動(dòng)網(wǎng)絡(luò)或其它連接的信息可以通過前面的小節(jié)「IP 地址」里提到的 adb shell netcfg 命令來查看。

CPU 信息

命令:

adb shell cat /proc/cpuinfo

輸出示例:

Processor       : ARMv7 Processor rev 0 (v7l)
processor       : 0
BogoMIPS        : 38.40

processor       : 1
BogoMIPS        : 38.40

processor       : 2
BogoMIPS        : 38.40

processor       : 3
BogoMIPS        : 38.40

Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x51
CPU architecture: 7
CPU variant     : 0x2
CPU part        : 0x06f
CPU revision    : 0

Hardware        : Qualcomm MSM 8974 HAMMERHEAD (Flattened Device Tree)
Revision        : 000b
Serial          : 0000000000000000

這是 Nexus 5 的 CPU 信息,我們從輸出里可以看到使用的硬件是 Qualcomm MSM 8974,processor 的編號(hào)是 0 到 3,所以它是四核的,采用的架構(gòu)是 ARMv7 Processor rev 0 (v71)

內(nèi)存信息

命令:

adb shell cat /proc/meminfo

輸出示例:

MemTotal:        1027424 kB
MemFree:          486564 kB
Buffers:           15224 kB
Cached:            72464 kB
SwapCached:        24152 kB
Active:           110572 kB
Inactive:         259060 kB
Active(anon):      79176 kB
Inactive(anon):   207736 kB
Active(file):      31396 kB
Inactive(file):    51324 kB
Unevictable:        3948 kB
Mlocked:               0 kB
HighTotal:        409600 kB
HighFree:         132612 kB
LowTotal:         617824 kB
LowFree:          353952 kB
SwapTotal:        262140 kB
SwapFree:         207572 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        265324 kB
Mapped:            47072 kB
Shmem:              1020 kB
Slab:              57372 kB
SReclaimable:       7692 kB
SUnreclaim:        49680 kB
KernelStack:        4512 kB
PageTables:         5912 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      775852 kB
Committed_AS:   13520632 kB
VmallocTotal:     385024 kB
VmallocUsed:       61004 kB
VmallocChunk:     209668 kB

其中,MemTotal 就是設(shè)備的總內(nèi)存,MemFree 是當(dāng)前空閑內(nèi)存。

更多硬件與系統(tǒng)屬性

設(shè)備的更多硬件與系統(tǒng)屬性可以通過如下命令查看:

adb shell cat /system/build.prop

這會(huì)輸出很多信息,包括前面幾個(gè)小節(jié)提到的「型號(hào)」和「Android 系統(tǒng)版本」等。

輸出里還包括一些其它有用的信息,它們也可通過 adb shell getprop <屬性名> 命令單獨(dú)查看,列舉一部分屬性如下:

屬性名 含義
ro.build.version.sdk SDK 版本
ro.build.version.release Android 系統(tǒng)版本
ro.build.version.security_patch Android 安全補(bǔ)丁程序級(jí)別
ro.product.model 型號(hào)
ro.product.brand 品牌
ro.product.name 設(shè)備名
ro.product.board 處理器型號(hào)
ro.product.cpu.abilist CPU 支持的 abi 列表[節(jié)注一]
persist.sys.isUsbOtgEnabled 是否支持 OTG
dalvik.vm.heapsize 每個(gè)應(yīng)用程序的內(nèi)存上限
ro.sf.lcd_density 屏幕密度

節(jié)注一:

一些小廠定制的 ROM 可能修改過 CPU 支持的 abi 列表的屬性名,如果用 ro.product.cpu.abilist 屬性名查找不到,可以這樣試試:

adb shell cat /system/build.prop | grep ro.product.cpu.abi

示例輸出:

ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi

修改設(shè)置

注: 修改設(shè)置之后,運(yùn)行恢復(fù)命令有可能顯示仍然不太正常,可以運(yùn)行 adb reboot 重啟設(shè)備,或手動(dòng)重啟。

修改設(shè)置的原理主要是通過 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的設(shè)置值。

分辨率

命令:

adb shell wm size 480x1024

表示將分辨率修改為 480px * 1024px。

恢復(fù)原分辨率命令:

adb shell wm size reset

屏幕密度

命令:

adb shell wm density 160

表示將屏幕密度修改為 160dpi。

恢復(fù)原屏幕密度命令:

adb shell wm density reset

顯示區(qū)域

命令:

adb shell wm overscan 0,0,0,200

四個(gè)數(shù)字分別表示距離左、上、右、下邊緣的留白像素,以上命令表示將屏幕底部 200px 留白。

恢復(fù)原顯示區(qū)域命令:

adb shell wm overscan reset

關(guān)閉 USB 調(diào)試模式

命令:

adb shell settings put global adb_enabled 0

恢復(fù):

用命令恢復(fù)不了了,畢竟關(guān)閉了 USB 調(diào)試 adb 就連接不上 Android 設(shè)備了。

去設(shè)備上手動(dòng)恢復(fù)吧:「設(shè)置」-「開發(fā)者選項(xiàng)」-「Android 調(diào)試」。

狀態(tài)欄和導(dǎo)航欄的顯示隱藏

本節(jié)所說的相關(guān)設(shè)置對(duì)應(yīng) Cyanogenmod 里的「擴(kuò)展桌面」。

命令:

adb shell settings put global policy_control <key-values>

<key-values> 可由如下幾種鍵及其對(duì)應(yīng)的值組成,格式為 <key1>=<value1>:<key2>=<value2>。

key 含義
immersive.full 同時(shí)隱藏
immersive.status 隱藏狀態(tài)欄
immersive.navigation 隱藏導(dǎo)航欄
immersive.preconfirms ?

這些鍵對(duì)應(yīng)的值可則如下值用逗號(hào)組合:

value 含義
apps 所有應(yīng)用
* 所有界面
packagename 指定應(yīng)用
-packagename 排除指定應(yīng)用

例如:

adb shell settings put global policy_control immersive.full=*

表示設(shè)置在所有界面下都同時(shí)隱藏狀態(tài)欄和導(dǎo)航欄。

adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3

表示設(shè)置在包名為 com.package1 和 com.package2 的應(yīng)用里隱藏狀態(tài)欄,在除了包名為 com.package3 的所有應(yīng)用里隱藏導(dǎo)航欄。

實(shí)用功能

屏幕截圖

截圖保存到電腦:

adb exec-out screencap -p > sc.png

如果 adb 版本較老,無法使用 exec-out 命令,這時(shí)候建議更新 adb 版本。無法更新的話可以使用以下麻煩點(diǎn)的辦法:

先截圖保存到設(shè)備里:

adb shell screencap -p /sdcard/sc.png

然后將 png 文件導(dǎo)出到電腦:

adb pull /sdcard/sc.png

可以使用 adb shell screencap -h 查看 screencap 命令的幫助信息,下面是兩個(gè)有意義的參數(shù)及含義:

參數(shù) 含義
-p 指定保存文件為 png 格式
-d display-id 指定截圖的顯示屏編號(hào)(有多顯示屏的情況下)

實(shí)測如果指定文件名以 .png 結(jié)尾時(shí)可以省略 -p 參數(shù);否則需要使用 -p 參數(shù)。如果不指定文件名,截圖文件的內(nèi)容將直接輸出到 stdout。

另外一種一行命令截圖并保存到電腦的方法:

Linux 和 Windows

adb shell screencap -p | sed "s/\r$//" > sc.png

Mac OS X

adb shell screencap -p | gsed "s/\r$//" > sc.png

這個(gè)方法需要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows 下 Git 安裝目錄的 bin 文件夾下也有。如果確實(shí)找不到該命令,可以下載 sed for Windows 并將 sed.exe 所在文件夾添加到 PATH 環(huán)境變量里。

而在 Mac 下使用系統(tǒng)自帶的 sed 命令會(huì)報(bào)錯(cuò):

sed: RE error: illegal byte sequence

需要安裝 gnu-sed,然后使用 gsed 命令:

brew install gnu-sed

錄制屏幕

錄制屏幕以 mp4 格式保存到 /sdcard:

adb shell screenrecord /sdcard/filename.mp4

需要停止時(shí)按 Ctrl-C,默認(rèn)錄制時(shí)間和最長錄制時(shí)間都是 180 秒。

如果需要導(dǎo)出到電腦:

adb pull /sdcard/filename.mp4

可以使用 adb shell screenrecord --help 查看 screenrecord 命令的幫助信息,下面是常見參數(shù)及含義:

參數(shù) 含義
--size WIDTHxHEIGHT 視頻的尺寸,比如 1280x720,默認(rèn)是屏幕分辨率。
--bit-rate RATE 視頻的比特率,默認(rèn)是 4Mbps。
--time-limit TIME 錄制時(shí)長,單位秒。
--verbose 輸出更多信息。

重新掛載 system 分區(qū)為可寫

注:需要 root 權(quán)限。

/system 分區(qū)默認(rèn)掛載為只讀,但有些操作比如給 Android 系統(tǒng)添加命令、刪除自帶應(yīng)用等需要對(duì) /system 進(jìn)行寫操作,所以需要重新掛載它為可讀寫。

步驟:

  1. 進(jìn)入 shell 并切換到 root 用戶權(quán)限。

    命令:

    adb shell
    su
  2. 查看當(dāng)前分區(qū)掛載情況。

    命令:

    mount

    輸出示例:

    rootfs / rootfs ro,relatime 0 0
    tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0
    devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0
    proc /proc proc rw,relatime 0 0
    sysfs /sys sysfs rw,seclabel,relatime 0 0
    selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
    debugfs /sys/kernel/debug debugfs rw,relatime 0 0
    none /var tmpfs rw,seclabel,relatime,mode=770,gid=1000 0 0
    none /acct cgroup rw,relatime,cpuacct 0 0
    none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
    none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0
    tmpfs /mnt/asec tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
    tmpfs /mnt/obb tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
    none /dev/memcg cgroup rw,relatime,memory 0 0
    none /dev/cpuctl cgroup rw,relatime,cpu 0 0
    none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
    none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0
    none /sys/fs/cgroup/freezer cgroup rw,relatime,freezer 0 0
    /dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0
    /dev/block/platform/msm_sdcc.1/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,relatime,noauto_da_alloc,data=ordered 0 0
    /dev/block/platform/msm_sdcc.1/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
    /dev/block/platform/msm_sdcc.1/by-name/persist /persist ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
    /dev/block/platform/msm_sdcc.1/by-name/modem /firmware vfat ro,context=u:object_r:firmware_file:s0,relatime,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage=cp437,iocharset=iso8859-1,shortname=lower,errors=remount-ro 0 0
    /dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
    /dev/fuse /mnt/shell/emulated/0 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

    找到其中我們關(guān)注的帶 /system 的那一行:

    /dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0
  3. 重新掛載。

    命令:

    mount -o remount,rw -t yaffs2 /dev/block/platform/msm_sdcc.1/by-name/system /system

    這里的 /dev/block/platform/msm_sdcc.1/by-name/system 就是我們從上一步的輸出里得到的文件路徑。

如果輸出沒有提示錯(cuò)誤的話,操作就成功了,可以對(duì) /system 下的文件為所欲為了。

查看連接過的 WiFi 密碼

注:需要 root 權(quán)限。

命令:

adb shell
su
cat /data/misc/wifi/*.conf

輸出示例:

network={
	ssid="TP-LINK_9DFC"
	scan_ssid=1
	psk="123456789"
	key_mgmt=WPA-PSK
	group=CCMP TKIP
	auth_alg=OPEN
	sim_num=1
	priority=13893
}

network={
	ssid="TP-LINK_F11E"
	psk="987654321"
	key_mgmt=WPA-PSK
	sim_num=1
	priority=17293
}

ssid 即為我們在 WLAN 設(shè)置里看到的名稱,psk 為密碼,key_mgmt 為安全加密方式。

設(shè)置系統(tǒng)日期和時(shí)間

注:需要 root 權(quán)限。

命令:

adb shell
su
date -s 20160823.131500

表示將系統(tǒng)日期和時(shí)間更改為 2016 年 08 月 23 日 13 點(diǎn) 15 分 00 秒。

重啟手機(jī)

命令:

adb reboot

檢測設(shè)備是否已 root

命令:

adb shell
su

此時(shí)命令行提示符是 $ 則表示沒有 root 權(quán)限,是 # 則表示已 root。

使用 Monkey 進(jìn)行壓力測試

Monkey 可以生成偽隨機(jī)用戶事件來模擬單擊、觸摸、手勢等操作,可以對(duì)正在開發(fā)中的程序進(jìn)行隨機(jī)壓力測試。

簡單用法:

adb shell monkey -p <packagename> -v 500

表示向 <packagename> 指定的應(yīng)用程序發(fā)送 500 個(gè)偽隨機(jī)事件。

Monkey 的詳細(xì)用法參考 官方文檔

開啟/關(guān)閉 WiFi

注:需要 root 權(quán)限。

有時(shí)需要控制設(shè)備的 WiFi 狀態(tài),可以用以下指令完成。

開啟 WiFi:

adb root
adb shell svc wifi enable

關(guān)閉 WiFi:

adb root
adb shell svc wifi disable

若執(zhí)行成功,輸出為空;若未取得 root 權(quán)限執(zhí)行此命令,將執(zhí)行失敗,輸出 Killed。

刷機(jī)相關(guān)命令

重啟到 Recovery 模式

命令:

adb reboot recovery

從 Recovery 重啟到 Android

命令:

adb reboot

重啟到 Fastboot 模式

命令:

adb reboot bootloader

通過 sideload 更新系統(tǒng)

如果我們下載了 Android 設(shè)備對(duì)應(yīng)的系統(tǒng)更新包到電腦上,那么也可以通過 adb 來完成更新。

以 Recovery 模式下更新為例:

  1. 重啟到 Recovery 模式。

    命令:

    adb reboot recovery
  2. 在設(shè)備的 Recovery 界面上操作進(jìn)入 Apply update-Apply from ADB。

    注:不同的 Recovery 菜單可能與此有差異,有的是一級(jí)菜單就有 Apply update from ADB。

  3. 通過 adb 上傳和更新系統(tǒng)。

    命令:

    adb sideload <path-to-update.zip>

安全相關(guān)命令

啟用/禁用 SELinux

啟用 SELinux

adb root
adb shell setenforce 1

禁用 SELinux

adb root
adb shell setenforce 0

啟用/禁用 dm_verity

啟用 dm_verity

adb root
adb enable-verity

禁用 dm_verity

adb root
adb disable-verity

更多 adb shell 命令

Android 系統(tǒng)是基于 Linux 內(nèi)核的,所以 Linux 里的很多命令在 Android 里也有相同或類似的實(shí)現(xiàn),在 adb shell 里可以調(diào)用。本文檔前面的部分內(nèi)容已經(jīng)用到了 adb shell 命令。

查看進(jìn)程

命令:

adb shell ps

輸出示例:

USER     PID   PPID  VSIZE  RSS     WCHAN    PC        NAME
root      1     0     8904   788   ffffffff 00000000 S /init
root      2     0     0      0     ffffffff 00000000 S kthreadd
...
u0_a71    7779  5926  1538748 48896 ffffffff 00000000 S com.sohu.inputmethod.sogou:classic
u0_a58    7963  5926  1561916 59568 ffffffff 00000000 S org.mazhuang.boottimemeasure
...
shell     8750  217   10640  740   00000000 b6f28340 R ps

各列含義:

列名 含義
USER 所屬用戶
PID 進(jìn)程 ID
PPID 父進(jìn)程 ID
NAME 進(jìn)程名

查看實(shí)時(shí)資源占用情況

命令:

adb shell top

輸出示例:

User 0%, System 6%, IOW 0%, IRQ 0%
User 3 + Nice 0 + Sys 21 + Idle 280 + IOW 0 + IRQ 0 + SIRQ 3 = 307

  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
 8763  0   3% R     1  10640K   1064K  fg shell    top
  131  0   3% S     1      0K      0K  fg root     dhd_dpc
 6144  0   0% S   115 1682004K 115916K  fg system   system_server
  132  0   0% S     1      0K      0K  fg root     dhd_rxf
 1731  0   0% S     6  20288K    788K  fg root     /system/bin/mpdecision
  217  0   0% S     6  18008K    356K  fg shell    /sbin/adbd
 ...
 7779  2   0% S    19 1538748K  48896K  bg u0_a71   com.sohu.inputmethod.sogou:classic
 7963  0   0% S    18 1561916K  59568K  fg u0_a58   org.mazhuang.boottimemeasure
 ...

各列含義:

列名 含義
PID 進(jìn)程 ID
PR 優(yōu)先級(jí)
CPU% 當(dāng)前瞬間占用 CPU 百分比
S 進(jìn)程狀態(tài)(R=運(yùn)行,S=睡眠,T=跟蹤/停止,Z=僵尸進(jìn)程)
#THR 線程數(shù)
VSS Virtual Set Size 虛擬耗用內(nèi)存(包含共享庫占用的內(nèi)存)
RSS Resident Set Size 實(shí)際使用物理內(nèi)存(包含共享庫占用的內(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      顯示幫助文檔

查看進(jìn)程 UID

有兩種方案:

  1. adb shell dumpsys package <packagename> | grep userId=

    如:

    $ adb shell dumpsys package org.mazhuang.guanggoo | grep userId=
       userId=10394
  2. 通過 ps 命令找到對(duì)應(yīng)進(jìn)程的 pid 之后 adb shell cat /proc/<pid>/status | grep Uid

    如:

    $ adb shell
    gemini:/ $ ps | grep org.mazhuang.guanggoo
    u0_a394   28635 770   1795812 78736 SyS_epoll_ 0000000000 S org.mazhuang.guanggoo
    gemini:/ $ cat /proc/28635/status | grep Uid
    Uid:    10394   10394   10394   10394
    gemini:/ $

其它

如下是其它常用命令的簡單描述,前文已經(jīng)專門講過的命令不再額外說明:

命令 功能
cat 顯示文件內(nèi)容
cd 切換目錄
chmod 改變文件的存取模式/訪問權(quán)限
df 查看磁盤空間使用情況
grep 過濾輸出
kill 殺死指定 PID 的進(jìn)程
ls 列舉目錄內(nèi)容
mount 掛載目錄的查看和管理
mv 移動(dòng)或重命名文件
ps 查看正在運(yùn)行的進(jìn)程
rm 刪除文件
top 查看進(jìn)程的資源占用情況

常見問題

啟動(dòng) adb server 失敗

出錯(cuò)提示

error: protocol fault (couldn't read status): No error

可能原因

adb server 進(jìn)程想使用的 5037 端口被占用。

解決方案

找到占用 5037 端口的進(jìn)程,然后終止它。以 Windows 下為例:

netstat -ano | findstr LISTENING

...
TCP    0.0.0.0:5037           0.0.0.0:0              LISTENING       1548
...

這里 1548 即為進(jìn)程 ID,用命令結(jié)束該進(jìn)程:

taskkill /PID 1548

然后再啟動(dòng) adb 就沒問題了。

com.android.ddmlib.AdbCommandRejectedException

在 Android Studio 里新建一個(gè)模擬器,但是用 adb 一直連接不上,提示:

com.android.ddmlib.AdbCommandRejectedException: device unauthorized.
This adb server's $ADB_VENDOR_KEYS is not set
Try 'adb kill-server' if that seems wrong.
Otherwise check for a confirmation dialog on your device.

在手機(jī)上安裝一個(gè)終端然后執(zhí)行 su 提示沒有該命令,這不正常。

于是刪除該模擬器后重新下載安裝一次,這次就正常了。

XXXXXXXXXX

查看版本

ADB 的安裝這里就不多說了,輸入以下命令有如下提示就證明你環(huán)境ok,否則自行網(wǎng)上搜索解決下。

$ adb version

Android Debug Bridge version 1.0.36
Revision 8f855a3d9b35-android

查看連接設(shè)備

輸入以下命令可以查詢已連接的設(shè)備與模擬器:

$ adb devices

List of devices attached
02ae0c1021089daf       device

安裝一個(gè)apk,執(zhí)行以下命令:

adb install <apkfile>

// 如: adb install demo.apk
如果不是當(dāng)前目錄,則后面要跟路徑名:

adb install /Users/storm/temp/demo.apk
保留數(shù)據(jù)和緩存文件,重新安裝apk:

adb install -r demo.apk
安裝apk到sd卡:

adb install -s demo.apk
卸載

直接卸載:

adb uninstall <package>

// 如:adb uninstall com.stormzhang.demo
卸載 app 但保留數(shù)據(jù)和緩存文件:

adb uninstall -k com.stormzhang.demo

啟動(dòng)/停止 Server

一般來說,下面兩個(gè)命令基本不會(huì)用到,因?yàn)橹灰O(shè)備連接正確,會(huì)自動(dòng)啟動(dòng) adb server 的,不過大家也需要知道這倆命令:

啟動(dòng) adb server :

adb start-server

停止 adb server :

adb kill-server

列出手機(jī)裝的所有app的包名:

adb shell pm list packages

列出系統(tǒng)應(yīng)用的所有包名:

adb shell pm list packages -s

列出除了系統(tǒng)應(yīng)用的第三方應(yīng)用包名:

adb shell pm list packages -3

使用 grep 來過濾:

adb shell pm list packages | grep qq

清除應(yīng)用數(shù)據(jù)與緩存

有些時(shí)候我們測試需要清除數(shù)據(jù)與緩存,則需要用到如下命令:

adb shell pm clear <packagename>

// 如:adb shell pm clear com.stormzhang.demo

啟動(dòng)應(yīng)用

如果我們想要通過 adb 來啟動(dòng)應(yīng)用
adb shell am start -n com.stormzhang.demo/.ui.SplashActivity

強(qiáng)制停止應(yīng)用

有些時(shí)候應(yīng)用卡死了,需要強(qiáng)制停止,則執(zhí)行以下命令:

adb shell am force-stop <packagename>

// 如:adb shell am force-stop cn.androidstar.demo

查看日志

adb logcat

重啟

adb reboot

獲取序列號(hào)

$adb get-serialno

02ae0c1021089daf

獲取 MAC 地址

$adb shell  cat /sys/class/net/wlan0/address

bc:f5:ac:f9:f7:c8

查看設(shè)備型號(hào)

$adb shell getprop ro.product.model

Nexus 5

查看 Android 系統(tǒng)版本

$adb shell getprop ro.build.version.release

7.0.1

查看屏幕分辨率

$adb shell wm size

Physical size: 1080×1920

查看屏幕密度

$adb shell wm density

Physical density: 480
關(guān)于 ADB 的命令有太多,以上只列了一些我比較常用的命令,關(guān)于更多的命令可以見這里:

https://github.com/mzlogin/awesome-adb

ADB IDEA
以上命令你們覺得是不是很方便了?但是我們在用 Android Studio 開發(fā)的時(shí)候如果有一款插件是不是更方便了?所以這里推薦一個(gè) AS 插件 ADB IDEA ,裝了這款插件可以直接在 AS 中快速操作一些 ADB 命令,非常方便。

安裝完成后,快捷鍵直接喚起:

Mac OSX: Ctrl+Shift+A
Windows/Linux: Ctrl+Alt+Shift+A

adb 的非官方實(shí)現(xiàn)

  • fb-adb - A better shell for Android devices (for Mac).

致謝

感謝朋友們無私的分享與補(bǔ)充(排名不分先后)。

zxninglinhua55,codeskyblue,seasonyuufan123199,zhEdward,0x8BADFOOD,keith666666shawnlinboy。

參考鏈接

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多

    国产一级内射麻豆91| 欧美精品在线观看国产| 成人精品一级特黄大片| 91偷拍裸体一区二区三区| 伊人国产精选免费观看在线视频 | 国产日韩欧美综合视频| 久久99这里只精品热在线| 亚洲最新一区二区三区| 狠狠干狠狠操在线播放| 国产欧美日韩视频91| 欧美亚洲国产日韩一区二区| 国产一区二区三区午夜精品| 日韩精品区欧美在线一区| 国产精品午夜福利免费在线| 国产精品内射婷婷一级二级| 成年男女午夜久久久精品| 欧美午夜性刺激在线观看| 黄色美女日本的美女日人| 国产原创中文av在线播放| 黄色国产精品一区二区三区| 精品国产成人av一区二区三区| 高清在线精品一区二区| 午夜福利视频偷拍91| 色综合伊人天天综合网中文| 国产精品日韩精品一区| 九九热精品视频在线观看| 久久精品国产熟女精品| 免费在线成人午夜视频| 麻豆一区二区三区精品视频| 91亚洲国产成人久久| 欧美一级特黄特色大色大片| 精品熟女少妇一区二区三区| 亚洲精品熟女国产多毛| 欧美日韩成人在线一区| 亚洲视频一区二区久久久| 美国黑人一级黄色大片| 国产日韩在线一二三区| 国产人妻精品区一区二区三区| 成人午夜激情在线免费观看| 日韩av生活片一区二区三区| 最近的中文字幕一区二区|