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

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