轉(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有什么作用署浩?
ADB
是 Android 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 需要以下步驟:
- 確認(rèn)硬件狀態(tài)正常(包括 Android 設(shè)備處于正常開機(jī)狀態(tài)断医,USB 連接線和各種接口完好)。
- Android 設(shè)備的開發(fā)者選項(xiàng)和 USB 調(diào)試模式已開啟(可以在「設(shè)置」-「開發(fā)者選項(xiàng)」-「USB調(diào)試」打開USB調(diào)試)奏纪。
- 確認(rèn)設(shè)備驅(qū)動(dòng)狀態(tài)正常(安裝ADB驅(qū)動(dòng)程序)孩锡。
- 通過(guò) USB 線連接好電腦和設(shè)備后確認(rèn)狀態(tài)。
- 通過(guò)
adb devices
命令查看設(shè)備連接情況亥贸。
4.2.2 WLAN 連接(需要 USB 線)
借助 USB 通過(guò) WiFi 連接來(lái)正常使用 adb 需要以下步驟: 操作步驟:
- 將 Android 設(shè)備與要運(yùn)行 adb 的電腦連接到同一個(gè) WiFi躬窜。
- 將設(shè)備與電腦通過(guò) USB 線連接(可通過(guò)
adb devices
命令查看設(shè)備連接情況)。 - 通過(guò)
adb tcpip 5555
命令讓設(shè)備在 5555 端口監(jiān)聽 TCP/IP 連接炕置。 - 斷開 USB 連接荣挨。
- 找到設(shè)備的 IP 地址(可以在「設(shè)置」-「關(guān)于手機(jī)」-「狀態(tài)信息」-「IP地址」查看 IP 地址)。
- 通過(guò)
adb connect <device-ip-address>
命令使用 IP 地址將 Android 設(shè)備與電腦連接朴摊。 - 通過(guò)
adb devices
命令查看設(shè)備連接情況默垄。 - 使用完畢后可通過(guò)
adb disconnect <device-ip-address>
命令斷開無(wú)線連接。
4.2.3 WLAN 連接(無(wú)需借助 USB 線)
注:需要 root 權(quán)限甚纲。 不借助 USB 通過(guò) WiFi 連接來(lái)正常使用 adb 需要以下步驟:
- 在 Android 設(shè)備上安裝一個(gè)終端模擬器(可通過(guò)Terminal Emulator for Android Downloads下載)庇配。
- 將 Android 設(shè)備與要運(yùn)行 adb 的電腦連接到同一個(gè) WiFi。
- 打開 Android 設(shè)備上的終端模擬器唬格,在里面依次運(yùn)行命令:
su
setprop service.adb.tcp.port 5555
復(fù)制代碼
- 找到設(shè)備的 IP 地址(可以在「設(shè)置」-「關(guān)于手機(jī)」-「狀態(tài)信息」-「IP地址」查看 IP 地址)龙誊。
- 通過(guò)
adb connect <device-ip-address>
命令使用 IP 地址將 Android 設(shè)備與電腦連接。 - 通過(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)用,再安裝 |
adb install
實(shí)際是分三步完成:
- push apk 文件到 /data/local/tmp羊初。
- 調(diào)用 pm install 安裝滨溉。
- 刪除 /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.package1
和 com.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 模式下更新為例:
- 重啟到 Recovery 模式。
adb reboot recovery
復(fù)制代碼
在設(shè)備的 Recovery 界面上操作進(jìn)入
Apply update
-Apply from ADB
膛檀。 注:不同的 Recovery 菜單可能與此有差異锰镀,有的是一級(jí)菜單就有Apply update from ADB
。通過(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
有兩種方案:
-
adb shell dumpsys package <packagename> | grep userId=
如:
adb shell dumpsys package org.mazhuang.guanggoo | grep userId=
userId=10394
復(fù)制代碼
-
通過(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ù)制代碼