ADB

ADB

1.DOS 查看正在啓用的app 包名及activity入口html

adb logcat | findstr /i "ActivityManager" # DOS 查看正在啓用的app 包名及activity入口

官方文檔java

Android 調試橋 ( adb ) 是多種用途的工具,該工具能夠幫助你管理設備或模擬器的狀態。node

該工具做爲一個客戶端 - 服務器程序,包括三個組件:linux

  • 客戶端,該組件發送命令。 客戶端在開發計算機上運行。能夠經過發出 adb 命令從命令行終端調用客戶端。
  • 後臺程序,該組件在設備上運行命令。 後臺程序是每一個模擬器或設備實例上做爲後臺進程運行的守護程序 (daemon)。
  • 服務器,該組件管理客戶端和後臺程序之間的通訊。 服務器在開發計算機上做爲後臺進程運行。該服務器負責管理客戶端與運行於模擬器或設備上的 adb 守護程序 (daemon) 之間的通訊。

能夠在 android_sdk/platform-tools/ 中找到 adb 工具。android

建議將該路徑加入 PATH 環境變量中git

1. adb 的工做方式

當你啓動一個 adb 客戶端,客戶端首先確認是否已有一個 adb 服務進程在運行。若是沒有,則啓動服務進程。當服務器運行, adb 服務器就會綁定本地的 TCP 端口 5037 並監聽 adb 客戶端發來的命令,全部的 adb 客戶端都是用端口 5037 與 adb 服務器對話的。github

而後,服務器將全部運行中的模擬器或設備實例創建鏈接。它經過掃描全部 5555 到 5585 範圍內的奇數端口 來定位全部的模擬器或設備( 模擬器 / 設備 使用的範圍)。一旦服務器找到了 adb 守護程序,它將創建一個到該端口的鏈接。請注意任何模擬器或設備實例會取得兩個連續的端口——一個 偶數端口 用來響應控制檯的鏈接,和一個 奇數端口 用來響應 adb 鏈接。好比說:web

模擬器1,控制檯:5554
模擬器1,adb:5555
模擬器2,控制檯:5556
模擬器2,adb:5557
以此類推...
Bash

如上所示,模擬器實例經過 5555 端口鏈接 adb ,就如同使用 5554 端口鏈接控制檯同樣。shell

一旦服務器與全部模擬器實例創建鏈接,就可使用 adb 命令控制和訪問該實例。由於服務器管理 模擬器 / 設備實例 的鏈接,和控制處理歷來自多個 adb 客戶端來的命令,你能夠經過任何客戶端(或腳本)來控制任何模擬器或設備實例。api

2. 在你的設備上啓用 adb 調試

要在經過 USB 鏈接的設備上使用 adb ,必須在設備系統設置中啓用 USB 調試 (位於 開發者選項下)。

  1. 在運行 Android 4.2 及更高版本的設備上, 開發者選項 屏幕默認狀況下處於隱藏狀態。
  2. 如需將其顯示出來,請轉到 設置 > 關於手機 並點按 軟件版本號 七次。
  3. 返回上一屏幕,在底部能夠找到 開發者選項 。
  4. 在某些設備上, 開發者選項 屏幕所在的位置或命名方式可能有所不一樣。

如今,能夠將設備與 USB 鏈接。能夠從 android_sdk/platform-tools/ 目錄執行 adb devices 來驗證設備是否鏈接。若是已鏈接,將看到設備名稱以 設備 形式列示。

注:當鏈接運行 Android 4.2.2 或更高版本的設備時,系統將顯示一個對話框,詢問 你是否接受容許在這臺計算機上調試 的 RSA 密鑰。這種安全機制能夠保護用戶設備,由於它能夠確保只有在你可以解鎖設備並確認對話框的狀況下才能執行 USB 調試和其餘 ADB 命令。

3. 基本用法

3.1. 命令語法

adb 命令的基本語法以下:

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

若是隻有一個設備 / 模擬器鏈接時,能夠省略掉 [-d|-e|-s <serialNumber>] 這一部分,直接使用adb <command> 。

3.2. 爲命令指定目標設備

若是有多個設備 / 模擬器鏈接,則須要爲命令指定目標設備。

參數 含義
-d 指定當前惟一經過 USB 鏈接的 Android 設備爲命令目標
-e 指定當前惟一運行的模擬器爲命令目標
-s <serialNumber> 指定相應 serialNumber 號的設備 / 模擬器爲命令目標

在多個設備 / 模擬器鏈接的狀況下較經常使用的是 -s <serialNumber> 參數,serialNumber 能夠經過 adb devices 命令獲取。如:

> adb devices

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

輸出裏的 cf264b8f 、 emulator-5554 和 10.129.164.6:5555 即爲 serialNumber。

好比這時想指定 cf264b8f 這個設備來運行 adb 命令獲取屏幕分辨率:

adb -s cf264b8f shell wm size
Sh

又如想給 10.129.164.6:5555 這個設備安裝應用(這種形式的 serialNumber 格式爲 <IP>:<Port> ,通常爲無線鏈接的設備或 Genymotion 等第三方 Android 模擬器):

adb -s 10.129.164.6:5555 install test.apk
Sh

遇到多設備 / 模擬器的狀況均使用這幾個參數爲命令指定目標設備,下文中爲簡化描述,再也不重複。

3.3. 啓動 / 中止

啓動 adb server 命令:

adb start-server
Sh

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

中止 adb server 命令:

adb kill-server
Sh

3.4. 查看 adb 版本

命令:

adb version
Sh

示例輸出:

Android Debug Bridge version 1.0.36
Revision 8f855a3d9b35-android
Sh

3.5. 以 root 權限運行 adb

adb 的運行原理是 PC 端的 adb server 與手機端的守護進程 adb 創建鏈接,而後 PC 端的 adb client 經過 adb server 轉發命令,adb 接收命令後解析運行。

因此若是 adb 以普通權限執行,有些須要 root 權限才能執行的命令沒法直接用 adb xxx 執行。這時能夠 adb shell 而後 su 後執行命令,也可讓 adb 以 root 權限執行,這個就能隨意執行高權限命令了。

命令:

adb root
Sh

正常輸出:

restarting adb as root
Sh

如今再運行 adb shell ,看看命令行提示符是否是變成 # 了?

有些手機 root 後也沒法經過 adb root 命令讓 adb 以 root 權限執行,好比三星的部分機型,會提示adb cannot run as root in production builds ,此時能夠先安裝 adb Insecure,而後 adb root 試試。

相應地,若是要恢復 adb 爲非 root 權限的話,可使用 adb unroot 命令。

3.6. 指定 adb server 的網絡端口

命令:

adb -P <port> start-server
Sh

默認端口爲 5037。

4. 設備鏈接管理

4.1. 查詢已鏈接設備 / 模擬器

命令:

adb devices
Sh

輸出示例:

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

輸出格式爲 [serialNumber] [state] ,serialNumber 即咱們常說的 SN,state 有以下幾種:

  • offline —— 表示設備未鏈接成功或無響應。

  • device —— 設備已鏈接。注意這個狀態並不能標識 Android 系統已經徹底啓動和可操做,在設備啓動過程當中設備實例就可鏈接到 adb,但啓動完畢後系統才處於可操做狀態。

  • no device —— 沒有設備 / 模擬器鏈接。

以上輸出顯示當前已經鏈接了三臺設備 / 模擬器, cf264b8f 、 emulator-5554 和10.129.164.6:5555 分別是它們的 SN。從 emulator-5554 這個名字能夠看出它是一個 Android 模擬器,而 10.129.164.6:5555 這種形爲 <IP>:<Port> 的 serialNumber 通常是無線鏈接的設備或 Genymotion 等第三方 Android 模擬器。

常見異常輸出:

  1. 沒有設備 / 模擬器鏈接成功。

    List of devices attached
    Sh
  2. 設備 / 模擬器未鏈接到 adb 或無響應。

    List of devices attached
    cf264b8f  offline
    Sh

4.2. USB 鏈接

經過 USB 鏈接來正常使用 adb 須要保證幾點:

  1. 硬件狀態正常。

    包括 Android 設備處於正常開機狀態,USB 鏈接線和各類接口無缺。

  2. Android 設備的開發者選項和 USB 調試模式已開啓。

    能夠到「設置」-「開發者選項」-「Android 調試」查看。

    若是在設置裏找不到開發者選項,那須要經過一個彩蛋來讓它顯示出來:在「設置」-「關於手機」連續點擊「版本號」7 次。

  3. 設備驅動狀態正常。

    這一點貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到須要安裝驅動的狀況,確認這一點能夠右鍵「計算機」-「屬性」,到「設備管理器」裏查看相關設備上是否有黃色感嘆號或問號,若是沒有就說明驅動狀態已經好了。不然能夠下載一個手機助手類程序來安裝驅動先。

  4. 經過 USB 線鏈接好電腦和設備後確認狀態。

    adb devices
    Sh

    若是能看到

    xxxxxx device
    Sh

    說明鏈接成功。

4.3. 無線鏈接(須要藉助 USB 線)

除了能夠經過 USB 鏈接設備與電腦來使用 adb,也能夠經過無線鏈接——雖然鏈接過程當中也有須要使用 USB 的步驟,可是鏈接成功以後你的設備就能夠在必定範圍內擺脫 USB 鏈接線的限制啦!

操做步驟:

  1. 將 Android 設備與要運行 adb 的電腦鏈接到同一個局域網,好比連到同一個 WiFi。

  2. 將設備與電腦經過 USB 線鏈接。

    應確保鏈接成功(可運行 adb devices 看是否能列出該設備)。

  3. 讓設備在 5555 端口監聽 TCP/IP 鏈接:

    adb tcpip 5555
    Sh
  4. 斷開 USB 鏈接。

  5. 找到設備的 IP 地址。

    通常能在「設置」-「關於手機」-「狀態信息」-「IP地址」找到,也可使用下文裏 查看設備信息 - IP 地址 一節裏的方法用 adb 命令來查看。

  6. 經過 IP 地址鏈接設備。

    adb connect <device-ip-address>
    Sh

    這裏的 <device-ip-address> 就是上一步中找到的設備 IP 地址。

  7. 確認鏈接狀態。

    adb devices
    Sh

    若是能看到

    <device-ip-address>:5555 device
    Sh

    說明鏈接成功。

若是鏈接不了,請確認 Android 設備與電腦是鏈接到了同一個 WiFi,而後再次執行 adb connect<device-ip-address> 那一步;

若是仍是不行的話,經過 adb kill-server 從新啓動 adb 而後從頭再來一次試試。

斷開無線鏈接

命令:

adb disconnect <device-ip-address>
Sh

5. 應用管理

5.1. 查看應用列表

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

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

即在 adb shell pm list packages 的基礎上能夠加一些參數進行過濾查看不一樣的列表,支持的過濾參數以下:

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

全部應用

命令:

adb shell pm list packages
Sh

輸出示例:

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

系統應用

命令:

adb shell pm list packages -s
Sh

第三方應用

命令:

adb shell pm list packages -3
Sh

包名包含某字符串的應用

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

adb shell pm list packages mazhuang
Sh

固然也可使用 grep 來過濾:

adb shell pm list packages | grep mazhuang
Sh

5.2. 安裝 APK

命令格式:

adb install [-lrtsdg] <path_to_apk>
Sh

參數:

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

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

運行命令後若是見到相似以下輸出(狀態爲 Success )表明安裝成功:

[100%] /data/local/tmp/1.apk
  pkg: /data/local/tmp/1.apk
Success
Sh

上面是當前最新版 v1.0.36 的 adb 的輸出,會顯示 push apk 文件到手機的進度百分比。

使用舊版本 adb 的輸出則是這樣的:

12040 KB/s (22205609 bytes in 1.801s)
        pkg: /data/local/tmp/SogouInput_android_v8.3_sweb.apk
Success
Sh

而若是狀態爲 Failure 則表示安裝失敗,好比:

[100%] /data/local/tmp/map-20160831.apk
        pkg: /data/local/tmp/map-20160831.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]
Sh

常見安裝失敗輸出代碼、含義及可能的解決辦法以下:

輸出 含義 解決辦法
INSTALL_FAILED_ALREADY_EXISTS 應用已經存在,或卸載了但沒卸載乾淨 adb install時使用 -r 參數,或者先 adb uninstall<packagename>再安裝
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<packagename>再安裝
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 用戶被限制安裝應用 在開發者選項裏將「USB 安裝」打開,若是已經打開了,那先關閉再打開。
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 內部原理簡介

adb install 實際是分三步完成:

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

  2. 調用 pm install 安裝。

  3. 刪除 /data/local/tmp 下的對應 apk 文件。

因此,必要的時候也能夠根據這個步驟,手動分步執行安裝過程。

5.3. 卸載應用

命令:

adb uninstall [-k] <packagename>
Sh

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

命令示例:

adb uninstall com.qihoo360.mobilesafe
Sh

表示卸載 360 手機衛士。

5.4. 清除應用數據與緩存

命令:

adb shell pm clear <packagename>
Sh

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

命令示例:

adb shell pm clear com.qihoo360.mobilesafe
Sh

表示清除 360 手機衛士的數據和緩存。

5.5. 查看前臺 Activity

命令:

adb shell dumpsys activity activities | grep mFocusedActivity
Sh

輸出示例:

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

其中的 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher 就是當前處於前臺的 Activity。

5.6. 查看正在運行的 Services

命令:

adb shell dumpsys activity services [<packagename>]
Sh

<packagename> 參數不是必須的,指定 <packagename> 表示查看與某個包名相關的 Services,不指定表示查看全部 Services。

<packagename> 不必定要給出完整的包名,好比運行 adb shell dumpsys activity services org.mazhuang ,那麼包名 org.mazhuang.demo1 、 org.mazhuang.demo2 和 org.mazhuang123等相關的 Services 都會列出來。

5.7. 查看應用詳細信息

命令:

adb shell dumpsys package <packagename>
Sh

輸出中包含不少信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安裝後的文件資源代碼等路徑、版本信息、權限信息和授予狀態、簽名版本信息等。

<packagename> 表示應用包名。

輸出示例:

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

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

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

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

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

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

5.8. 查看應用安裝路徑

命令:

adb shell pm path <PACKAGE>
Sh

輸出應用安裝路徑

輸出示例:

adb shell pm path ecarx.weather

package:/data/app/ecarx.weather-1.apk
Sh

6. 與應用交互

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

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

<INTENT> 參數很靈活,和寫 Android 程序時代碼裏的 Intent 相對應。

用於決定 intent 對象的選項以下:

參數 含義
-a<ACTION> 指定 action,好比 android.intent.action.VIEW
-c<CATEGORY> 指定 category,好比 android.intent.category.APP_CONTACTS
-n<COMPONENT> 指定完整 component 名,用於明確指定啓動哪一個 Activity,如com.example.app/.ExampleActivity

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

參數 含義
--esn <EXTRA_KEY> null 值(只有 key 名)
`-e --es <extra_key>` 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 數組

6.1. 啓動應用 / 調起 Activity

命令格式:

adb shell am start [options] <INTENT>
Sh

例如:

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

表示調起微信主界面。

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

表示調起 org.mazhuang.boottimemeasure/.MainActivity 並傳給它 string 數據鍵值對 toast - hello, world 。

6.2. 調起 Service

命令格式:

adb shell am startservice [options] <INTENT>
Sh

例如:

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

表示調起微信的某 Service。

另一個典型的用例是若是設備上本來應該顯示虛擬按鍵可是沒有顯示,能夠試試這個:

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

6.3. 中止 Service

命令格式:

adb shell am stopservice [options] <INTENT>
Sh

6.4. 發送廣播

命令格式:

adb shell am broadcast [options] <INTENT>
Sh

能夠向全部組件廣播,也能夠只向指定組件廣播。

例如,向全部組件廣播 BOOT_COMPLETED :

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

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

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

這類用法在測試的時候很實用,好比某個廣播的場景很難製造,能夠考慮經過這種方式來發送廣播。

既能發送系統預約義的廣播,也能發送自定義廣播。以下是部分系統預約義廣播及正常觸發時機:

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 觸發)

6.5. 強制中止應用

命令:

adb shell am force-stop <packagename>
Sh

命令示例:

adb shell am force-stop com.qihoo360.mobilesafe
Sh

表示中止 360 安全衛士的一切進程與服務。

6.6. 收緊內存

命令:

adb shell am send-trim-memory  <pid> <level>
Sh

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

命令示例:

adb shell am send-trim-memory 12345 RUNNING_LOW
Sh

表示向 pid=12345 的進程,發出 level=RUNNING_LOW 的收緊內存命令。

7. 文件管理

7.1. 複製設備裏的文件到電腦

命令:

adb pull <設備裏的文件路徑> [電腦上的目錄]
Sh

其中 電腦上的目錄 參數能夠省略,默認複製到當前目錄。

例:

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

小技巧:設備上的文件路徑可能須要 root 權限才能訪問,若是你的設備已經 root 過,能夠先使用 adb shell 和 su 命令在 adb shell 裏獲取 root 權限後,先 cp /path/on/device /sdcard/filename 將文件複製到 sdcard,而後 adb pull /sdcard/filename /path/on/pc 。

7.2. 複製電腦裏的文件到設備

命令:

adb push <電腦上的文件路徑> <設備裏的目錄>
Sh

例:

adb push ~/sr.mp4 /sdcard/
Sh

小技巧:設備上的文件路徑普通權限可能沒法直接寫入,若是你的設備已經 root 過,能夠先 adb push /path/on/pc /sdcard/filename ,而後 adb shell 和 su 在 adb shell 裏獲取 root 權限後, cp /sdcard/filename /path/on/device 。

8. 模擬按鍵 / 輸入

在 adb shell 裏有個很實用的命令叫 input ,經過它能夠作一些有趣的事情。

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

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

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

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

好比使用 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 命令的一些用法舉例。

8.1. 電源鍵

命令:

adb shell input keyevent 26
Sh

執行效果至關於按電源鍵。

8.2. 菜單鍵

命令:

adb shell input keyevent 82
Sh

8.3. HOME 鍵

命令:

adb shell input keyevent 3
Sh

8.4. 返回鍵

命令:

adb shell input keyevent 4
Sh

8.5. 音量控制

增長音量:

adb shell input keyevent 24
Sh

下降音量:

adb shell input keyevent 25
Sh

靜音:

adb shell input keyevent 164
Sh

8.6. 媒體控制

播放 / 暫停:

adb shell input keyevent 85
Sh

中止播放:

adb shell input keyevent 86
Sh

播放下一首:

adb shell input keyevent 87
Sh

播放上一首:

adb shell input keyevent 88
Sh

恢復播放:

adb shell input keyevent 126
Sh

暫停播放:

adb shell input keyevent 127
Sh

8.7. 點亮 / 熄滅屏幕

能夠經過上文講述過的模擬電源鍵來切換點亮和熄滅屏幕,但若是明確地想要點亮或者熄滅屏幕,那可使用以下方法。

點亮屏幕:

adb shell input keyevent 224
Sh

熄滅屏幕:

adb shell input keyevent 223
Sh

8.8. 滑動解鎖

若是鎖屏沒有密碼,是經過滑動手勢解鎖,那麼能夠經過 input swipe 來解鎖。

命令(參數以機型 Nexus 5,向上滑動手勢解鎖舉例):

adb shell input swipe 300 1000 300 500
Sh

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

8.9. 輸入文本

在焦點處於某文本框時,能夠經過 input 命令來輸入文本。

命令:

adb shell input text hello
Sh

如今 hello 出如今文本框了。

9. 查看日誌

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

9.1. Android 日誌

命令格式:

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

經常使用用法列舉以下:

按級別過濾日誌

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

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

按某級別過濾日誌則會將該級別及以上的日誌輸出。

好比,命令:

adb logcat *:W
Sh

會將 Warning、Error、Fatal 和 Silent 日誌輸出。

(注: 在 macOS 下須要給 *:W 這樣以 * 做爲 tag 的參數加雙引號,如 adb logcat "*:W" ,否則會報錯 no matches found: *:W 。)

按 tag 和級別過濾日誌

<filter-spec> 能夠由多個 <tag>[:priority] 組成。

好比,命令:

adb logcat ActivityManager:I MyApp:D *:S
Sh

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

日誌格式

能夠用 adb logcat -v <format> 選項指定日誌輸出格式。

日誌支持按如下幾種 <format> :

  • brief

    默認格式。格式爲:

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

    示例:

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

    格式爲:

    <priority>(<pid>) <message>
    Sh

    示例:

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

    格式爲:

    <priority>/<tag>: <message>
    Sh

    示例:

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

    格式爲:

    <message>
    Sh

    示例:

    Disconnected process message: 10, size: 0
    Sh
  • time

    格式爲:

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

    示例:

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

    格式爲:

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

    示例:

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

    格式爲:

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

    示例:

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

指定格式可與上面的過濾同時使用。好比:

adb logcat -v long ActivityManager:I *:S
Sh

清空日誌

adb logcat -c
Sh

9.2. 內核日誌

命令:

adb shell dmesg
Sh

輸出示例:

<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.
Sh

中括號裏的 [14201.684016] 表明內核開始啓動後的時間,單位爲秒。

經過內核日誌咱們能夠作一些事情,好比衡量內核啓動時間,在系統啓動完畢後的內核日誌裏找到Freeing init memory 那一行前面的時間就是。

10. 查看設備信息

10.1. 型號

命令:

adb shell getprop ro.product.model
Sh

輸出示例:

Nexus 5
Sh

10.2. 電池情況

命令:

adb shell dumpsys battery
Sh

輸入示例:

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
Sh

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

10.3. 屏幕分辨率

命令:

adb shell wm size
Sh

輸出示例:

Physical size: 1080x1920
Sh

該設備屏幕分辨率爲 1080px * 1920px。

若是使用命令修改過,那輸出多是:

Physical size: 1080x1920
Override size: 480x1024
Sh

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

10.4. 輸出屏幕密度

命令:

adb shell wm density
Sh

輸出示例:

Physical density: 420
Sh

該設備屏幕密度爲 420dpi。

若是使用命令修改過,那輸出多是:

Physical density: 480
Override density: 160
Sh

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

10.5. 顯示屏參數

命令:

adb shell dumpsys window displays
Sh

輸出示例:

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

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

10.6. android_id

命令:

adb shell settings get secure android_id
Sh

輸出示例:

51b6be48bac8c569
Sh

10.7. IMEI

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

adb shell dumpsys iphonesubinfo
Sh

輸出示例:

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

其中的 Device ID 就是 IMEI。

而在 Android 5.0 及以上版本里這個命令輸出爲空,得經過其它方式獲取了(須要 root 權限):

adb shell
su
service call iphonesubinfo 1
Sh

輸出示例:

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

把裏面的有效內容提取出來就是 IMEI 了,好比這裏的是 860955027785041 。

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

10.8. Android 系統版本

命令:

adb shell getprop ro.build.version.release
Sh

輸出示例:

5.0.2
Sh

10.9. IP 地址

每次想知道設備的 IP 地址的時候都得「設置」-「關於手機」-「狀態信息」-「IP 地址」很煩對不對?經過 adb 能夠方便地查看。

命令:

adb shell ifconfig | grep Mask
Sh

輸出示例:

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

那麼 10.130.245.230 就是設備 IP 地址。

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

adb shell ifconfig wlan0
Sh

輸出示例:

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

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

若是以上命令仍然不能獲得指望的信息,那能夠試試如下命令(部分系統版本里可用):

adb shell netcfg
Sh

輸出示例:

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

能夠看到網絡鏈接名稱、啓用狀態、IP 地址和 Mac 地址等信息。

10.10. Mac 地址

命令:

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

輸出示例:

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

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

10.11. CPU 信息

命令:

adb shell cat /proc/cpuinfo
Sh

輸出示例:

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

processor       : 1
BogoMIPS        : 38.40

processor       : 2
BogoMIPS        : 38.40

processor       : 3
BogoMIPS        : 38.40

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

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

這是 Nexus 5 的 CPU 信息,咱們從輸出裏能夠看到使用的硬件是 Qualcomm MSM 8974 ,processor 的編號是 0 到 3,因此它是四核的,採用的架構是 ARMv7 Processor rev 0 (v71) 。

10.12. 內存信息

命令:

adb shell cat /proc/meminfo
Sh

輸出示例:

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

其中, MemTotal 就是設備的總內存, MemFree 是當前空閒內存。

10.13. 更多硬件與系統屬性

設備的更多硬件與系統屬性能夠經過以下命令查看:

adb shell cat /system/build.prop
Sh

這會輸出不少信息,包括前面幾個小節提到的「型號」和「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
Sh

示例輸出:

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

11. 修改設置

注: 修改設置以後,運行恢復命令有可能顯示仍然不太正常,能夠運行 adb reboot 重啓設備,或手動重啓。

修改設置的原理主要是經過 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 裏存放的設置值。

11.1. 分辨率

命令:

adb shell wm size 480x1024
Sh

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

恢復原分辨率命令:

adb shell wm size reset
Sh

11.2. 修改屏幕密度

命令:

adb shell wm density 160
Sh

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

恢復原屏幕密度命令:

adb shell wm density reset
Sh

11.3. 顯示區域

命令:

adb shell wm overscan 0,0,0,200
Sh

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

恢復原顯示區域命令:

adb shell wm overscan reset
Sh

11.4. 關閉 USB 調試模式

命令:

adb shell settings put global adb_enabled 0
Sh

恢復:

用命令恢復不了了,畢竟關閉了 USB 調試 adb 就鏈接不上 Android 設備了。

去設備上手動恢復吧:「設置」-「開發者選項」-「Android 調試」。

11.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
Sh

禁止訪問非 SDK API:

adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps
Sh

不須要設備得到 Root 權限。

命令最後的數字的含義:

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

11.6. 狀態欄和導航欄的顯示隱藏

本節所說的相關設置對應 Cyanogenmod 裏的「擴展桌面」。

命令:

adb shell settings put global policy_control <key-values>
Sh

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

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

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

value 含義
apps 全部應用
* 全部界面
packagename 指定應用
-packagename 排除指定應用

例如:

adb shell settings put global policy_control immersive.full=*
Sh

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

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

表示設置在包名爲 com.package1 和 com.package2 的應用裏隱藏狀態欄,在除了包名爲com.package3 的全部應用裏隱藏導航欄。

12. 實用功能

12.1. 屏幕截圖

截圖保存到電腦:

adb exec-out screencap -p > sc.png
Sh

若是 adb 版本較老,沒法使用 exec-out 命令,這時候建議更新 adb 版本。沒法更新的話可使用如下麻煩點的辦法:

先截圖保存到設備裏:

adb shell screencap -p /sdcard/sc.png
Sh

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

adb pull /sdcard/sc.png
Sh

可使用 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
Sh

Mac OS X

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

這個方法須要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows 下 Git 安裝目錄的 bin 文件夾下也有。若是確實找不到該命令,能夠下載 sed for Windows 並將 sed.exe 所在文件夾添加到 PATH 環境變量裏。

而在 Mac 下使用系統自帶的 sed 命令會報錯:

sed: RE error: illegal byte sequence
Sh

須要安裝 gnu-sed,而後使用 gsed 命令:

brew install gnu-sed
Sh

12.2. 錄製屏幕

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

adb shell screenrecord /sdcard/filename.mp4
Sh

須要中止時按 Ctrl-C,默認錄製時間和最長錄製時間都是 180 秒。

若是須要導出到電腦:

adb pull /sdcard/filename.mp4
Sh

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

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

12.3. 從新掛載 system 分區爲可寫

注:須要 root 權限

/system 分區默認掛載爲只讀,但有些操做好比給 Android 系統添加命令、刪除自帶應用等須要對 /system 進行寫操做,因此須要從新掛載它爲可讀寫。

步驟:

  1. 進入 shell 並切換到 root 用戶權限。

    命令:

    adb shell
    su
    Sh
  2. 查看當前分區掛載狀況。

    命令:

    mount
    Sh

    輸出示例:

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

    找到其中咱們關注的帶 /system 的那一行:

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

    命令:

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

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

若是輸出沒有提示錯誤的話,操做就成功了,能夠對 /system 下的文件隨心所欲了。

12.4. 查看鏈接過的 WiFi 密碼

注:須要 root 權限。

命令:

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

輸出示例:

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

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

ssid 即爲咱們在 WLAN 設置裏看到的名稱, psk 爲密碼, key_mgmt 爲安全加密方式。

12.5. 設置系統日期和時間

注:須要 root 權限。

命令:

adb shell
su
date -s 20160823.131500
Sh

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

12.6. 重啓手機

命令:

adb reboot
Sh

12.7. 檢測設備是否已 root

命令:

adb shell
su
Sh

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

12.8. 使用 Monkey 進行壓力測試

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

簡單用法:

adb shell monkey -p <packagename> -v 500
Sh

表示向 <packagename> 指定的應用程序發送 500 個僞隨機事件。

Monkey 的詳細用法參考 官方文檔

12.9. 開啓 / 關閉 WiFi

注:須要 root 權限。

有時須要控制設備的 WiFi 狀態,能夠用如下指令完成。

開啓 WiFi:

adb root
adb shell svc wifi enable
Sh

關閉 WiFi:

adb root
adb shell svc wifi disable
Sh

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

13. 刷機相關命令

13.1. 重啓到 Recovery 模式

命令:

adb reboot recovery
Sh

13.2. 從 Recovery 重啓到 Android

命令:

adb reboot
Sh

13.3. 重啓到 Fastboot 模式

命令:

adb reboot bootloader
Sh

13.4. 經過 sideload 更新系統

若是咱們下載了 Android 設備對應的系統更新包到電腦上,那麼也能夠經過 adb 來完成更新。

以 Recovery 模式下更新爲例:

  1. 重啓到 Recovery 模式。

    命令:

    adb reboot recovery
    Sh
  2. 在設備的 Recovery 界面上操做進入 Apply update - Apply from ADB 。

    注:不一樣的 Recovery 菜單可能與此有差別,有的是一級菜單就有 Apply update from ADB 。

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

    命令:

    adb sideload <path-to-update.zip>
    Sh

14. 安全相關命令

14.1. 啓用 / 禁用 SELinux

啓用 SELinux

adb root
adb shell setenforce 1
Sh

禁用 SELinux

adb root
adb shell setenforce 0
Sh

14.2. 啓用 / 禁用 dm_verity

啓用 dm_verity

adb root
adb enable-verity
Sh

禁用 dm_verity

adb root
adb disable-verity
Sh

15. 更多 adb shell 命令

Android 系統是基於 Linux 內核的,因此 Linux 裏的不少命令在 Android 裏也有相同或相似的實現,在adb shell 裏能夠調用。本文檔前面的部份內容已經用到了 adb shell 命令。

15.1. 查看進程

命令:

adb shell ps
Sh

輸出示例:

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

各列含義:

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

15.2. 查看實時資源佔用狀況

命令:

adb shell top
Sh

輸出示例:

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

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

各列含義:

列名 含義
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 進程名

top 命令還支持一些命令行參數,詳細用法以下:

Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
    -m num  最多顯示多少個進程
    -n num  刷新多少次後退出
    -d num  刷新時間間隔(單位秒,默認值 5)
    -s col  按某列排序(可用 col 值:cpu, vss, rss, thr)
    -t      顯示線程信息
    -h      顯示幫助文檔
Sh

15.3. 查看進程 UID

有兩種方案:

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

    如:

    > adb shell dumpsys package org.mazhuang.guanggoo | grep userId=
       userId=10394
    Sh
  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:/ $
    Sh

15.4. 其它

以下是其它經常使用命令的簡單描述,前文已經專門講過的命令再也不額外說明:

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

© 2019 劉士. All rights reserved.

相關文章
相關標籤/搜索