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

							<div class="article-copyright">
				版權聲明:本文爲博主原創文章,未經博主允許不得轉載。					https://blog.csdn.net/lb245557472/article/details/84068519				</div>
							            <div class="markdown_views prism-dracula">
						<!-- flowchart 箭頭圖標 勿刪 -->
						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<p></p><div class="toc"><h3><a name="t0"></a>ADB 操作命令詳解及用法大全</h3><ul><li><a href="#ADB_1" rel="nofollow" target="_self">一、ADB是什麼?</a></li><li><a href="#ADB_4" rel="nofollow" target="_self">二、ADB有什麼作用?</a></li><li><a href="#ADB_17" rel="nofollow" target="_self">三、ADB命令語法</a></li><ul><ul><ul><ul><li><a href="#_22" rel="nofollow" target="_self">單一設備/模擬器連接</a></li><li><a href="#_24" rel="nofollow" target="_self">多個設備/模擬器連接</a></li></ul></ul></ul></ul><li><a href="#ADB_32" rel="nofollow" target="_self">四、ADB常用命令</a></li><ul><li><a href="#41__33" rel="nofollow" target="_self">4.1 基本命令</a></li><ul><li><a href="#411_adb_34" rel="nofollow" target="_self">4.1.1 查看adb的版本信息</a></li><li><a href="#412_adb_38" rel="nofollow" target="_self">4.1.2 啓動adb</a></li><li><a href="#413_adb_43" rel="nofollow" target="_self">4.1.3 停止adb</a></li><li><a href="#414__root__adbd_47" rel="nofollow" target="_self">4.1.4 以 root 權限運行 adbd</a></li><li><a href="#415__adb_server__51" rel="nofollow" target="_self">4.1.5 指定 adb server 的網絡端口</a></li><li><a href="#415__56" rel="nofollow" target="_self">4.1.5 查詢已連接的設備/模擬器列表</a></li></ul><li><a href="#42__60" rel="nofollow" target="_self">4.2 設備連接管理</a></li><ul><li><a href="#421_USB__61" rel="nofollow" target="_self">4.2.1 USB 連接</a></li><li><a href="#422_WLAN__USB__70" rel="nofollow" target="_self">4.2.2 WLAN 連接(需要 USB 線)</a></li><li><a href="#423_WLAN__USB__83" rel="nofollow" target="_self">4.2.3 WLAN 連接(無需藉助 USB 線)</a></li><li><a href="#424_WiFi__USB__97" rel="nofollow" target="_self">4.2.4 WiFi 連接轉爲 USB 連接</a></li></ul><li><a href="#43__102" rel="nofollow" target="_self">4.3 應用管理</a></li><ul><li><a href="#431__103" rel="nofollow" target="_self">4.3.1 查看應用列表</a></li><li><a href="#4311__126" rel="nofollow" target="_self">4.3.1.1 查看所有應用</a></li><li><a href="#4312__130" rel="nofollow" target="_self">4.3.1.2 查看系統應用</a></li><li><a href="#4313__134" rel="nofollow" target="_self">4.3.1.3 查看第三方應用</a></li><li><a href="#4314__138" rel="nofollow" target="_self">4.3.1.4 包名包含某字符串的應用</a></li><li><a href="#432__143" rel="nofollow" target="_self">4.3.2 安裝應用</a></li><li><a href="#433__234" rel="nofollow" target="_self">4.3.3 卸載應用</a></li><li><a href="#434__240" rel="nofollow" target="_self">4.3.4 清除應用數據與緩存</a></li><li><a href="#435__Activity_245" rel="nofollow" target="_self">4.3.5 查看前臺 Activity</a></li><li><a href="#436__Services_249" rel="nofollow" target="_self">4.3.6 查看正在運行的 Services</a></li><li><a href="#437__254" rel="nofollow" target="_self">4.3.7 查看應用詳細信息</a></li><li><a href="#437__259" rel="nofollow" target="_self">4.3.7 查看應用安裝路徑</a></li></ul><li><a href="#44__263" rel="nofollow" target="_self">4.4 與應用交互</a></li><ul><li><a href="#441___Activity_309" rel="nofollow" target="_self">4.4.1 啓動應用/ 調起 Activity</a></li><li><a href="#442__Service_336" rel="nofollow" target="_self">4.4.2 調起 Service</a></li><li><a href="#443__Service_344" rel="nofollow" target="_self">4.4.3 停止 Service</a></li><li><a href="#444__348" rel="nofollow" target="_self">4.4.4 發送廣播</a></li><li><a href="#445__394" rel="nofollow" target="_self">4.4.5 強制停止應用</a></li><li><a href="#446__398" rel="nofollow" target="_self">4.4.6 收緊內存</a></li></ul><li><a href="#45__407" rel="nofollow" target="_self">4.5 文件管理</a></li><ul><li><a href="#451__408" rel="nofollow" target="_self">4.5.1 從模擬器/設備下載指定的文件到計算機</a></li><li><a href="#452__426" rel="nofollow" target="_self">4.5.2 將指定的文件從計算機上傳到模擬器/設備</a></li><li><a href="#454__440" rel="nofollow" target="_self">4.5.4 列出指定目錄的內容</a></li><li><a href="#455__461" rel="nofollow" target="_self">4.5.5 切換到目標目錄</a></li><li><a href="#456__467" rel="nofollow" target="_self">4.5.6 刪除文件或目錄</a></li><li><a href="#457__488" rel="nofollow" target="_self">4.5.7 創建目錄</a></li><li><a href="#458__506" rel="nofollow" target="_self">4.5.8 創建空文件或改變文件時間戳</a></li><li><a href="#459__513" rel="nofollow" target="_self">4.5.9 輸出當前目錄路徑</a></li><li><a href="#4510__519" rel="nofollow" target="_self">4.5.10 複製文件和目錄</a></li><li><a href="#4511__530" rel="nofollow" target="_self">4.5.11 移動或重命名文件</a></li></ul><li><a href="#46__541" rel="nofollow" target="_self">4.6 網絡管理</a></li><ul><li><a href="#461__542" rel="nofollow" target="_self">4.6.1 查看網絡統計信息</a></li><li><a href="#462__551" rel="nofollow" target="_self">4.6.2 測試兩個網絡間的連接和延遲</a></li><li><a href="#463__568" rel="nofollow" target="_self">4.6.3 通過配置文件配置和管理網絡連接</a></li><li><a href="#464__602" rel="nofollow" target="_self">4.6.4 顯示、操作路由、設備、策略路由和隧道</a></li></ul><li><a href="#47__656" rel="nofollow" target="_self">4.7 模擬按鍵/輸入</a></li><ul><li><a href="#471__725" rel="nofollow" target="_self">4.7.1 電源鍵</a></li><li><a href="#472__730" rel="nofollow" target="_self">4.7.2 菜單鍵</a></li><li><a href="#473_HOME__734" rel="nofollow" target="_self">4.7.3 HOME 鍵</a></li><li><a href="#474__738" rel="nofollow" target="_self">4.7.4 返回鍵</a></li><li><a href="#475__742" rel="nofollow" target="_self">4.7.5 音量控制</a></li><li><a href="#476__756" rel="nofollow" target="_self">4.7.6 媒體控制</a></li><li><a href="#477__782" rel="nofollow" target="_self">4.7.7 點亮/熄滅屏幕</a></li><li><a href="#478__792" rel="nofollow" target="_self">4.7.8 滑動解鎖</a></li><li><a href="#479__799" rel="nofollow" target="_self">4.7.9 輸入文本</a></li><li><a href="#48__804" rel="nofollow" target="_self">4.8 日誌打印</a></li><li><a href="#481_Android__806" rel="nofollow" target="_self">4.8.1 Android 日誌</a></li><li><a href="#4811__812" rel="nofollow" target="_self">4.8.1.1 按級別過濾日誌</a></li><li><a href="#4812__tag__840" rel="nofollow" target="_self">4.8.1.2 按 tag 和級別過濾日誌</a></li><li><a href="#4813__850" rel="nofollow" target="_self">4.8.1.3 將日誌格式化輸出</a></li><li><a href="#4813__872" rel="nofollow" target="_self">4.8.1.3 清空已存在的日誌</a></li><li><a href="#4814__876" rel="nofollow" target="_self">4.8.1.4 將日誌顯示在控制檯</a></li><li><a href="#4815__880" rel="nofollow" target="_self">4.8.1.5 將日誌輸出到文件</a></li><li><a href="#4816__884" rel="nofollow" target="_self">4.8.1.6 加載一個可使用的日誌緩衝區供查看</a></li><li><a href="#4817__902" rel="nofollow" target="_self">4.8.1.7 打印指定日誌緩衝區的大小</a></li><li><a href="#482__906" rel="nofollow" target="_self">4.8.2 內核日誌</a></li><li><a href="#49__Android__922" rel="nofollow" target="_self">4.9 查看 Android 設備系統屬性</a></li><li><a href="#491__931" rel="nofollow" target="_self">4.9.1 查看設備型號</a></li><li><a href="#492__939" rel="nofollow" target="_self">4.9.2 查看設備電池狀況</a></li><li><a href="#493__959" rel="nofollow" target="_self">4.9.3 查看設備屏幕分辨率</a></li><li><a href="#494__973" rel="nofollow" target="_self">4.9.4 查看設備屏幕密度</a></li><li><a href="#495__988" rel="nofollow" target="_self">4.9.5 查看設備顯示屏參數</a></li><li><a href="#496__android_id_1000" rel="nofollow" target="_self">4.9.6 查看設備 android_id</a></li><li><a href="#497_IMEI_1008" rel="nofollow" target="_self">4.9.7 查看設備IMEI</a></li><li><a href="#498__Android__1028" rel="nofollow" target="_self">4.9.8 查看設備 Android 系統版本</a></li><li><a href="#499__IP__1036" rel="nofollow" target="_self">4.9.9 查看設備 IP 地址</a></li><li><a href="#4910__Mac__1048" rel="nofollow" target="_self">4.9.10 查看設備 Mac 地址</a></li><li><a href="#4911__CPU__1057" rel="nofollow" target="_self">4.9.11 查看設備 CPU 信息</a></li><li><a href="#4912__1061" rel="nofollow" target="_self">4.9.12 查看設備內存信息</a></li></ul><li><a href="#4913__1065" rel="nofollow" target="_self">4.9.13 查看設備更多硬件與系統屬性</a></li><ul><li><a href="#410__1101" rel="nofollow" target="_self">4.10 修改設置</a></li><li><a href="#4101__1104" rel="nofollow" target="_self">4.10.1 修改分辨率</a></li><li><a href="#4102__1113" rel="nofollow" target="_self">4.10.2 修改屏幕密度</a></li><li><a href="#4103__1122" rel="nofollow" target="_self">4.10.3 修改顯示區域</a></li><li><a href="#4104__USB__1131" rel="nofollow" target="_self">4.10.4 修改關閉 USB 調試模式</a></li><li><a href="#4105__SDK_API_1137" rel="nofollow" target="_self">4.10.5 修改允許/禁止訪問非 SDK API</a></li><li><a href="#4106__1162" rel="nofollow" target="_self">4.10.6 修改狀態欄和導航欄的顯示隱藏</a></li></ul><li><a href="#411__1201" rel="nofollow" target="_self">4.11 實用功能</a></li><ul><li><a href="#4111__1202" rel="nofollow" target="_self">4.11.1 屏幕截圖</a></li><li><a href="#4112__1246" rel="nofollow" target="_self">4.11.2 錄製屏幕</a></li><li><a href="#4113__WiFi__1269" rel="nofollow" target="_self">4.11.3 查看連接過的 WiFi 密碼</a></li><li><a href="#4114__1276" rel="nofollow" target="_self">4.11.4 設置系統日期和時間</a></li><li><a href="#4115__1284" rel="nofollow" target="_self">4.11.5 重啓手機</a></li><li><a href="#4116__root_1288" rel="nofollow" target="_self">4.11.6 檢測設備是否已 root</a></li><li><a href="#4117__Monkey__1294" rel="nofollow" target="_self">4.11.7 使用 Monkey 進行壓力測試</a></li><li><a href="#4118__WiFi_1302" rel="nofollow" target="_self">4.11.8 開啓/關閉 WiFi</a></li></ul><li><a href="#412__1315" rel="nofollow" target="_self">4.12 刷機相關命令</a></li><ul><li><a href="#4121__Recovery__1316" rel="nofollow" target="_self">4.12.1 重啓到 Recovery 模式</a></li><li><a href="#4122__Recovery__Android_1320" rel="nofollow" target="_self">4.12.2 從 Recovery 重啓到 Android</a></li><li><a href="#4123__Fastboot__1324" rel="nofollow" target="_self">4.12.3 重啓到 Fastboot 模式</a></li><li><a href="#4124__sideload__1328" rel="nofollow" target="_self">4.12.4 通過 sideload 更新系統</a></li></ul><li><a href="#413__1341" rel="nofollow" target="_self">4.13 安全相關命令</a></li><ul><li><a href="#4131__SELinux_1342" rel="nofollow" target="_self">4.13.1 啓用/禁用 SELinux</a></li><li><a href="#4132__dm_verity_1353" rel="nofollow" target="_self">4.13.2 啓用/禁用 dm_verity</a></li><li><a href="#414__adb_shell__1364" rel="nofollow" target="_self">4.14 更多 adb shell 命令</a></li><li><a href="#4141__1366" rel="nofollow" target="_self">4.14.1 查看進程狀態</a></li><li><a href="#4142__1375" rel="nofollow" target="_self">4.14.2 查看處理器實時狀態</a></li><li><a href="#4143__UID_1402" rel="nofollow" target="_self">4.14.3 查看進程 UID</a></li></ul></ul><li><a href="#_1419" rel="nofollow" target="_self">五、參考</a></li></ul></div><p></p>

一、ADB是什麼?

ADB,即 Android Debug Bridge 是一種允許模擬器或已連接的 Android 設備進行通信的命令行工具,它可爲各種設備操作提供便利,如安裝和調試應用,並提供對 Unix shell(可用來在模擬器或連接的設備上運行各種命令)的訪問。可以在Android SDK/platform-tools中找到 adb 工具或下載 ADB Kits

二、ADB有什麼作用?

ADB 是 Android SDK 裏的一個工具, 用這個工具可以直接操作管理Android模擬器或者真實的Android設備。它的主要功能有:

  • 在設備上運行Shell命令; 將本地APK軟件安裝至模擬器或Android設備;
  • 管理設備或手機模擬器上的預定端口;
  • 在設備或手機模擬器上覆制或粘貼文件。

ADB 是一個客戶端-服務器程序程序,包括三個組件:

  • 客戶端:該組件發送命令。客戶端在開發計算機上運行。您可以通過發出 adb 命令從命令行終端調用客戶端。
  • 後臺程序:該組件在設備上運行命令。後臺程序在每個模擬器或設備實例上作爲後臺進程運行。
  • 服務器:該組件管理客戶端和後臺程序之間的通信。服務器在開發計算機上作爲後臺進程運行。

三、ADB命令語法

adb 命令的基本語法如下:

adb [-d|-e|-s <serial-number>] <command>
  • 1
單一設備/模擬器連接

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

多個設備/模擬器連接

如果有多個設備/模擬器連接,則需要爲命令指定目標設備,下表是指定目標設備的命令選項:

參數 含義
-d 指定當前唯一通過 USB 連接的 Android 設備爲命令目標
-e 指定當前唯一運行的模擬器爲命令目標
-s <serial-number> 指定相應設備序列號的設備/模擬器爲命令目標

在多個設備/模擬器連接的情況下較常用的是 -s <serial-number> 參數,serial-number是指設備的設備序列號,可以通過 adb devices 命令獲取。

四、ADB常用命令

4.1 基本命令

4.1.1 查看adb的版本信息

adb version
  • 1

4.1.2 啓動adb

adb start-server
  • 1

一般無需手動執行此命令,在運行 adb 命令時若發現 adb server 沒有啓動會自動調起。

4.1.3 停止adb

adb kill-server
  • 1

4.1.4 以 root 權限運行 adbd

adb root
  • 1

4.1.5 指定 adb server 的網絡端口

adb -P <port> start-server
  • 1

ADB的默認端口爲 5037。

4.1.5 查詢已連接的設備/模擬器列表

adb devices
  • 1

4.2 設備連接管理

4.2.1 USB 連接

通過 USB 連接來正常使用 adb 需要以下步驟:

  1. 確認硬件狀態正常(包括 Android 設備處於正常開機狀態,USB 連接線和各種接口完好)。
  2. Android 設備的開發者選項和 USB 調試模式已開啓(可以在「設置」-「開發者選項」-「USB調試」打開USB調試)。
  3. 確認設備驅動狀態正常(安裝ADB驅動程序)。
  4. 通過 USB 線連接好電腦和設備後確認狀態。
  5. 通過 adb devices 命令查看設備連接情況。

4.2.2 WLAN 連接(需要 USB 線)

藉助 USB 通過 WiFi 連接來正常使用 adb 需要以下步驟:
操作步驟:

  1. 將 Android 設備與要運行 adb 的電腦連接到同一個 WiFi。
  2. 將設備與電腦通過 USB 線連接(可通過 adb devices 命令查看設備連接情況)。
  3. 通過 adb tcpip 5555 命令讓設備在 5555 端口監聽 TCP/IP 連接。
  4. 斷開 USB 連接。
  5. 找到設備的 IP 地址(可以在「設置」-「關於手機」-「狀態信息」-「IP地址」查看 IP 地址)。
  6. 通過 adb connect <device-ip-address> 命令使用 IP 地址將 Android 設備與電腦連接。
  7. 通過 adb devices 命令查看設備連接情況。
  8. 使用完畢後可通過 adb disconnect <device-ip-address> 命令斷開無線連接。

4.2.3 WLAN 連接(無需藉助 USB 線)

注:需要 root 權限。不借助 USB 通過 WiFi 連接來正常使用 adb 需要以下步驟:

  1. 在 Android 設備上安裝一個終端模擬器(可通過Terminal Emulator for Android Downloads下載)。

  2. 將 Android 設備與要運行 adb 的電腦連接到同一個 WiFi。

  3. 打開 Android 設備上的終端模擬器,在裏面依次運行命令:

    su
    setprop service.adb.tcp.port 5555

  4. 找到設備的 IP 地址(可以在「設置」-「關於手機」-「狀態信息」-「IP地址」查看 IP 地址)。

  5. 通過 adb connect <device-ip-address> 命令使用 IP 地址將 Android 設備與電腦連接。

  6. 通過 adb devices 命令查看設備連接情況。

4.2.4 WiFi 連接轉爲 USB 連接

通過adb usb命令以USB模式重新啓動ADB:

adb usb
  • 1

4.3 應用管理

4.3.1 查看應用列表

查看應用列表的基本命令格式是:

adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
  • 1

adb shell pm list packages 後面可以跟一些可選參數進行過濾查看不同的列表,可用參數及含義如下:

參數 顯示列表
所有應用
-f 顯示應用關聯的 apk 文件
-d 只顯示 disabled 的應用
-e 只顯示 enabled 的應用
-s 只顯示系統應用
-3 只顯示第三方應用
-i 顯示應用的 installer
-u 包含已卸載應用
<filter> 包名包含 <filter> 字符串

4.3.1.1 查看所有應用

adb shell pm list packages
  • 1

4.3.1.2 查看系統應用

adb shell pm list packages -s
  • 1

4.3.1.3 查看第三方應用

adb shell pm list packages -3
  • 1

4.3.1.4 包名包含某字符串的應用

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

adb shell pm list packages huawei
  • 1

4.3.2 安裝應用

安裝應用的基本命令格式是:

adb install [-l] [-r] [-t] [-s] [-d] [-g] <apk-file>
  • 1

adb install 後面可以跟一些可選參數來控制安裝 APK 的行爲,可用參數及含義如下:

參數 含義
-l 將應用安裝到保護目錄 /mnt/asec
-r 允許覆蓋安裝
-t 允許安裝 AndroidManifest.xml 裏 application 指定 android:testOnly=“true” 的應用
-s 將應用安裝到 sdcard
-d 允許降級覆蓋安裝
-g 授予所有運行時權限

運行命令後可以看到輸出內容,包含安裝進度和狀態,安裝狀態如下:

  • Success:代表安裝成功。
  • Failure:代表安裝失敗。APK 安裝失敗的情況有很多,Failure狀態之後有安裝失敗輸出代碼。常見安裝失敗輸出代碼、含義及可能的解決辦法如下:
輸出代碼 含義 解決辦法
INSTALL_FAILED_ALREADY_EXISTS 應用已經存在,或卸載了但沒卸載乾淨 adb install 時使用 -r 參數,或者先 adb uninstall 再安裝
INSTALL_FAILED_INVALID_APK 無效的 APK 文件
INSTALL_FAILED_INVALID_URI 無效的 APK 文件名 確保 APK 文件名裏無中文
INSTALL_FAILED_INSUFFICIENT_STORAGE 空間不足 清理空間
INSTALL_FAILED_DUPLICATE_PACKAGE 已經存在同名程序
INSTALL_FAILED_NO_SHARED_USER 請求的共享用戶不存在
INSTALL_FAILED_UPDATE_INCOMPATIBLE 以前安裝過同名應用,但卸載時數據沒有移除;或者已安裝該應用,但簽名不一致 先 adb uninstall 再安裝
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 請求的共享用戶存在但簽名不一致
INSTALL_FAILED_MISSING_SHARED_LIBRARY 安裝包使用了設備上不可用的共享庫
INSTALL_FAILED_REPLACE_COULDNT_DELETE 替換時無法刪除
INSTALL_FAILED_DEXOPT dex 優化驗證失敗或空間不足
INSTALL_FAILED_OLDER_SDK 設備系統版本低於應用要求
INSTALL_FAILED_CONFLICTING_PROVIDER 設備裏已經存在與應用裏同名的 content provider
INSTALL_FAILED_NEWER_SDK 設備系統版本高於應用要求
INSTALL_FAILED_TEST_ONLY 應用是 test-only 的,但安裝時沒有指定 -t 參數
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE 包含不兼容設備 CPU 應用程序二進制接口的 native code
INSTALL_FAILED_MISSING_FEATURE 應用使用了設備不可用的功能
INSTALL_FAILED_CONTAINER_ERROR 1. sdcard 訪問失敗;2. 應用簽名與 ROM 簽名一致,被當作內置應用。 1. 確認 sdcard 可用,或者安裝到內置存儲;2. 打包時不與 ROM 使用相同簽名。
INSTALL_FAILED_INVALID_INSTALL_LOCATION 1. 不能安裝到指定位置;2. 應用簽名與 ROM 簽名一致,被當作內置應用。 1. 切換安裝位置,添加或刪除 -s 參數;2. 打包時不與 ROM 使用相同簽名。
INSTALL_FAILED_MEDIA_UNAVAILABLE 安裝位置不可用 一般爲 sdcard,確認 sdcard 可用或安裝到內置存儲
INSTALL_FAILED_VERIFICATION_TIMEOUT 驗證安裝包超時
INSTALL_FAILED_VERIFICATION_FAILURE 驗證安裝包失敗
INSTALL_FAILED_PACKAGE_CHANGED 應用與調用程序期望的不一致
INSTALL_FAILED_UID_CHANGED 以前安裝過該應用,與本次分配的 UID 不一致 清除以前安裝過的殘留文件
INSTALL_FAILED_VERSION_DOWNGRADE 已經安裝了該應用更高版本 使用 -d 參數
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE 已安裝 target SDK 支持運行時權限的同名應用,要安裝的版本不支持運行時權限
INSTALL_PARSE_FAILED_NOT_APK 指定路徑不是文件,或不是以 .apk 結尾
INSTALL_PARSE_FAILED_BAD_MANIFEST 無法解析的 AndroidManifest.xml 文件
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION 解析器遇到異常
INSTALL_PARSE_FAILED_NO_CERTIFICATES 安裝包沒有簽名
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES 已安裝該應用,且簽名與 APK 文件不一致 先卸載設備上的該應用,再安裝
INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING 解析 APK 文件時遇到 CertificateEncodingException
INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME manifest 文件裏沒有或者使用了無效的包名
INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID manifest 文件裏指定了無效的共享用戶 ID
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED 解析 manifest 文件時遇到結構性錯誤
INSTALL_PARSE_FAILED_MANIFEST_EMPTY 在 manifest 文件裏找不到找可操作標籤(instrumentation 或 application)
INSTALL_FAILED_INTERNAL_ERROR 因系統問題安裝失敗
INSTALL_FAILED_USER_RESTRICTED 用戶被限制安裝應用
INSTALL_FAILED_DUPLICATE_PERMISSION 應用嘗試定義一個已經存在的權限名稱
INSTALL_FAILED_NO_MATCHING_ABIS 應用包含設備的應用程序二進制接口不支持的 native code
INSTALL_CANCELED_BY_USER 應用安裝需要在設備上確認,但未操作設備或點了取消 在設備上同意安裝
INSTALL_FAILED_ACWF_INCOMPATIBLE 應用程序與設備不兼容
INSTALL_FAILED_TEST_ONLY APK 文件是使用 Android Studio 直接 RUN 編譯出來的文件 通過 Gradle 的 assembleDebug 或 assembleRelease 重新編譯,或者 Generate Signed APK
does not contain AndroidManifest.xml 無效的 APK 文件
is not a valid zip file 無效的 APK 文件
Offline 設備未連接成功 先將設備與 adb 連接成功
unauthorized 設備未授權允許調試
error: device not found 沒有連接成功的設備 先將設備與 adb 連接成功
protocol failure 設備已斷開連接 先將設備與 adb 連接成功
Unknown option: -s Android 2.2 以下不支持安裝到 sdcard 不使用 -s 參數
No space left on device 空間不足 清理空間
Permission denied … sdcard … sdcard 不可用
signatures do not match the previously installed version; ignoring! 已安裝該應用且簽名不一致 先卸載設備上的該應用,再安裝

參考:PackageManager.java
adb install 實際是分三步完成:

  1. push apk 文件到 /data/local/tmp
  2. 調用 pm install 安裝。
  3. 刪除 /data/local/tmp 下的對應 apk 文件。

4.3.3 卸載應用

卸載應用的基本命令格式是:

adb uninstall [-k] <package-name>
  • 1

<package-name> 表示應用的包名,-k 參數可選,表示卸載應用但保留數據和緩存目錄。

4.3.4 清除應用數據與緩存

adb shell pm clear <package-name>
  • 1

<package-name> 表示應用名包,這條命令的效果相當於在設置裏的應用信息界面點擊了「清除緩存」和「清除數據」。

4.3.5 查看前臺 Activity

adb shell dumpsys activity activities | grep mFocusedActivity
  • 1

4.3.6 查看正在運行的 Services

adb shell dumpsys activity services [<package-name>]
  • 1

<package-name> 參數不是必須的,指定 <package-name> 表示查看與某個包名相關的 Services,不指定表示查看所有 Services。<package-name> 不一定要給出完整的包名,可以只給一部分,那麼所給包名相關的 Services 都會列出來。

4.3.7 查看應用詳細信息

adb shell dumpsys package <package-name>
  • 1

<package-name> 表示應用包名。運行次命令的輸出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安裝後的文件資源代碼等路徑、版本信息、權限信息和授予狀態、簽名版本信息等。

4.3.7 查看應用安裝路徑

adb shell pm path <package-name>
  • 1

4.4 與應用交互

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

command 用途
start [options] <intent> 啓動 <intent> 指定的 Activity
startservice [options] <intent> 啓動 <intent> 指定的 Service
broadcast [options] <intent> 發送 <intent> 指定的廣播
force-stop <package-name> 停止 <package-name> 相關的進程

<intent> 參數很靈活,和寫 Android 程序時代碼裏的 Intent 相對應。
用於決定 intent 對象的選項如下:

參數 含義
-a <action> 指定 action,比如 android.intent.action.VIEW
-c <category> 指定 category,比如 android.intent.category.APP_CONTACTS
-n <component> 指定完整 component 名,用於明確指定啓動哪個 Activity

<intent> 裏還能帶數據,就像寫代碼時的 Bundle 一樣:

參數 含義
--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 數組
--ela <extra-key> <extra-long-value>[,<extra-long-value...] long 數組

4.4.1 啓動應用/ 調起 Activity

adb shell am start [options] <intent>
  • 1

例如:

adb shell am start -a android.settings.SETTINGS                   # 打開系統設置頁面
adb shell am start -a android.intent.action.DIAL -d tel:10086     # 打開撥號頁面
adb shell am start -n com.android.mms/.ui.ConversationList        # 打開短信會話列表
  • 1
  • 2
  • 3

options 是一些改變其行爲的選項,支持的可選參數及含義如下:

選項 含義
-D 啓用調試
-W 等待啓動完成
–start-profiler file 啓動分析器並將結果發送到 file
-P file 類似於 --start-profiler,但當應用進入空閒狀態時分析停止
-R count 重複 Activity 啓動次數
-S 啓動 Activity 前強行停止目標應用
–opengl-trace 啓用 OpenGL 函數的跟蹤
–user user_id current

4.4.2 調起 Service

adb shell am startservice [options] <intent>
  • 1

一個典型的用例是如果設備上原本應該顯示虛擬按鍵但是沒有顯示,可以試試這個:

adb shell am startservice -n com.android.systemui/.SystemUIService
  • 1

4.4.3 停止 Service

adb shell am stopservice [options] <intent>
  • 1

4.4.4 發送廣播

adb shell am broadcast [options] <INTENT>
  • 1

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

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

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

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.android.receiver.test/.BootCompletedReceiver
  • 1

這類用法在測試的時候很實用,比如某個廣播的場景很難製造,可以考慮通過這種方式來發送廣播。
既能發送系統預定義的廣播,也能發送自定義廣播。如下是部分系統預定義廣播及正常觸發時機:

action 觸發時機
android.net.conn.CONNECTIVITY_CHANGE 網絡連接發生變化
android.intent.action.SCREEN_ON 屏幕點亮
android.intent.action.SCREEN_OFF 屏幕熄滅
android.intent.action.BATTERY_LOW 電量低,會彈出電量低提示框
android.intent.action.BATTERY_OKAY 電量恢復了
android.intent.action.BOOT_COMPLETED 設備啓動完畢
android.intent.action.DEVICE_STORAGE_LOW 存儲空間過低
android.intent.action.DEVICE_STORAGE_OK 存儲空間恢復
android.intent.action.PACKAGE_ADDED 安裝了新的應用
android.net.wifi.STATE_CHANGE WiFi連接狀態發生變化
android.net.wifi.WIFI_STATE_CHANGED WiFi狀態變爲啓用/關閉/正在啓動/正在關閉/未知
android.intent.action.BATTERY_CHANGED 電池電量發生變化
android.intent.action.INPUT_METHOD_CHANGED 系統輸入法發生變化
android.intent.action.ACTION_POWER_CONNECTED 外部電源連接
android.intent.action.ACTION_POWER_DISCONNECTED 外部電源斷開連接
android.intent.action.DREAMING_STARTED 系統開始休眠
android.intent.action.DREAMING_STOPPED 系統停止休眠
android.intent.action.WALLPAPER_CHANGED 壁紙發生變化
android.intent.action.HEADSET_PLUG 插入耳機
android.intent.action.MEDIA_UNMOUNTED 卸載外部介質
android.intent.action.MEDIA_MOUNTED 掛載外部介質
android.os.action.POWER_SAVE_MODE_CHANGED 省電模式開啓

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

4.4.5 強制停止應用

adb shell am force-stop <packagename>
  • 1

4.4.6 收緊內存

adb shell am send-trim-memory  <pid> <level>
  • 1

參數說明:

  • pid: 進程 ID
  • level:HIDDEN、RUNNING_MODERATE、BACKGROUND、RUNNING_LOW、MODERATE、RUNNING_CRITICAL、COMPLETE

4.5 文件管理

4.5.1 從模擬器/設備下載指定的文件到計算機

從模擬器/設備下載指定的文件到計算機的基本命令格式是:

adb pull <remote> [local]
  • 1

參數說明:

  • remote: 模擬器/設備裏的文件路徑
  • local:計算機上的目錄,參數可以省略,默認複製到當前目錄

例如,將 /sdcard/music.mp4 下載到計算機的當前目錄:

adb pull /sdcard/music.mp4
  • 1

/sdcard/music.mp4 下載到計算機的當前目錄(目錄需存在):

adb pull /sdcard/music.mp4 D:\Download

4.5.2 將指定的文件從計算機上傳到模擬器/設備

將指定的文件從計算機上傳到模擬器/設備的基本命令格式是:

adb push <local> <remote>
  • 1

參數說明:

  • local:計算機上的文件路徑
  • remote: 模擬器/設備裏的目錄

例如,將 D:\Download\music.mp4 下載到設備的/sdcard/music/目錄:

adb push D:\Download\music.mp4 /sdcard/music/
  • 1

4.5.4 列出指定目錄的內容

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

adb shell ls [options] <directory>
  • 1

<directory> 表示指定目錄,可以省略,表示列出根目錄下的所有文件和目錄。
adb shell ls 後面可以跟一些可選參數進行過濾查看不同的列表,可用參數及含義如下:

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

4.5.5 切換到目標目錄

adb shell cd <directory>
  • 1

第一步:執行adb shell命令;
第二步:執行cd <directory>命令切換到目標目錄。

4.5.6 刪除文件或目錄

adb shell rm [options] <files or directory>
  • 1

第一步:執行adb shell命令;
第二步:執行rm [options] <files or directory>命令刪除文件或目錄。
rm 後面可以跟一些可選參數進行不同的操作,可用參數及含義如下:

參數 含義
刪除文件
-f 強制刪除文件,系統不提示
-r 強制刪除指定目錄中的所有文件和子目錄
-d 刪除指定目錄,即使它是一個非空目錄
-i 交互式刪除,刪除前提示

rm -d 等同於 rmdir 命令,有些版本不包含-d 參數。

4.5.7 創建目錄

adb shell mkdir [options] <directory-name>
  • 1

第一步:執行adb shell命令;
第二步:執行mkdir [options] <directory-name>命令創建目錄。
mkdir 後面可以跟一些可選參數進行不同的操作,可用參數及含義如下:

參數 含義
創建指定目錄
-m 創建指定目錄並賦予讀寫權限
-p 創建指定目錄及其父目錄

4.5.8 創建空文件或改變文件時間戳

adb shell touch [options] <file>
  • 1

第一步:執行adb shell命令;
第二步:執行touch [options] <file>命令創建空文件或改變文件時間戳。
可通過ls -n <directory> 命令查看文件的時間。

4.5.9 輸出當前目錄路徑

adb shell pwd
  • 1

第一步:執行adb shell命令;
第二步:執行pwd命令輸出當前目錄路徑。

4.5.10 複製文件和目錄

adb shell cp [options] <source> <dest>
  • 1

第一步:執行adb shell命令;
第二步:執行cp [options] <source> <dest>命令複製文件和目錄。
參數說明:

  • source:源文件路徑
  • dest: 目標文件路徑

4.5.11 移動或重命名文件

adb shell mv [options] <source> <dest>
  • 1

第一步:執行adb shell命令;
第二步:執行mv [options] <source> <dest>命令移動或重命名文件。
參數說明:

  • source:源文件路徑
  • dest: 目標文件路徑

4.6 網絡管理

4.6.1 查看網絡統計信息

adb shell netstat
  • 1

也可以將網絡統計信息輸出到指定文件:

adb shell netstat><file-path>
  • 1

例如,可以通過 adb shell netstat>D:\netstat.log 將日誌輸出到 D:\netstat.log 中。

4.6.2 測試兩個網絡間的連接和延遲

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
  • 1
  • 2
  • 3
  • 4

例如,ping一個域名:

adb shell ping www.google.com
  • 1

不結束的話會一直ping下去,可以按 Ctrl + C 停止ping操作。
也可以指定ping的次數:

adb shell ping -c 4 www.google.com
  • 1

4.6.3 通過配置文件配置和管理網絡連接

netcfg 命令的格式如下:

adb shell netcfg [<interface> {dhcp|up|down}]
  • 1

輸出示例:

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

4.6.4 顯示、操作路由、設備、策略路由和隧道

ip 命令的格式如下:

adb shell ip [ options ] object
  • 1
  • 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行爲或者改變其輸出的選項。所有的選項都是以-字符開頭,分爲長、短兩種形式,支持的可選參數及含義如下:

選項 含義
-V,-Version 打印ip的版本並退出
-s,-stats,-statistics 輸出更爲詳盡的信息(如果這個選項出現兩次或者多次,輸出的信息將更爲詳盡)
-f,-family 強調使用的協議種類(包括:inet、inet6或者link)
-4 是-family inet的簡寫
-6 是-family inet6的簡寫
-0 是-family link的簡寫
-o,-oneline 對每行記錄都使用單行輸出,回行用字符代替
-r,-resolve 查詢域名解析系統,用獲得的主機名代替主機IP地址

object 是你要管理或者獲取信息的對象。目前ip認識的對象包括:

參數 顯示列表
link 網絡設備
address 一個設備的協議(IP或者IPV6)地址
neighbour ARP或者NDISC緩衝區條目
route 路由表條目
rule 路由策略數據庫中的規則
maddress 多播地址
mroute 多播路由緩衝區條目
tuntap 管理 TUN/TAP 設備
netns 管理網絡空間

例如,查看 WiFi IP 地址:

adb shell ip -f inet addr show wlan0
  • 1

4.7 模擬按鍵/輸入

adb shell 裏有個很實用的命令叫 input,通過它可以做一些有趣的事情。
可以執行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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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

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

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

4.7.1 電源鍵

adb shell input keyevent 26
  • 1

執行效果相當於按電源鍵。

4.7.2 菜單鍵

adb shell input keyevent 82
  • 1

4.7.3 HOME 鍵

adb shell input keyevent 3
  • 1

4.7.4 返回鍵

adb shell input keyevent 4
  • 1

4.7.5 音量控制

增加音量:

adb shell input keyevent 24
  • 1

降低音量:

adb shell input keyevent 25
  • 1

靜音:

adb shell input keyevent 164
  • 1

4.7.6 媒體控制

播放/暫停:

adb shell input keyevent 85
  • 1

停止播放:

adb shell input keyevent 86
  • 1

播放下一首:

adb shell input keyevent 87
  • 1

播放上一首:

adb shell input keyevent 88
  • 1

恢復播放:

adb shell input keyevent 126
  • 1

暫停播放:

adb shell input keyevent 127
  • 1

4.7.7 點亮/熄滅屏幕

點亮屏幕:

adb shell input keyevent 224
  • 1

熄滅屏幕:

adb shell input keyevent 223
  • 1

4.7.8 滑動解鎖

如果鎖屏沒有密碼,是通過滑動手勢解鎖,那麼可以通過 input swipe 來解鎖。
命令(參數以機型 Nexus 5,向上滑動手勢解鎖舉例):

adb shell input swipe 300 1000 300 500
  • 1

參數 300 1000 300 500 分別表示起始點x座標 起始點y座標 結束點x座標 結束點y座標。

4.7.9 輸入文本

在焦點處於某文本框時,可以通過 input 命令來輸入文本。

adb shell input text hello
  • 1

4.8 日誌打印

Android 系統的日誌分爲兩部分,底層的 Linux 內核日誌輸出到 /proc/kmsg,Android 的日誌輸出到 /dev/log。

4.8.1 Android 日誌

查看 Android 設備系統屬性的基本命令格式是:

adb logcat [option] [filter-specs]
  • 1

如果需要停止 logcat 日誌打印,可以按 Ctrl + C 停止日誌監控。

4.8.1.1 按級別過濾日誌

按級別過濾日誌的基本命令格式是:

adb logcat [filter-specs]
  • 1

Android 的日誌分爲如下幾個優先級(priority):

級別 含義
*:V 過濾只顯示 Verbose 及以上級別(優先級最低)
*:D 過濾只顯示 Debug 及以上級別
*:I 過濾只顯示 Info 及以上級別
*:W 過濾只顯示 Warning 及以上級別
*:E 過濾只顯示 Error 及以上級別
*:F 過濾只顯示 Fatal 及以上級別
*:S 過濾只顯示 Silent 及以上級別(優先級最高,什麼也不輸出)

按某級別過濾日誌則會將該級別及以上的日誌輸出。
比如,命令:

adb logcat *:W
  • 1

會將 Warning、Error、Fatal 和 Silent 日誌輸出。
(注: 在 macOS 下需要給 *:W 這樣以 * 作爲 tag 的參數加雙引號,如 adb logcat "*:W",不然會報錯 no matches found: *:W。)

4.8.1.2 按 tag 和級別過濾日誌

按 tag 和級別過濾日誌的基本命令格式是:

adb logcat [tag:level] [tag:level] ...
  • 1

比如,命令:

adb logcat ActivityManager:I MyApp:D *:S
  • 1

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

4.8.1.3 將日誌格式化輸出

可以用 adb logcat -v <format> 選項指定日誌輸出格式。
日誌支持按以下幾種 <format>

參數 顯示格式
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>

日誌格式默認爲 brief,指定格式可與上面的過濾同時使用。比如:

adb logcat -v long ActivityManager:I *:S
  • 1

4.8.1.3 清空已存在的日誌

adb logcat -c
  • 1

4.8.1.4 將日誌顯示在控制檯

adb logcat -d
  • 1

4.8.1.5 將日誌輸出到文件

adb logcat -f <file-path>
  • 1

4.8.1.6 加載一個可使用的日誌緩衝區供查看

adb logcat -b <Buffer>
  • 1

Android log 輸出量巨大,特別是通信系統的log,因此,Android把log輸出到不同的緩衝區中,目前定義了四個log緩衝區:

緩衝區 含義
Radio 輸出通信系統的 log
System 輸出系統組件的 log
Event 輸出 event 模塊的 log
Main 所有 java 層的 log 以及不屬於上面3層的 log

緩衝區主要給系統組件使用,一般的應用不需要關心,應用的log都輸出到main緩衝區中。默認log輸出(不指定緩衝區的情況下)是輸出System和Main緩衝區的log。

4.8.1.7 打印指定日誌緩衝區的大小

adb logcat -g
  • 1

4.8.2 內核日誌

adb shell dmesg
  • 1

輸出示例:

<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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

中括號裏的 [14201.684016] 代表內核開始啓動後的時間,單位爲秒。
通過內核日誌我們可以做一些事情,比如衡量內核啓動時間,在系統啓動完畢後的內核日誌裏找到 Freeing init memory 那一行前面的時間就是。

4.9 查看 Android 設備系統屬性

查看 Android 設備系統屬性的基本命令格式是:

adb shell getprop [options]
  • 1

除了可以查看 Android 設備系統屬性之外,還可以設置系統屬性,設置系統屬性的基本命令格式是:

adb shell setprop <key> <value>
  • 1

4.9.1 查看設備型號

adb shell getprop ro.product.model
  • 1

輸出示例:

Nexus 5
  • 1

4.9.2 查看設備電池狀況

adb shell dumpsys battery
  • 1

輸出示例:

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

4.9.3 查看設備屏幕分辨率

adb shell wm size
  • 1

輸出示例:

Physical size: 1080x1920
  • 1

該設備屏幕分辨率爲 1080px * 1920px。
如果使用命令修改過,那輸出可能是:

Physical size: 1080x1920
Override size: 480x1024
  • 1
  • 2

表明設備的屏幕分辨率原本是 1080px * 1920px,當前被修改爲 480px * 1024px。

4.9.4 查看設備屏幕密度

adb shell wm density
  • 1

輸出示例:

Physical density: 420
  • 1

該設備屏幕密度爲 420dpi。
如果使用命令修改過,那輸出可能是:

Physical density: 480
Override density: 160
  • 1
  • 2

表明設備的屏幕密度原來是 480dpi,當前被修改爲 160dpi。

4.9.5 查看設備顯示屏參數

adb shell dumpsys window displays
  • 1

輸出示例:

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

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

4.9.6 查看設備 android_id

adb shell settings get secure android_id
  • 1

輸出示例:

51b6be48bac8c569
  • 1

4.9.7 查看設備IMEI

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

adb shell dumpsys iphonesubinfo
  • 1

輸出示例:

Phone Subscriber Info:
  Phone Type = GSM
  Device ID = 860955027785041
  • 1
  • 2
  • 3

其中的 Device ID 就是 IMEI。
而在 Android 5.0 及以上版本里這個命令輸出爲空,得通過其它方式獲取了(需要 root 權限):

adb shell
su
service call iphonesubinfo 1
  • 1
  • 2
  • 3

把裏面的有效內容提取出來就是 IMEI 了,比如這裏的是 860955027785041。
參考:adb shell dumpsys iphonesubinfo not working since Android 5.0 Lollipop

4.9.8 查看設備 Android 系統版本

adb shell getprop ro.build.version.release
  • 1

輸出示例:

5.0.2
  • 1

4.9.9 查看設備 IP 地址

adb shell ifconfig | grep Mask
  • 1

在有的設備上這個命令沒有輸出,如果設備連着 WiFi,可以使用如下命令來查看局域網 IP:

adb shell ifconfig wlan0
  • 1

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

adb shell netcfg
  • 1

4.9.10 查看設備 Mac 地址

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

輸出示例:

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

這查看的是局域網 Mac 地址,移動網絡或其它連接的信息可以通過前面的小節「IP 地址」裏提到的 adb shell netcfg 命令來查看。

4.9.11 查看設備 CPU 信息

adb shell cat /proc/cpuinfo
  • 1

4.9.12 查看設備內存信息

adb shell cat /proc/meminfo
  • 1

4.9.13 查看設備更多硬件與系統屬性

設備的更多硬件與系統屬性可以通過如下命令查看:

adb shell cat /system/build.prop
  • 1

這會輸出很多信息,包括前面幾個小節提到的「型號」和「Android 系統版本」等。
輸出裏還包括一些其它有用的信息,它們也可通過 adb shell getprop <屬性名> 命令單獨查看,列舉一部分屬性如下:

屬性名 含義
ro.build.version.sdk SDK 版本
ro.build.version.release Android 系統版本
ro.build.version.security_patch Android 安全補丁程序級別
ro.product.model 型號
ro.product.brand 品牌
ro.product.name 設備名
ro.product.board 處理器型號
ro.product.cpu.abilist CPU 支持的 abi 列表[節注一]
persist.sys.isUsbOtgEnabled 是否支持 OTG
dalvik.vm.heapsize 每個應用程序的內存上限
ro.sf.lcd_density 屏幕密度

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

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

示例輸出:

ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi
  • 1
  • 2

4.10 修改設置

注: 修改設置之後,運行恢復命令有可能顯示仍然不太正常,可以運行 adb reboot 重啓設備,或手動重啓。
修改設置的原理主要是通過 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 裏存放的設置值。

4.10.1 修改分辨率

adb shell wm size 480x1024
  • 1

表示將分辨率修改爲 480px * 1024px。
恢復原分辨率命令:

adb shell wm size reset
  • 1

4.10.2 修改屏幕密度

adb shell wm density 160
  • 1

表示將屏幕密度修改爲 160dpi。
恢復原屏幕密度命令:

adb shell wm density reset
  • 1

4.10.3 修改顯示區域

adb shell wm overscan 0,0,0,200
  • 1

四個數字分別表示距離左、上、右、下邊緣的留白像素,以上命令表示將屏幕底部 200px 留白。
恢復原顯示區域命令:

adb shell wm overscan reset
  • 1

4.10.4 修改關閉 USB 調試模式

adb shell settings put global adb_enabled 0
  • 1

用命令恢復不了了,畢竟關閉了 USB 調試 adb 就連接不上 Android 設備了。
去設備上手動恢復吧:「設置」-「開發者選項」-「Android 調試」。

4.10.5 修改允許/禁止訪問非 SDK API

允許訪問非 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
  • 1
  • 2

禁止訪問非 SDK API:

adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps
  • 1
  • 2

不需要設備獲得 Root 權限。
命令最後的數字的含義:

含義
0 禁止檢測非 SDK 接口的調用。該情況下,日誌記錄功能被禁用,並且令 strict mode API,即 detectNonSdkApiUsage() 無效。不推薦。
1 僅警告——允許訪問所有非 SDK 接口,但保留日誌中的警告信息,可繼續使用 strick mode API。
2 禁止調用深灰名單和黑名單中的接口。
3 禁止調用黑名單中的接口,但允許調用深灰名單中的接口。

4.10.6 修改狀態欄和導航欄的顯示隱藏

adb shell settings put global policy_control <key-values>
  • 1

<key-values> 可由如下幾種鍵及其對應的值組成,格式爲 <key1>=<value1>:<key2>=<value2>

key 含義
immersive.full 同時隱藏
immersive.status 隱藏狀態欄
immersive.navigation 隱藏導航欄
immersive.preconfirms ?

這些鍵對應的值可則如下值用逗號組合:

value 含義
apps 所有應用
* 所有界面
package-name 指定應用
-package-name 排除指定應用

例如:

adb shell settings put global policy_control immersive.full=*
  • 1

表示設置在所有界面下都同時隱藏狀態欄和導航欄。

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

表示設置在包名爲 com.package1com.package2 的應用裏隱藏狀態欄,在除了包名爲 com.package3 的所有應用裏隱藏導航欄。

4.11 實用功能

4.11.1 屏幕截圖

截圖保存到電腦:

adb exec-out screencap -p > sc.png
  • 1

如果 adb 版本較老,無法使用 exec-out 命令,這時候建議更新 adb 版本。無法更新的話可以使用以下麻煩點的辦法:
先截圖保存到設備裏:

adb shell screencap -p /sdcard/sc.png
  • 1

然後將 png 文件導出到電腦:

adb pull /sdcard/sc.png
  • 1

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

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

實測如果指定文件名以 .png 結尾時可以省略 -p 參數;否則需要使用 -p 參數。如果不指定文件名,截圖文件的內容將直接輸出到 stdout。
另外一種一行命令截圖並保存到電腦的方法:
Linux 和 Windows

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

Mac OS X

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

這個方法需要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows 下 Git 安裝目錄的 bin 文件夾下也有。如果確實找不到該命令,可以下載 sed for Windows 並將 sed.exe 所在文件夾添加到 PATH 環境變量裏。
而在 Mac 下使用系統自帶的 sed 命令會報錯:

sed: RE error: illegal byte sequence
  • 1

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

brew install gnu-sed
  • 1

4.11.2 錄製屏幕

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

adb shell screenrecord /sdcard/filename.mp4
  • 1

需要停止時按 Ctrl-C,默認錄製時間和最長錄製時間都是 180 秒。
如果需要導出到電腦:

adb pull /sdcard/filename.mp4
  • 1

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

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

4.11.3 查看連接過的 WiFi 密碼

注:需要 root 權限。

adb shell
su
cat /data/misc/wifi/*.conf
  • 1
  • 2
  • 3

4.11.4 設置系統日期和時間

注:需要 root 權限。

adb shell
su
date -s 20160823.131500
  • 1
  • 2
  • 3

表示將系統日期和時間更改爲 2016 年 08 月 23 日 13 點 15 分 00 秒。

4.11.5 重啓手機

adb reboot
  • 1

4.11.6 檢測設備是否已 root

adb shell
su
  • 1
  • 2

此時命令行提示符是 $ 則表示沒有 root 權限,是 # 則表示已 root。

4.11.7 使用 Monkey 進行壓力測試

Monkey 可以生成僞隨機用戶事件來模擬單擊、觸摸、手勢等操作,可以對正在開發中的程序進行隨機壓力測試。
簡單用法:

adb shell monkey -p <packagename> -v 500
  • 1

表示向 <packagename> 指定的應用程序發送 500 個僞隨機事件。
Monkey 的詳細用法參考 官方文檔

4.11.8 開啓/關閉 WiFi

注:需要 root 權限。
開啓 WiFi:

adb root
adb shell svc wifi enable
  • 1
  • 2

關閉 WiFi:

adb root
adb shell svc wifi disable
  • 1
  • 2

若執行成功,輸出爲空;若未取得 root 權限執行此命令,將執行失敗,輸出 Killed。

4.12 刷機相關命令

4.12.1 重啓到 Recovery 模式

adb reboot recovery
  • 1

4.12.2 從 Recovery 重啓到 Android

adb reboot
  • 1

4.12.3 重啓到 Fastboot 模式

adb reboot bootloader
  • 1

4.12.4 通過 sideload 更新系統

如果我們下載了 Android 設備對應的系統更新包到電腦上,那麼也可以通過 adb 來完成更新。
以 Recovery 模式下更新爲例:

  1. 重啓到 Recovery 模式。

    adb reboot recovery

  2. 在設備的 Recovery 界面上操作進入 Apply update-Apply from ADB。注:不同 的 Recovery 菜單可能與此有差異,有的是一級菜單就有 Apply update from ADB

  3. 通過 adb 上傳和更新系統。

    adb sideload <path-to-update.zip>

4.13 安全相關命令

4.13.1 啓用/禁用 SELinux

啓用 SELinux

adb root
adb shell setenforce 1
  • 1
  • 2

禁用 SELinux

adb root
adb shell setenforce 0
  • 1
  • 2

4.13.2 啓用/禁用 dm_verity

啓用 dm_verity

adb root
adb enable-verity
  • 1
  • 2

禁用 dm_verity

adb root
adb disable-verity
  • 1
  • 2

4.14 更多 adb shell 命令

Android 系統是基於 Linux 內核的,所以 Linux 裏的很多命令在 Android 裏也有相同或類似的實現,在 adb shell 裏可以調用。本文檔前面的部分內容已經用到了 adb shell 命令。

4.14.1 查看進程狀態

adb shell ps
  • 1

輸出信息各列含義:

列名 含義
USER 所屬用戶
PID 進程 ID
PPID 父進程 ID
NAME 進程名

4.14.2 查看處理器實時狀態

adb shell top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h]
  • 1

adb shell top 後面可以跟一些可選參數進行過濾查看不同的列表,可用參數及含義如下:

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

輸出信息各列含義:

列名 含義
PID 進程 ID
PR 優先級
CPU% 當前瞬間佔用 CPU 百分比
S 進程狀態(R=運行,S=睡眠,T=跟蹤/停止,Z=殭屍進程)
#THR 線程數
VSS Virtual Set Size 虛擬耗用內存(包含共享庫佔用的內存)
RSS Resident Set Size 實際使用物理內存(包含共享庫佔用的內存)
PCY 調度策略優先級,SP_BACKGROUND/SPFOREGROUND
UID 進程所有者的用戶 ID
NAME 進程名

4.14.3 查看進程 UID

有兩種方案:

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

    adb shell dumpsys package org.mazhuang.guanggoo | grep userId=
    userId=10394

  2. 通過 ps 命令找到對應進程的 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:/ $

五、參考

  1. ADB Shell
  2. Awesome Adb
  3. Android Debug Bridge
        </div>
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet">
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章