ADB 非常全的操作命令

轉(zhuǎn)自:https://juejin.im/post/5b5683bcf265da0f9b4dea96

ADB 操作命令詳解及用法大全

一骆撇、ADB是什么柒巫?

ADB调鬓,即 Android Debug Bridge 是一種允許模擬器或已連接的 Android 設(shè)備進(jìn)行通信的命令行工具房匆,它可為各種設(shè)備操作提供便利,如安裝和調(diào)試應(yīng)用叛拷,并提供對(duì) Unix shell(可用來(lái)在模擬器或連接的設(shè)備上運(yùn)行各種命令)的訪問(wèn)舌厨。可以在Android SDK/platform-tools中找到 adb 工具或下載 ADB Kits 忿薇。

注: 有部分命令的支持情況可能與 Android 系統(tǒng)版本及定制 ROM 的實(shí)現(xiàn)有關(guān)裙椭。

二、ADB有什么作用署浩?

ADBAndroid SDK 里的一個(gè)工具, 用這個(gè)工具可以直接操作管理Android模擬器或者真實(shí)的Android設(shè)備揉燃。它的主要功能有:

  • 在設(shè)備上運(yùn)行Shell命令;
  • 將本地APK軟件安裝至模擬器或Android設(shè)備瑰抵;
  • 管理設(shè)備或手機(jī)模擬器上的預(yù)定端口你雌;
  • 在設(shè)備或手機(jī)模擬器上復(fù)制或粘貼文件器联。

ADB 是一個(gè)客戶端-服務(wù)器程序程序二汛,包括三個(gè)組件:

  • 客戶端:該組件發(fā)送命令〔ν兀客戶端在開發(fā)計(jì)算機(jī)上運(yùn)行肴颊。您可以通過(guò)發(fā)出 adb 命令從命令行終端調(diào)用客戶端。
  • 后臺(tái)程序:該組件在設(shè)備上運(yùn)行命令渣磷。后臺(tái)程序在每個(gè)模擬器或設(shè)備實(shí)例上作為后臺(tái)進(jìn)程運(yùn)行婿着。
  • 服務(wù)器:該組件管理客戶端和后臺(tái)程序之間的通信。服務(wù)器在開發(fā)計(jì)算機(jī)上作為后臺(tái)進(jìn)程運(yùn)行醋界。

三竟宋、ADB命令語(yǔ)法

adb 命令的基本語(yǔ)法如下:

adb [-d|-e|-s <serial-number>] <command>
復(fù)制代碼

單一設(shè)備/模擬器連接

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

多個(gè)設(shè)備/模擬器連接

如果有多個(gè)設(shè)備/模擬器連接,則需要為命令指定目標(biāo)設(shè)備逐样,下表是指定目標(biāo)設(shè)備的命令選項(xiàng):

參數(shù) 含義
-d 指定當(dāng)前唯一通過(guò) USB 連接的 Android 設(shè)備為命令目標(biāo)
-e 指定當(dāng)前唯一運(yùn)行的模擬器為命令目標(biāo)
-s <serial-number> 指定相應(yīng)設(shè)備序列號(hào)的設(shè)備/模擬器為命令目標(biāo)

在多個(gè)設(shè)備/模擬器連接的情況下較常用的是 -s <serial-number> 參數(shù)蜗字,serial-number是指設(shè)備的設(shè)備序列號(hào)打肝,可以通過(guò) adb devices 命令獲取。

四挪捕、ADB常用命令

4.1 基本命令

4.1.1 查看adb的版本信息

adb version
復(fù)制代碼

4.1.2 啟動(dòng)adb

adb start-server
復(fù)制代碼

一般無(wú)需手動(dòng)執(zhí)行此命令粗梭,在運(yùn)行 adb 命令時(shí)若發(fā)現(xiàn) adb server 沒(méi)有啟動(dòng)會(huì)自動(dòng)調(diào)起。

4.1.3 停止adb

adb kill-server
復(fù)制代碼

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

adb root
復(fù)制代碼

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

adb -P <port> start-server
復(fù)制代碼

ADB的默認(rèn)端口為 5037级零。

4.1.5 查詢已連接的設(shè)備/模擬器列表

adb devices
復(fù)制代碼

4.2 設(shè)備連接管理

4.2.1 USB 連接

通過(guò) USB 連接來(lái)正常使用 adb 需要以下步驟:

  1. 確認(rèn)硬件狀態(tài)正常(包括 Android 設(shè)備處于正常開機(jī)狀態(tài)断医,USB 連接線和各種接口完好)。
  2. Android 設(shè)備的開發(fā)者選項(xiàng)和 USB 調(diào)試模式已開啟(可以在「設(shè)置」-「開發(fā)者選項(xiàng)」-「USB調(diào)試」打開USB調(diào)試)奏纪。
  3. 確認(rèn)設(shè)備驅(qū)動(dòng)狀態(tài)正常(安裝ADB驅(qū)動(dòng)程序)孩锡。
  4. 通過(guò) USB 線連接好電腦和設(shè)備后確認(rèn)狀態(tài)。
  5. 通過(guò) adb devices 命令查看設(shè)備連接情況亥贸。

4.2.2 WLAN 連接(需要 USB 線)

借助 USB 通過(guò) WiFi 連接來(lái)正常使用 adb 需要以下步驟: 操作步驟:

  1. 將 Android 設(shè)備與要運(yùn)行 adb 的電腦連接到同一個(gè) WiFi躬窜。
  2. 將設(shè)備與電腦通過(guò) USB 線連接(可通過(guò) adb devices 命令查看設(shè)備連接情況)。
  3. 通過(guò) adb tcpip 5555 命令讓設(shè)備在 5555 端口監(jiān)聽 TCP/IP 連接炕置。
  4. 斷開 USB 連接荣挨。
  5. 找到設(shè)備的 IP 地址(可以在「設(shè)置」-「關(guān)于手機(jī)」-「狀態(tài)信息」-「IP地址」查看 IP 地址)。
  6. 通過(guò) adb connect <device-ip-address> 命令使用 IP 地址將 Android 設(shè)備與電腦連接朴摊。
  7. 通過(guò) adb devices 命令查看設(shè)備連接情況默垄。
  8. 使用完畢后可通過(guò) adb disconnect <device-ip-address> 命令斷開無(wú)線連接。

4.2.3 WLAN 連接(無(wú)需借助 USB 線)

注:需要 root 權(quán)限甚纲。 不借助 USB 通過(guò) WiFi 連接來(lái)正常使用 adb 需要以下步驟:

  1. 在 Android 設(shè)備上安裝一個(gè)終端模擬器(可通過(guò)Terminal Emulator for Android Downloads下載)庇配。
  2. 將 Android 設(shè)備與要運(yùn)行 adb 的電腦連接到同一個(gè) WiFi。
  3. 打開 Android 設(shè)備上的終端模擬器唬格,在里面依次運(yùn)行命令:
su
setprop service.adb.tcp.port 5555
復(fù)制代碼
  1. 找到設(shè)備的 IP 地址(可以在「設(shè)置」-「關(guān)于手機(jī)」-「狀態(tài)信息」-「IP地址」查看 IP 地址)龙誊。
  2. 通過(guò) adb connect <device-ip-address> 命令使用 IP 地址將 Android 設(shè)備與電腦連接。
  3. 通過(guò) adb devices 命令查看設(shè)備連接情況春哨。

4.2.4 WiFi 連接轉(zhuǎn)為 USB 連接

通過(guò)adb usb命令以USB模式重新啟動(dòng)ADB:

adb usb
復(fù)制代碼

4.3 應(yīng)用管理

4.3.1 查看應(yīng)用列表

查看應(yīng)用列表的基本命令格式是:

adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
復(fù)制代碼

adb shell pm list packages 后面可以跟一些可選參數(shù)進(jìn)行過(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)用
<filter> 包名包含 <filter> 字符串
4.3.1.1 查看所有應(yīng)用
adb shell pm list packages
復(fù)制代碼
4.3.1.2 查看系統(tǒng)應(yīng)用
adb shell pm list packages -s
復(fù)制代碼
4.3.1.3 查看第三方應(yīng)用
adb shell pm list packages -3
復(fù)制代碼
4.3.1.4 包名包含某字符串的應(yīng)用

比如要查看包名包含字符串 huawei 的應(yīng)用列表,命令:

adb shell pm list packages huawei
復(fù)制代碼

4.3.2 安裝應(yīng)用

安裝應(yīng)用的基本命令格式是:

adb install [-l] [-r] [-t] [-s] [-d] [-g] <apk-file>
復(fù)制代碼

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)行命令后可以看到輸出內(nèi)容椰拒,包含安裝進(jìn)度和狀態(tài),安裝狀態(tài)如下:

  • Success:代表安裝成功凰荚。
  • Failure:代表安裝失敗燃观。 APK 安裝失敗的情況有很多,Failure狀態(tài)之后有安裝失敗輸出代碼便瑟。常見安裝失敗輸出代碼缆毁、含義及可能的解決辦法如下:
輸出代碼 含義 解決辦法
INSTALL_FAILED_ALREADY_EXISTS 應(yīng)用已經(jīng)存在,或卸載了但沒(méi)卸載干凈 adb install 時(shí)使用 -r 參數(shù)胳徽,或者先 adb uninstall <packagename> 再安裝
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 以前安裝過(guò)同名應(yīng)用积锅,但卸載時(shí)數(shù)據(jù)沒(méi)有移除爽彤;或者已安裝該應(yīng)用,但簽名不一致 adb uninstall <packagename> 再安裝
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 1. sdcard 訪問(wèn)失敗;
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 以前安裝過(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è)備不兼容
INSTALL_FAILED_TEST_ONLY APK 文件是使用 Android Studio 直接 RUN 編譯出來(lái)的文件 通過(guò) Gradle 的 assembleDebug 或 assembleRelease 重新編譯敌完,或者 Generate Signed APK
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è)備已斷開連接 先將設(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 實(shí)際是分三步完成:

  1. push apk 文件到 /data/local/tmp羊初。
  2. 調(diào)用 pm install 安裝滨溉。
  3. 刪除 /data/local/tmp 下的對(duì)應(yīng) apk 文件。

4.3.3 卸載應(yīng)用

卸載應(yīng)用的基本命令格式是:

adb uninstall [-k] <package-name>
復(fù)制代碼

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

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

adb shell pm clear <package-name>
復(fù)制代碼

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

4.3.5 查看前臺(tái) Activity

adb shell dumpsys activity activities | grep mFocusedActivity
復(fù)制代碼

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

adb shell dumpsys activity services [<package-name>]
復(fù)制代碼

<package-name> 參數(shù)不是必須的,指定 <package-name> 表示查看與某個(gè)包名相關(guān)的 Services柳恐,不指定表示查看所有 Services。<package-name> 不一定要給出完整的包名热幔,可以只給一部分乐设,那么所給包名相關(guān)的 Services 都會(huì)列出來(lái)。

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

adb shell dumpsys package <package-name>
復(fù)制代碼

<package-name> 表示應(yīng)用包名绎巨。運(yùn)行次命令的輸出中包含很多信息近尚,包括 Activity Resolver Table、Registered ContentProviders场勤、包名戈锻、userId歼跟、安裝后的文件資源代碼等路徑、版本信息格遭、權(quán)限信息和授予狀態(tài)哈街、簽名版本信息等。

4.3.7 查看應(yīng)用安裝路徑

adb shell pm path <package-name>
復(fù)制代碼

4.4 與應(yīng)用交互

與應(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 <package-name> 停止 <package-name> 相關(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

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

參數(shù) 含義
--esn <extra-key> null 值(只有 key 名)
`-e --es <extra-key> <extra-string-value>` string 值
--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ù)組

4.4.1 啟動(dòng)應(yīng)用/ 調(diào)起 Activity

adb shell am start [options] <intent>
復(fù)制代碼

例如:

adb shell am start -a android.settings.SETTINGS                   # 打開系統(tǒng)設(shè)置頁(yè)面
adb shell am start -a android.intent.action.DIAL -d tel:10086     # 打開撥號(hào)頁(yè)面
adb shell am start -n com.android.mms/.ui.ConversationList        # 打開短信會(huì)話列表
復(fù)制代碼

options 是一些改變其行為的選項(xiàng)胞得,支持的可選參數(shù)及含義如下:

選項(xiàng) 含義
-D 啟用調(diào)試
-W 等待啟動(dòng)完成
--start-profiler file 啟動(dòng)分析器并將結(jié)果發(fā)送到 file
-P file 類似于 --start-profiler,但當(dāng)應(yīng)用進(jìn)入空閑狀態(tài)時(shí)分析停止
-R count 重復(fù) Activity 啟動(dòng)次數(shù)
-S 啟動(dòng) Activity 前強(qiáng)行停止目標(biāo)應(yīng)用
--opengl-trace 啟用 OpenGL 函數(shù)的跟蹤
--user user_id current 指定要作為哪個(gè)用戶運(yùn)行屹电;如果未指定懒震,則作為當(dāng)前用戶運(yùn)行

4.4.2 調(diào)起 Service

adb shell am startservice [options] <intent>
復(fù)制代碼

一個(gè)典型的用例是如果設(shè)備上原本應(yīng)該顯示虛擬按鍵但是沒(méi)有顯示,可以試試這個(gè):

adb shell am startservice -n com.android.systemui/.SystemUIService
復(fù)制代碼

4.4.3 停止 Service

adb shell am stopservice [options] <intent>
復(fù)制代碼

4.4.4 發(fā)送廣播

adb shell am broadcast [options] <INTENT>
復(fù)制代碼

可以向所有組件廣播嗤详,也可以只向指定組件廣播个扰。

例如,向所有組件廣播 BOOT_COMPLETED

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
復(fù)制代碼

又例如葱色,只向 com.android.receiver.test/.BootCompletedReceiver 廣播 BOOT_COMPLETED

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.android.receiver.test/.BootCompletedReceiver
復(fù)制代碼

這類用法在測(cè)試的時(shí)候很實(shí)用递宅,比如某個(gè)廣播的場(chǎng)景很難制造,可以考慮通過(guò)這種方式來(lái)發(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ǔ)空間過(guò)低
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ā))

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

adb shell am force-stop <packagename>
復(fù)制代碼

4.4.6 收緊內(nèi)存

adb shell am send-trim-memory  <pid> <level>
復(fù)制代碼

參數(shù)說(shuō)明:

  • pid: 進(jìn)程 ID
  • level:HIDDEN俐填、RUNNING_MODERATE、BACKGROUND翔忽、RUNNING_LOW英融、MODERATE、RUNNING_CRITICAL歇式、COMPLETE

4.5 文件管理

4.5.1 從模擬器/設(shè)備下載指定的文件到計(jì)算機(jī)

從模擬器/設(shè)備下載指定的文件到計(jì)算機(jī)的基本命令格式是:

adb pull <remote> [local]
復(fù)制代碼

參數(shù)說(shuō)明:

  • remote: 模擬器/設(shè)備里的文件路徑
  • local:計(jì)算機(jī)上的目錄驶悟,參數(shù)可以省略,默認(rèn)復(fù)制到當(dāng)前目錄

例如材失,將 /sdcard/music.mp4 下載到計(jì)算機(jī)的當(dāng)前目錄:

adb pull /sdcard/music.mp4
復(fù)制代碼

將 /sdcard/music.mp4 下載到計(jì)算機(jī)的當(dāng)前目錄(目錄需存在):

adb pull /sdcard/music.mp4 D:\Download
復(fù)制代碼

4.5.2 將指定的文件從計(jì)算機(jī)上傳到模擬器/設(shè)備

將指定的文件從計(jì)算機(jī)上傳到模擬器/設(shè)備的基本命令格式是:

adb push <local> <remote>
復(fù)制代碼

參數(shù)說(shuō)明:

  • local:計(jì)算機(jī)上的文件路徑
  • remote: 模擬器/設(shè)備里的目錄

例如痕鳍,將 D:\Download\music.mp4 下載到設(shè)備的/sdcard/music/目錄:

adb push D:\Download\music.mp4 /sdcard/music/
復(fù)制代碼

4.5.4 列出指定目錄的內(nèi)容

列出模擬器/設(shè)備上指定目錄的內(nèi)容的基本命令格式是:

adb shell ls [options] <directory>
復(fù)制代碼

<directory> 表示指定目錄,可以省略,表示列出根目錄下的所有文件和目錄笼呆。 adb shell ls 后面可以跟一些可選參數(shù)進(jìn)行過(guò)濾查看不同的列表熊响,可用參數(shù)及含義如下:

參數(shù) 顯示列表
無(wú) 列出目錄下的所有文件和目錄
-a 列出目錄下的所有文件(包括隱藏的)
-i 列出目錄下的所有文件和索引編號(hào)
-s 列出目錄下的所有文件和文件大小
-n 列出目錄下的所有文件及其 UID和 GID
-R 列出目錄下的所有子目錄中的文件

4.5.5 切換到目標(biāo)目錄

adb shell cd <directory>
復(fù)制代碼

第一步:執(zhí)行adb shell命令; 第二步:執(zhí)行cd <directory>命令切換到目標(biāo)目錄诗赌。

4.5.6 刪除文件或目錄

adb shell rm [options] <files or directory>
復(fù)制代碼

第一步:執(zhí)行adb shell命令汗茄; 第二步:執(zhí)行rm [options] <files or directory>命令刪除文件或目錄。

rm 后面可以跟一些可選參數(shù)進(jìn)行不同的操作境肾,可用參數(shù)及含義如下:

參數(shù) 含義
無(wú) 刪除文件
-f 強(qiáng)制刪除文件剔难,系統(tǒng)不提示
-r 強(qiáng)制刪除指定目錄中的所有文件和子目錄
-d 刪除指定目錄,即使它是一個(gè)非空目錄
-i 交互式刪除奥喻,刪除前提示

rm -d 等同于 rmdir 命令偶宫,有些版本不包含-d 參數(shù)。

4.5.7 創(chuàng)建目錄

adb shell mkdir [options] <directory-name>
復(fù)制代碼

第一步:執(zhí)行adb shell命令环鲤; 第二步:執(zhí)行mkdir [options] <directory-name>命令創(chuàng)建目錄纯趋。 mkdir 后面可以跟一些可選參數(shù)進(jìn)行不同的操作,可用參數(shù)及含義如下:

參數(shù) 含義
無(wú) 創(chuàng)建指定目錄
-m 創(chuàng)建指定目錄并賦予讀寫權(quán)限
-p 創(chuàng)建指定目錄及其父目錄

4.5.8 創(chuàng)建空文件或改變文件時(shí)間戳

adb shell touch [options] <file>
復(fù)制代碼

第一步:執(zhí)行adb shell命令冷离; 第二步:執(zhí)行touch [options] <file>命令創(chuàng)建空文件或改變文件時(shí)間戳吵冒。

可通過(guò)ls -n <directory> 命令查看文件的時(shí)間。

4.5.9 輸出當(dāng)前目錄路徑

adb shell pwd
復(fù)制代碼

第一步:執(zhí)行adb shell命令西剥; 第二步:執(zhí)行pwd命令輸出當(dāng)前目錄路徑痹栖。

4.5.10 復(fù)制文件和目錄

adb shell cp [options] <source> <dest>
復(fù)制代碼

第一步:執(zhí)行adb shell命令; 第二步:執(zhí)行cp [options] <source> <dest>命令復(fù)制文件和目錄瞭空。 參數(shù)說(shuō)明:

  • source:源文件路徑
  • dest: 目標(biāo)文件路徑

4.5.11 移動(dòng)或重命名文件

adb shell mv [options] <source> <dest>
復(fù)制代碼

第一步:執(zhí)行adb shell命令揪阿; 第二步:執(zhí)行mv [options] <source> <dest>命令移動(dòng)或重命名文件。 參數(shù)說(shuō)明:

  • source:源文件路徑
  • dest: 目標(biāo)文件路徑

4.6 網(wǎng)絡(luò)管理

4.6.1 查看網(wǎng)絡(luò)統(tǒng)計(jì)信息

adb shell netstat
復(fù)制代碼

也可以將網(wǎng)絡(luò)統(tǒng)計(jì)信息輸出到指定文件:

adb shell netstat><file-path>
復(fù)制代碼

例如咆畏,可以通過(guò) adb shell netstat>D:\netstat.log 將日志輸出到 D:\netstat.log 中南捂。

4.6.2 測(cè)試兩個(gè)網(wǎng)絡(luò)間的連接和延遲

ping 命令的格式如下:

adb shell ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
[-w deadline] [-W timeout] [hop1 ...] destination
復(fù)制代碼

例如,ping一個(gè)域名:

adb shell ping www.google.com
復(fù)制代碼

不結(jié)束的話會(huì)一直ping下去旧找,可以按 Ctrl + C 停止ping操作溺健。

也可以指定ping的次數(shù):

adb shell ping -c 4 www.google.com
復(fù)制代碼

4.6.3 通過(guò)配置文件配置和管理網(wǎng)絡(luò)連接

netcfg 命令的格式如下:

adb shell netcfg [<interface> {dhcp|up|down}]
復(fù)制代碼

輸出示例:

rmnet_ims10 DOWN                                   0.0.0.0/0   0x00001002
rmnet_ims00 DOWN                                   0.0.0.0/0   0x00001002
rmnet_tun04 DOWN                                   0.0.0.0/0   0x00001002
rmnet_tun03 DOWN                                   0.0.0.0/0   0x00001002
rmnet_tun02 DOWN                                   0.0.0.0/0   0x00001002
rmnet_tun01 DOWN                                   0.0.0.0/0   0x00001002
rmnet_tun00 DOWN                                   0.0.0.0/0   0x00001002
rmnet_tun14 DOWN                                   0.0.0.0/0   0x00001002
rmnet_tun13 DOWN                                   0.0.0.0/0   0x00001002
rmnet_tun12 DOWN                                   0.0.0.0/0   0x00001002
rmnet_tun11 DOWN                                   0.0.0.0/0   0x00001002
rmnet_tun10 DOWN                                   0.0.0.0/0   0x00001002
rmnet1   DOWN                                   0.0.0.0/0   0x00001002
rmnet0   DOWN                                   0.0.0.0/0   0x00001002
rmnet4   DOWN                                   0.0.0.0/0   0x00001002
rmnet3   DOWN                                   0.0.0.0/0   0x00001002
rmnet2   DOWN                                   0.0.0.0/0   0x00001002
rmnet6   DOWN                                   0.0.0.0/0   0x00001002
rmnet5   DOWN                                   0.0.0.0/0   0x00001002
dummy0   UP                                     0.0.0.0/0   0x000000c3
rmnet_r_ims10 DOWN                                   0.0.0.0/0   0x00001002
rmnet_r_ims00 DOWN                                   0.0.0.0/0   0x00001002
rmnet_emc0 DOWN                                   0.0.0.0/0   0x00001002
lo       UP                                   127.0.0.1/8   0x00000049
sit0     DOWN                                   0.0.0.0/0   0x00000080
wlan0    UP                                 10.0.38.176/23  0x00001043
復(fù)制代碼

4.6.4 顯示、操作路由钮蛛、設(shè)備鞭缭、策略路由和隧道

ip 命令的格式如下:

adb shell ip [ options ] object
復(fù)制代碼
  • options := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |-f[amily] { inet | inet6 | ipx | dnet | link } |-l[oops] { maximum-addr-flush-attempts } |-o[neline] | -t[imestamp] | -b[atch] [filename] |-rc[vbuf] [size]}

  • object := { link | addr | addrlabel | route | rule | neigh | ntable |tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm |netns | l2tp }

options 是一些修改ip行為或者改變其輸出的選項(xiàng)。所有的選項(xiàng)都是以-字符開頭愿卒,分為長(zhǎng)缚去、短兩種形式,支持的可選參數(shù)及含義如下:

選項(xiàng) 含義
-V,-Version 打印ip的版本并退出
-s,-stats,-statistics 輸出更為詳盡的信息(如果這個(gè)選項(xiàng)出現(xiàn)兩次或者多次琼开,輸出的信息將更為詳盡)
-f,-family 強(qiáng)調(diào)使用的協(xié)議種類(包括:inet、inet6或者link)
-4 是-family inet的簡(jiǎn)寫
-6 是-family inet6的簡(jiǎn)寫
-0 是-family link的簡(jiǎn)寫
-o,-oneline 對(duì)每行記錄都使用單行輸出枕荞,回行用字符代替
-r,-resolve 查詢域名解析系統(tǒng)柜候,用獲得的主機(jī)名代替主機(jī)IP地址

object 是你要管理或者獲取信息的對(duì)象搞动。目前ip認(rèn)識(shí)的對(duì)象包括:

參數(shù) 顯示列表
link 網(wǎng)絡(luò)設(shè)備
address 一個(gè)設(shè)備的協(xié)議(IP或者IPV6)地址
neighbour ARP或者NDISC緩沖區(qū)條目
route 路由表?xiàng)l目
rule 路由策略數(shù)據(jù)庫(kù)中的規(guī)則
maddress 多播地址
mroute 多播路由緩沖區(qū)條目
tuntap 管理 TUN/TAP 設(shè)備
netns 管理網(wǎng)絡(luò)空間

例如,查看 WiFi IP 地址:

adb shell ip -f inet addr show wlan0
復(fù)制代碼

4.7 模擬按鍵/輸入

adb shell 里有個(gè)很實(shí)用的命令叫 input渣刷,通過(guò)它可以做一些有趣的事情鹦肿。 可以執(zhí)行adb shell input命令查看完整 help 信息如下:

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

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

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)
      draganddrop <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
      press (Default: trackball)
      roll <dx> <dy> (Default: trackball)
復(fù)制代碼

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

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 打開音樂(lè)
210 打開計(jì)算器
220 降低屏幕亮度
221 提高屏幕亮度
223 系統(tǒng)休眠
224 點(diǎn)亮屏幕
231 打開語(yǔ)音助手
276 如果沒(méi)有 wakelock 則讓系統(tǒng)休眠

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

4.7.1 電源鍵

adb shell input keyevent 26
復(fù)制代碼

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

4.7.2 菜單鍵

adb shell input keyevent 82
復(fù)制代碼

4.7.3 HOME 鍵

adb shell input keyevent 3
復(fù)制代碼

4.7.4 返回鍵

adb shell input keyevent 4
復(fù)制代碼

4.7.5 音量控制

  • 增加音量:
adb shell input keyevent 24
復(fù)制代碼
  • 降低音量:
adb shell input keyevent 25
復(fù)制代碼
  • 靜音:
adb shell input keyevent 164
復(fù)制代碼

4.7.6 媒體控制

  • 播放/暫停:
adb shell input keyevent 85
復(fù)制代碼
  • 停止播放:
adb shell input keyevent 86
復(fù)制代碼
  • 播放下一首:
adb shell input keyevent 87
復(fù)制代碼
  • 播放上一首:
adb shell input keyevent 88
復(fù)制代碼
  • 恢復(fù)播放:
adb shell input keyevent 126
復(fù)制代碼
  • 暫停播放:
adb shell input keyevent 127
復(fù)制代碼

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

  • 點(diǎn)亮屏幕:
adb shell input keyevent 224
復(fù)制代碼
  • 熄滅屏幕:
adb shell input keyevent 223
復(fù)制代碼

4.7.8 滑動(dòng)解鎖

如果鎖屏沒(méi)有密碼涣旨,是通過(guò)滑動(dòng)手勢(shì)解鎖,那么可以通過(guò) input swipe 來(lái)解鎖股冗。 命令(參數(shù)以機(jī)型 Nexus 5霹陡,向上滑動(dòng)手勢(shì)解鎖舉例):

adb shell input swipe 300 1000 300 500
復(fù)制代碼

參數(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)

4.7.9 輸入文本

在焦點(diǎn)處于某文本框時(shí)止状,可以通過(guò) input 命令來(lái)輸入文本烹棉。

adb shell input text hello
復(fù)制代碼

4.8 日志打印

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

4.8.1 Android 日志

查看 Android 設(shè)備系統(tǒng)屬性的基本命令格式是:

adb logcat [option] [filter-specs]
復(fù)制代碼

如果需要停止 logcat 日志打印,可以按 Ctrl + C 停止日志監(jiān)控集峦。

4.8.1.1 按級(jí)別過(guò)濾日志

按級(jí)別過(guò)濾日志的基本命令格式是:

adb logcat [filter-specs]
復(fù)制代碼

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

級(jí)別 含義
*:V 過(guò)濾只顯示 Verbose 及以上級(jí)別(優(yōu)先級(jí)最低)
*:D 過(guò)濾只顯示 Debug 及以上級(jí)別
*:I 過(guò)濾只顯示 Info 及以上級(jí)別
*:W 過(guò)濾只顯示 Warning 及以上級(jí)別
*:E 過(guò)濾只顯示 Error 及以上級(jí)別
*:F 過(guò)濾只顯示 Fatal 及以上級(jí)別
*:S 過(guò)濾只顯示 Silent 及以上級(jí)別(優(yōu)先級(jí)最高伏社,什么也不輸出)

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

比如少梁,命令:

adb logcat *:W
復(fù)制代碼

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

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

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

按 tag 和級(jí)別過(guò)濾日志的基本命令格式是:

adb logcat [tag:level] [tag:level] ...
復(fù)制代碼

比如挺举,命令:

adb logcat ActivityManager:I MyApp:D *:S
復(fù)制代碼

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

4.8.1.3 將日志格式化輸出

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

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

參數(shù) 顯示格式
brief <priority>/<tag>(<pid>): <message>
process <priority>(<pid>) <message>
tag <priority>/<tag>: <message>
raw <message>
time <datetime> <priority>/<tag>(<pid>): <message>
threadtime <datetime> <pid> <tid> <priority> <tag>: <message>
long [ <datetime> <pid>:<tid> <priority>/<tag> ] <message>

日志格式默認(rèn)為 brief滤淳,指定格式可與上面的過(guò)濾同時(shí)使用梧喷。比如:

adb logcat -v long ActivityManager:I *:S
復(fù)制代碼
4.8.1.3 清空已存在的日志
adb logcat -c
復(fù)制代碼
4.8.1.4 將日志顯示在控制臺(tái)
adb logcat -d
復(fù)制代碼
4.8.1.5 將日志輸出到文件
adb logcat -f <file-path>
復(fù)制代碼
4.8.1.6 加載一個(gè)可使用的日志緩沖區(qū)供查看
adb logcat -b <Buffer>
復(fù)制代碼

Android log 輸出量巨大,特別是通信系統(tǒng)的log,因此铺敌,Android把log輸出到不同的緩沖區(qū)中汇歹,目前定義了四個(gè)log緩沖區(qū):

緩沖區(qū) 含義
Radio 輸出通信系統(tǒng)的 log
System 輸出系統(tǒng)組件的 log
Event 輸出 event 模塊的 log
Main 所有 java 層的 log 以及不屬于上面3層的 log

緩沖區(qū)主要給系統(tǒng)組件使用,一般的應(yīng)用不需要關(guān)心偿凭,應(yīng)用的log都輸出到main緩沖區(qū)中产弹。默認(rèn)log輸出(不指定緩沖區(qū)的情況下)是輸出System和Main緩沖區(qū)的log。

4.8.1.7 打印指定日志緩沖區(qū)的大小
adb logcat -g
復(fù)制代碼

4.8.2 內(nèi)核日志

adb shell dmesg
復(fù)制代碼

輸出示例:

<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.
復(fù)制代碼

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

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

4.9 查看 Android 設(shè)備系統(tǒng)屬性

查看 Android 設(shè)備系統(tǒng)屬性的基本命令格式是:

adb shell getprop [options]
復(fù)制代碼

除了可以查看 Android 設(shè)備系統(tǒng)屬性之外,還可以設(shè)置系統(tǒng)屬性奄毡,設(shè)置系統(tǒng)屬性的基本命令格式是:

adb shell setprop <key> <value>
復(fù)制代碼

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

adb shell getprop ro.product.model
復(fù)制代碼

輸出示例:

Nexus 5
復(fù)制代碼

4.9.2 查看設(shè)備電池狀況

adb shell dumpsys battery
復(fù)制代碼

輸出示例:

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
復(fù)制代碼

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

4.9.3 查看設(shè)備屏幕分辨率

adb shell wm size
復(fù)制代碼

輸出示例:

Physical size: 1080x1920
復(fù)制代碼

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

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

Physical size: 1080x1920
Override size: 480x1024
復(fù)制代碼

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

4.9.4 查看設(shè)備屏幕密度

adb shell wm density
復(fù)制代碼

輸出示例:

Physical density: 420
復(fù)制代碼

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

如果使用命令修改過(guò)趟佃,那輸出可能是:

Physical density: 480
Override density: 160
復(fù)制代碼

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

4.9.5 查看設(shè)備顯示屏參數(shù)

adb shell dumpsys window displays
復(fù)制代碼

輸出示例:

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

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

4.9.6 查看設(shè)備 android_id

adb shell settings get secure android_id
復(fù)制代碼

輸出示例:

51b6be48bac8c569
復(fù)制代碼

4.9.7 查看設(shè)備IMEI

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

adb shell dumpsys iphonesubinfo
復(fù)制代碼

輸出示例:

Phone Subscriber Info:
  Phone Type = GSM
  Device ID = 860955027785041
復(fù)制代碼

其中的 Device ID 就是 IMEI。

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

adb shell
su
service call iphonesubinfo 1
復(fù)制代碼

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

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

4.9.8 查看設(shè)備 Android 系統(tǒng)版本

adb shell getprop ro.build.version.release
復(fù)制代碼

輸出示例:

5.0.2
復(fù)制代碼

4.9.9 查看設(shè)備 IP 地址

adb shell ifconfig | grep Mask
復(fù)制代碼

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

adb shell ifconfig wlan0
復(fù)制代碼

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

adb shell netcfg
復(fù)制代碼

4.9.10 查看設(shè)備 Mac 地址

adb shell cat /sys/class/net/wlan0/address
復(fù)制代碼

輸出示例:

f8:a9:d0:17:42:4d
復(fù)制代碼

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

4.9.11 查看設(shè)備 CPU 信息

adb shell cat /proc/cpuinfo
復(fù)制代碼

4.9.12 查看設(shè)備內(nèi)存信息

adb shell cat /proc/meminfo
復(fù)制代碼

4.9.13 查看設(shè)備更多硬件與系統(tǒng)屬性

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

adb shell cat /system/build.prop
復(fù)制代碼

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

輸出里還包括一些其它有用的信息蝎宇,它們也可通過(guò) 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 可能修改過(guò) CPU 支持的 abi 列表的屬性名祷安,如果用 ro.product.cpu.abilist 屬性名查找不到姥芥,可以這樣試試:

adb shell cat /system/build.prop | grep ro.product.cpu.abi
復(fù)制代碼

示例輸出:

ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi
復(fù)制代碼

4.10 修改設(shè)置

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

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

4.10.1 修改分辨率

adb shell wm size 480x1024
復(fù)制代碼

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

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

adb shell wm size reset
復(fù)制代碼

4.10.2 修改屏幕密度

adb shell wm density 160
復(fù)制代碼

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

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

adb shell wm density reset
復(fù)制代碼

4.10.3 修改顯示區(qū)域

adb shell wm overscan 0,0,0,200
復(fù)制代碼

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

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

adb shell wm overscan reset
復(fù)制代碼

4.10.4 修改關(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)試」的榛。

4.10.5 修改允許/禁止訪問(wèn)非 SDK API

允許訪問(wèn)非 SDK API:

adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1
復(fù)制代碼

禁止訪問(wèn)非 SDK API:

adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps
復(fù)制代碼

不需要設(shè)備獲得 Root 權(quán)限。

命令最后的數(shù)字的含義:

含義
0 禁止檢測(cè)非 SDK 接口的調(diào)用逻锐。該情況下夫晌,日志記錄功能被禁用,并且令 strict mode API昧诱,即 detectNonSdkApiUsage() 無(wú)效晓淀。不推薦。
1 僅警告——允許訪問(wèn)所有非 SDK 接口盏档,但保留日志中的警告信息凶掰,可繼續(xù)使用 strick mode API。
2 禁止調(diào)用深灰名單和黑名單中的接口妆丘。
3 禁止調(diào)用黑名單中的接口锄俄,但允許調(diào)用深灰名單中的接口。

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

adb shell settings put global policy_control <key-values>
復(fù)制代碼

<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)用
* 所有界面
package-name 指定應(yīng)用
-package-name 排除指定應(yīng)用

例如:

adb shell settings put global policy_control immersive.full=*
復(fù)制代碼

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

adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3
復(fù)制代碼

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

4.11 實(shí)用功能

4.11.1 屏幕截圖

截圖保存到電腦:

adb exec-out screencap -p > sc.png
復(fù)制代碼

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

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

adb shell screencap -p /sdcard/sc.png
復(fù)制代碼

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

adb pull /sdcard/sc.png
復(fù)制代碼

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

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

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

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

adb shell screencap -p | sed "s/\r$//" > sc.png
復(fù)制代碼

Mac OS X

adb shell screencap -p | gsed "s/\r$//" > sc.png
復(fù)制代碼

這個(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
復(fù)制代碼

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

brew install gnu-sed
復(fù)制代碼

4.11.2 錄制屏幕

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

adb shell screenrecord /sdcard/filename.mp4
復(fù)制代碼

需要停止時(shí)按 <kbd style="font-family: monospace, monospace; font-size: 1em;">Ctrl-C</kbd>装诡,默認(rèn)錄制時(shí)間和最長(zhǎng)錄制時(shí)間都是 180 秒银受。

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

adb pull /sdcard/filename.mp4
復(fù)制代碼

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

參數(shù) 含義
--size WIDTHxHEIGHT 視頻的尺寸鸦采,比如 1280x720宾巍,默認(rèn)是屏幕分辨率。
--bit-rate RATE 視頻的比特率赖淤,默認(rèn)是 4Mbps蜀漆。
--time-limit TIME 錄制時(shí)長(zhǎng),單位秒咱旱。
--verbose 輸出更多信息确丢。

4.11.3 查看連接過(guò)的 WiFi 密碼

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

adb shell
su
cat /data/misc/wifi/*.conf
復(fù)制代碼

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

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

adb shell
su
date -s 20160823.131500
復(fù)制代碼

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

4.11.5 重啟手機(jī)

adb reboot
復(fù)制代碼

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

adb shell
su
復(fù)制代碼

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

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

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

簡(jiǎn)單用法:

adb shell monkey -p <packagename> -v 500
復(fù)制代碼

表示向 <packagename> 指定的應(yīng)用程序發(fā)送 500 個(gè)偽隨機(jī)事件。 Monkey 的詳細(xì)用法參考 官方文檔肌蜻。

4.11.8 開啟/關(guān)閉 WiFi

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

  • 開啟 WiFi:
adb root
adb shell svc wifi enable
復(fù)制代碼
  • 關(guān)閉 WiFi:
adb root
adb shell svc wifi disable
復(fù)制代碼

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

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

4.12.1 重啟到 Recovery 模式

adb reboot recovery
復(fù)制代碼

4.12.2 從 Recovery 重啟到 Android

adb reboot
復(fù)制代碼

4.12.2 重啟到 Fastboot 模式

adb reboot bootloader
復(fù)制代碼

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

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

以 Recovery 模式下更新為例:

  1. 重啟到 Recovery 模式。
adb reboot recovery
復(fù)制代碼
  1. 在設(shè)備的 Recovery 界面上操作進(jìn)入 Apply update-Apply from ADB膛檀。 注:不同的 Recovery 菜單可能與此有差異锰镀,有的是一級(jí)菜單就有 Apply update from ADB

  2. 通過(guò) adb 上傳和更新系統(tǒng)宿刮。

adb sideload <path-to-update.zip>
復(fù)制代碼

4.13 安全相關(guān)命令

4.13.1 啟用/禁用 SELinux

啟用 SELinux

adb root
adb shell setenforce 1
復(fù)制代碼

禁用 SELinux

adb root
adb shell setenforce 0
復(fù)制代碼

4.13.2 啟用/禁用 dm_verity

啟用 dm_verity

adb root
adb enable-verity
復(fù)制代碼

禁用 dm_verity

adb root
adb disable-verity
復(fù)制代碼

4.14 更多 adb shell 命令

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

4.14.1 查看進(jìn)程狀態(tài)

adb shell ps
復(fù)制代碼

輸出信息各列含義:

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

4.14.2 查看處理器實(shí)時(shí)狀態(tài)

adb shell top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h]
復(fù)制代碼

adb shell top 后面可以跟一些可選參數(shù)進(jìn)行過(guò)濾查看不同的列表踩叭,可用參數(shù)及含義如下:

參數(shù) 含義
-m 最多顯示多少個(gè)進(jìn)程
-n 刷新多少次后退出
-d 刷新時(shí)間間隔(單位秒磕潮,默認(rèn)值5)
-s 按某列排序(可用col值:cpu, vss, rss, thr)
-t 顯示線程信息
-h 顯示幫助文檔

輸出信息各列含義:

列名 含義
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)存(包含共享庫(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)程名

4.14.3 查看進(jìn)程 UID

有兩種方案:

  1. adb shell dumpsys package <packagename> | grep userId= 如:
 adb shell dumpsys package org.mazhuang.guanggoo | grep userId=
  userId=10394
復(fù)制代碼
  1. 通過(guò) 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:/ $
    復(fù)制代碼
    

五斤富、致謝

  1. ADB Shell
  2. Awesome Adb
  3. Android Debug Bridge
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膏潮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子满力,更是在濱河造成了極大的恐慌焕参,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件油额,死亡現(xiàn)場(chǎng)離奇詭異叠纷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)潦嘶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門涩嚣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人掂僵,你說(shuō)我怎么就攤上這事航厚。” “怎么了锰蓬?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵幔睬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我互妓,道長(zhǎng)溪窒,這世上最難降的妖魔是什么坤塞? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮澈蚌,結(jié)果婚禮上摹芙,老公的妹妹穿的比我還像新娘。我一直安慰自己宛瞄,他們只是感情好浮禾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著份汗,像睡著了一般盈电。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杯活,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天匆帚,我揣著相機(jī)與錄音,去河邊找鬼旁钧。 笑死吸重,一個(gè)胖子當(dāng)著我的面吹牛戒财,可吹牛的內(nèi)容都是我干的噪裕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼洗贰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼寄猩!你這毒婦竟也來(lái)了嫉晶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤田篇,失蹤者是張志新(化名)和其女友劉穎替废,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斯辰,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舶担,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彬呻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衣陶。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖闸氮,靈堂內(nèi)的尸體忽然破棺而出剪况,到底是詐尸還是另有隱情,我是刑警寧澤蒲跨,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布译断,位于F島的核電站,受9級(jí)特大地震影響或悲,放射性物質(zhì)發(fā)生泄漏孙咪。R本人自食惡果不足惜堪唐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翎蹈。 院中可真熱鬧淮菠,春花似錦、人聲如沸荤堪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)澄阳。三九已至拥知,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碎赢,已是汗流浹背低剔。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揩抡,地道東北人户侥。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像峦嗤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屋摔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354