ADB常用命令

来源:https://www.cnblogs.com/hyf20131113/archive/2019/04/12/10697738.html
-Advertisement-
Play Games

基本用法 命令語法 adb 命令的基本語法如下: adb [-d|-e|-s <serialNumber>] <command> 如果只有一個設備/模擬器連接時,可以省略掉 [-d|-e|-s <serialNumber>] 這一部分,直接使用 adb <command>。 為命令指定目標設備 如果 ...


基本用法

命令語法

adb 命令的基本語法如下:

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

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

為命令指定目標設備

如果有多個設備/模擬器連接,則需要為命令指定目標設備。

參數含義
-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

輸出里的 cf264b8femulator-555410.129.164.6:5555 即為 serialNumber。

比如這時想指定 cf264b8f 這個設備來運行 adb 命令獲取屏幕解析度:

adb -s cf264b8f shell wm size

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

adb -s 10.129.164.6:5555 install test.apk

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

啟動/停止

啟動 adb server 命令:

adb start-server

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

停止 adb server 命令:

adb kill-server

查看 adb 版本

命令:

adb version

示例輸出:

Android Debug Bridge version 1.0.36
Revision 8f855a3d9b35-android

以 root 許可權運行 adbd

adb 的運行原理是 PC 端的 adb server 與手機端的守護進程 adbd 建立連接,然後 PC 端的 adb client 通過 adb server 轉發命令,adbd 接收命令後解析運行。

所以如果 adbd 以普通許可權執行,有些需要 root 許可權才能執行的命令無法直接用 adb xxx 執行。這時可以 adb shell 然後 su 後執行命令,也可以讓 adbd 以 root 許可權執行,這個就能隨意執行高許可權命令了。

命令:

adb root

正常輸出:

restarting adbd as root

現在再運行 adb shell,看看命令行提示符是不是變成 # 了?

有些手機 root 後也無法通過 adb root 命令讓 adbd 以 root 許可權執行,比如三星的部分機型,會提示 adbd cannot run as root in production builds,此時可以先安裝 adbd Insecure,然後 adb root 試試。

相應地,如果要恢復 adbd 為非 root 許可權的話,可以使用 adb unroot 命令。

指定 adb server 的網路埠

命令:

adb -P <port> start-server

預設埠為 5037。

設備連接管理

查詢已連接設備/模擬器

命令:

adb devices

輸出示例:

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

輸出格式為 [serialNumber] [state],serialNumber 即我們常說的 SN,state 有如下幾種:

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

  • device —— 設備已連接。註意這個狀態並不能標識 Android 系統已經完全啟動和可操作,在設備啟動過程中設備實例就可連接到 adb,但啟動完畢後系統才處於可操作狀態。

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

以上輸出顯示當前已經連接了三台設備/模擬器,cf264b8femulator-555410.129.164.6:5555 分別是它們的 SN。從 emulator-5554 這個名字可以看出它是一個 Android 模擬器,而 10.129.164.6:5555 這種形為 <IP>:<Port> 的 serialNumber 一般是無線連接的設備或 Genymotion 等第三方 Android 模擬器。

常見異常輸出:

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

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

    List of devices attached
    cf264b8f offline
    

USB 連接

通過 USB 連接來正常使用 adb 需要保證幾點:

  1. 硬體狀態正常。

    包括 Android 設備處於正常開機狀態,USB 連接線和各種介面完好。

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

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

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

  3. 設備驅動狀態正常。

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

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

    adb devices
    

    如果能看到

    xxxxxx device
    

    說明連接成功。

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

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

操作步驟:

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

  2. 將設備與電腦通過 USB 線連接。

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

  3. 讓設備在 5555 埠監聽 TCP/IP 連接:

    adb tcpip 5555
    
  4. 斷開 USB 連接。

  5. 找到設備的 IP 地址。

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

  6. 通過 IP 地址連接設備。

    adb connect <device-ip-address>
    

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

  7. 確認連接狀態。

    adb devices
    

    如果能看到

    <device-ip-address>:5555 device
    

    說明連接成功。

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

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

斷開無線連接

命令:

adb disconnect <device-ip-address>

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

註:需要 root 許可權。

上一節「無線連接(需要藉助 USB 線)」是官方文檔里介紹的方法,需要藉助於 USB 數據線來實現無線連接。

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

  1. 在 Android 設備上安裝一個終端模擬器。

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

  2. 將 Android 設備與要運行 adb 的電腦連接到同一個區域網,比如連到同一個 WiFi。

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

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

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

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

    adb connect <device-ip-address>
    

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

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

節註一:

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

restart adbd

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

stop adbd
start adbd

應用管理

查看應用列表

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

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

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

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

所有應用

命令:

adb shell pm list packages

輸出示例:

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

系統應用

命令:

adb shell pm list packages -s

第三方應用

命令:

adb shell pm list packages -3

包名包含某字元串的應用

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

adb shell pm list packages mazhuang

當然也可以使用 grep 來過濾:

adb shell pm list packages | grep mazhuang

安裝 APK

命令格式:

adb install [-lrtsdg] <path_to_apk>

參數:

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

上面是當前最新版 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

而如果狀態為 Failure 則表示安裝失敗,比如:

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

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

輸出含義解決辦法
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 訪問失敗;<br />2. 應用簽名與 ROM 簽名一致,被當作內置應用。 1. 確認 sdcard 可用,或者安裝到內置存儲;<br />2. 打包時不與 ROM 使用相同簽名。
INSTALL_FAILED_INVALID_INSTALL_LOCATION 1. 不能安裝到指定位置;<br />2. 應用簽名與 ROM 簽名一致,被當作內置應用。 1. 切換安裝位置,添加或刪除 -s 參數;<br />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 應用程式與設備不相容  
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 文件。

所以,必要的時候也可以根據這個步驟,手動分步執行安裝過程。

卸載應用

命令:

adb uninstall [-k] <packagename>

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

命令示例:

adb uninstall com.qihoo360.mobilesafe

表示卸載 360 手機衛士。

清除應用數據與緩存

命令:

adb shell pm clear <packagename>

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

命令示例:

adb shell pm clear com.qihoo360.mobilesafe

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

查看前臺 Activity

命令:

adb shell dumpsys activity activities | grep mFocusedActivity

輸出示例:

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

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

查看正在運行的 Services

命令:

adb shell dumpsys activity services [<packagename>]

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

<packagename> 不一定要給出完整的包名,比如運行 adb shell dumpsys activity services org.mazhuang,那麼包名 org.mazhuang.demo1org.mazhuang.demo2org.mazhuang123 等相關的 Services 都會列出來。

查看應用詳細信息

命令:

adb shell dumpsys package <packagename>

輸出中包含很多信息,包括 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]

與應用交互

主要是使用 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> <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 數組

調起 Activity

命令格式:

adb shell am start [options] <INTENT>

例如:

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

表示調起微信主界面。

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

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

調起 Service

命令格式:

adb shell am startservice [options] <INTENT>

例如:

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

表示調起微信的某 Service。

發送廣播

命令格式:

adb shell am broadcast [options] <INTENT>

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

例如,向所有組件廣播 BOOT_COMPLETED

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

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

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

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

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

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

強制停止應用

命令:

adb shell am force-stop <packagename>

命令示例:

adb shell am force-stop com.qihoo360.mobilesafe

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

文件管理

複製設備里的文件到電腦

命令:

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

其中 電腦上的目錄 參數可以省略,預設複製到當前目錄。

例:

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

小技巧:設備上的文件路徑可能需要 root 許可權才能訪問,如果你的設備已經 root 過,可以先使用 adb shellsu 命令在 adb shell 里獲取 root 許可權後,先 cp /path/on/device /sdcard/filename 將文件複製到 sdcard,然後 adb pull /sdcard/filename /path/on/pc

複製電腦里的文件到設備

命令:

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

例:

adb push ~/sr.mp4 /sdcard/

小技巧:設備上的文件路徑普通許可權可能無法直接寫入,如果你的設備已經 root 過,可以先 adb push /path/on/pc /sdcard/filename,然後 adb shellsu 在 adb shell 里獲取 root 許可權後,cp /sdcard/filename /path/on/device

模擬按鍵/輸入

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)

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

電源鍵

命令:

adb shell input keyevent 26

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

菜單鍵

命令:

adb shell input keyevent 82

HOME 鍵

命令:

adb shell input keyevent 3

返回鍵

命令:

adb shell input keyevent 4

音量控制

增加音量:

adb shell input keyevent 24

降低音量:

adb shell input keyevent 25

靜音:

adb shell input keyevent 164

媒體控制

播放/暫停:

adb shell input keyevent 85

停止播放:

adb shell input keyevent 86

播放下一首:

adb shell input keyevent 87

播放上一首:

adb shell input keyevent 88

恢復播放:

adb shell input keyevent 126

暫停播放:

adb shell input keyevent 127

點亮/熄滅屏幕

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

點亮屏幕:

adb shell input keyevent 224

熄滅屏幕:

adb shell input keyevent 223

滑動解鎖

如果鎖屏沒有密碼,是通過滑動手勢解鎖,那麼可以通過 input swipe 來解鎖。

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

adb shell input swipe 300 1000 300 500

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

輸入文本

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

命令:

adb shell input text hello

現在 hello 出現在文本框了。

查看日誌

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

Android 日誌

命令格式:

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

常用用法列舉如下:

按級別過濾日誌

Android 的日誌分為如下幾個優先順序(priority):

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

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

比如,命令:

adb logcat *:W

會將 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

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

日誌格式

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

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

  • brief

    預設格式。格式為:

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

    示例:

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

    格式為:

    <priority>(<pid>) <message>
    

    示例:

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

    格式為:

    <priority>/<tag>: <message>
    

    示例:

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

    格式為:

    <message>
    

    示例:

    Disconnected process message: 10, size: 0
    
  • time

    格式為:

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

    示例:

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

    格式為:

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

    示例:

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

    格式為:

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

    示例:

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

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

adb logcat -v long ActivityManager:I *:S

清空日誌

adb logcat -c

內核日誌

命令:

adb shell dmesg

輸出示例:

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

中括弧里的 [14201.684016] 代表內核開始啟動後的時間,單位為秒。

通過內核日誌我們可以做一些事情,比如衡量內核啟動時間,在系統啟動完畢後的內核日誌里找到 Freeing init memory 那一行前面的時間就是。

查看設備信息

型號

命令:

adb shell getprop ro.product.model

輸出示例:

Nexus 5

電池狀況

命令:

adb shell dumpsys battery

輸入示例:

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

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

屏幕解析度

命令:

adb shell wm size

輸出示例:

Physical size: 1080x1920

該設備屏幕解析度為 1080px * 1920px。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 類型:View Owner: SYS 內容: 記錄了該用戶可訪問的所有資料庫對象的腳本信息(DDL) 欄位: OWNER: 對象的Owner NAME: 對象名稱 TYPE: 對象類型,如FUNCTION, JAVA SOURCE, PACKAGE, PACKAGE BODY, PROCEDURE, ...
  • 6.5 事務實現原理之1:Redo Log 介紹事務怎麼用後,下麵探討事務的實現原理。事務有ACID四個核心屬性:A:原子性。事務要麼不執行,要麼完全執行。如果執行到一半,宕機重啟,已執行的一半要回滾回去。C:一致性。各種約束條件,比如主鍵不能為空、參照完整性等。I:隔離性。隔離性和併發性密切相關, ...
  • > 本文節選自《軟體架構設計:大型網站技術架構與業務架構融合之道》第6.4章節。 作者微信公眾號:> 架構之道與術。進入後,可以加入書友群,與作者和其他讀者進行深入討論。也可以在京東、天貓上購買紙質書。 ## 6.5.5 Redo Log Block結構 Log Block還需要有Check sum ...
  • 參數說明: p_jsonstr:目標JSON字元串 startkey:需要截取的JSON內容key值 endkey:目標key的下一個key 舉例說明:select parsejsonstr(INFO,'AGE', 'HEIGHT') from TTTT 圖為TTTT表中的內容,例子為截取INFO中 ...
  • 本文主要是簡單介紹一下Flink基礎信息,更多有關Flink的介紹可以查看 "官方文檔" 。 Big Data "wikipedia" 大數據(Big data),又稱為巨量資料,指的是傳統數據處理應用軟體不足以處理它們的大或複雜的數據集的術語。大數據也可以定義為來自各種來源的大量非結構化或結構化數 ...
  • MR匯聚工具步驟 1、需要連上141伺服器 用戶:root 密碼:Richr00t-- 2、【MR匯聚工具】--3、位置 141目錄下進入後切換fast用戶 su fast /home/fast/luohai/Projects 第一步首先需要創建外部表 【MR定位表建立工具】--4、建立MR定位數據 ...
  • oracle數據入庫 註意:先要處理文件中的分隔符 將數據分列 創建為標準的sql語句 oracle數據入庫 1.在oracle資料庫中創建要入庫的表如果有該表則不用創建(註:創建欄位的數據類型要符合實際邏輯 varchar2欄位最大為4000) 2.把csv文件放入到伺服器上的文件夾中 要和ctl ...
  • 作者:CHEN川 www.jianshu.com/p/d7665192aaaf 說起MySQL的查詢優化,相信大家積累一堆技巧:不能使用SELECT *、不使用NULL欄位、合理創建索引、為欄位選擇合適的數據類型….. 你是否真的理解這些優化技巧?是否理解其背後的工作原理?在實際場景下性能真有提升嗎 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...