Android開發日常之adb

學無止境,有一技旁身,至少不至於孤陋寡聞。
隨着我們工作閱歷的提升,除了基本的業務開發,也需要提升我們自身在開發效能方面的一些儲備與筆記。

Android開發日常之gradle
Android開發日常之adb
Android開發日常之git
Android開發日常之shell alias

adb的全稱爲Android Debug Bridge,通過adb可以方便我們調試Android程序。作爲開發人員,掌握所需要的adb操作命令是非常必須的,就把平時工作中用得相對比較多的adb命令做個梳理。

ADB常用命令

  1. 啓動/停止adb server命令

    adb start-server  //啓動命令
    adb kill-server   //停止命令
    
  2. adb連接設備命令
    adb [-d|-e|-s ]
    如果只有一個設備/模擬器連接時,可以省略掉 [-d|-e|-s ] 這一部分,直接使用 adb即可 。
    如果有多個設備/模擬器連接,則需要爲命令指定目標設備。

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

    在多個設備/模擬器連接的情況下較常用的是-s參數,serialNumber 可以通過adb devices命令獲取。如:

    $ adb devices
    List of devices attached
    cfxxxxxx device
    emulator-5554    device
    10.xxx.xxx.x:5555    device
    

    輸出裏的 cfxxxxxx、emulator-5554 和 10.xxx.xxx.x:5555 即爲 serialNumber。
    比如這時想指定 cfxxxxxx 這個設備來運行 adb 命令
    獲取屏幕分辨率:

    adb -s cfxxxxxx shell wm size
    

    安裝應用:

    adb -s cfxxxxxx install hello.apk
    

    遇到多設備/模擬器的情況均使用這幾個參數爲命令指定目標設備。

  3. 查詢已連接設備/模擬器
    adb devices

  4. 安裝 APK
    命令格式:

    adb install [-rtsdg] <apk_path>
    

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

    參數 含義
    -r 允許覆蓋安裝
    -t 允許安裝 AndroidManifest.xml 裏 application 指定 android:testOnly="true" 的應用
    -s 將應用安裝到 sdcard
    -d 允許降級覆蓋安裝
    -g 授予所有運行時權限
  1. 卸載應用
    adb uninstall [-k] <packagename>
    
    <packagename> 表示應用的包名,-k 參數可選,表示卸載應用但保留數據和緩存目錄。
    adb uninstall com.xxx.xxx
    
  2. 查看前臺 Activity
    adb shell dumpsys activity activities | grep ResumedActivity
    
    查看棧頂activity
    adb shell dumpsys activity
    ACTIVITY MANAGER PENDING INTENTS (dumpsys activity intents)
    ...
    ACTIVITY MANAGER BROADCAST STATE (dumpsys activity broadcasts)
    ...
    ACTIVITY MANAGER CONTENT PROVIDERS (dumpsys activity providers)
    ...
    ACTIVITY MANAGER SERVICES (dumpsys activity services)
    ...
    ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
    ...
    ACTIVITY MANAGER RUNNING PROCESSES (dumpsys activity processes)
    ...
    
  3. 查看設備信息
    1. 查看手機型號
      adb shell getprop ro.product.model
    2. 查看電池狀況
      adb shell dumpsys battery
    3. 查看屏幕分辨率
      adb shell wm size
    4. 查看屏幕密度
      adb shell wm density
    5. 查看顯示屏參數
      adb shell dumpsys window displays
    6. 查看Android系統版本
      adb shell getprop ro.build.version.release
    7. 查看CPU信息
      adb shell cat /proc/cpuinfo
      查看手機CPU架構
      adb shell getprop ro.product.cpu.abi
    8. 查看內存信息
      adb shell cat /proc/meminfo
    9. 打開系統設置:
      adb shell am start -n com.android.settings/com.android.settings.Settings
    10. 打開開發者選項:
      adb shell am start -a com.android.settings.APPLICATION_DEVELOPMENT_SETTINGS
    11. 進入WiFi設置
      adb shell am start -a android.settings.WIRELESS_SETTINGS
    12. 重啓系統
      adb reboot
    13. 日誌相關
      adb logcat > ~/logdebug.log
      adb logcat | grep logtag
      adb logcat | grep -i logtag #忽略大小寫。

      adb logcat | grep --color=auto -i logtag #設置匹配字符串顏色。

ADB其他命令

  1. 清除應用數據與緩存

    adb shell pm clear <packagename>
    

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

    adb shell pm clear com.xxx.xxx
    
  2. 與應用交互操作
    主要是使用 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>`
    --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 數組
    1. 調起Activity

      adb shell am start [options] <INTENT>
      

      例如:

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

      表示調起微信主界面。

      adb shell am start -n com.cc.test/.MainActivity --es "params" "hello, world"
      

      表示調起 com.cc.test/.MainActivity 並傳給它 string 數據鍵值對 params - hello, world。

    2. 調起Service

      adb shell am startservice [options] <INTENT>
      

      例如:

      adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
      
    3. 發送廣播

      adb shell am broadcast [options] <INTENT>
      

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

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

      又例如,只向 com.cc.test/.BootCompletedReceiver 廣播 BOOT_COMPLETED:

      adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.cc.test/.BootCompletedReceiver
      
    4. 強制停止應用

      adb shell am force-stop <packagename>
      

      命令示例:

      adb shell am force-stop com.xxx.xxx
      
    5. 撤銷應用程序的權限

      1. 嚮應用授予權限。只能授予應用程序聲明的可選權限
      adb shell pm grant <packagename> <PACKAGE_PERMISSION>
      

      例如:adb -d shell pm grant packageName android.permission.BATTERY_STATS

      1. 取消應用授權
      adb shell pm revoke <packagename> <PACKAGE_PERMISSION>
      
  3. 模擬按鍵/輸入

    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)
    

    比如模擬點擊://在屏幕上點擊座標點x=50 y=250的位置。

    adb shell input tap 50 250

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章