adb

基本用法

转载:https://github.com/mzlogin/awesome-adb#%E5%91%BD%E4%BB%A4%E8%AF%AD%E6%B3%95

# 基本语法
adb [-d|-e|-s <serialNumber>] <command>

# 获取serialNumber
adb devices       #state:offline(设备无响应),device(已连接)

# 停止 adb server
adb kill-server

# 查看 adb 版本
adb version

# 指定 adb server 的网络端口
adb -P <port> start-server

如果只有一个设备/模拟器连接时,可以省略掉 [-d|-e|-s <serialNumber>]

参数 含义
-d 指定当前唯一通过 USB 连接的 Android 设备为命令目标
-e 指定当前唯一运行的模拟器为命令目标
-s <serialNumber> 指定相应 serialNumber 号的设备/模拟器为命令目标

应用管理

查看应用列表

adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
参数 显示列表
所有应用
-f 显示应用关联的 apk 文件
-d 只显示 disabled 的应用
-e 只显示 enabled 的应用
-s 只显示系统应用
-3 只显示第三方应用
-i 显示应用的 installer
-u 包含已卸载应用
<FILTER> 包名包含 <FILTER> 字符串
# 只显示系统应用
adb shell pm list packages -s
# 只显示第三方应用
adb shell pm list packages -3

安装APK

adb install [-lrtsdg] <path_to_apk>
参数 含义
-l 将应用安装到保护目录 /mnt/asec
-r 允许覆盖安装
-t 允许安装 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的应用
-s 将应用安装到 sdcard
-d 允许降级覆盖安装
-g 授予所有运行时权限
–abi abi-identifier 为特定 ABI 强制安装 apk,abi-identifier 可以是 armeabi-v7a、arm64-v8a、v86、x86_64 等

卸载应用

adb uninstall [-k] <packagename>

<packagename> 表示应用的包名,-k 参数可选,表示卸载应用但保留数据和缓存目录。

查看前台 Activity

adb shell dumpsys activity activities|grep mResumedActivity
    mResumedActivity: ActivityRecord{3b0f52a u0 com.sec.android.app.launcher/.activities.LauncherActivity t319}

其中的 com.sec.android.app.launcher/.activities.LauncherActivity 就是当前处于前台的 Activity。

查看正在运行的 Services

adb shell dumpsys activity services [<packagename>]

<packagename> 参数不是必须的,指定 <packagename> 表示查看与某个包名相关的 Services,不指定表示查看所有 Services。支持模糊查询。

查看应用详细信息

adb shell dumpsys package <packagename>

输出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。

<packagename> 表示应用包名。

查看应用安装路径

adb shell pm path <PACKAGE>

# 例子
adb shell pm path com.duowan.kiwi
package:/data/app/com.duowan.kiwi-VE9yzwMQsuqqif2U5u9Hgw==/base.apk

与应用交互

主要是使用 am <command> 命令

command 用途
start [options] <INTENT> 启动 <INTENT> 指定的 Activity
startservice [options] <INTENT> 启动 <INTENT> 指定的 Service
broadcast [options] <INTENT> 发送 <INTENT> 指定的广播
force-stop <packagename> 停止 <packagename> 相关的进程

用于决定 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 `
--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

指定Activity名称启动

adb shell am start [options] <INTENT>

例如:

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

不指定Activity名称启动(启动主Activity)

adb shell monkey -p <packagename> -c android.intent.category.LAUNCHER 1

例如:

adb shell monkey -p com.tencent.mm -c android.intent.category.LAUNCHER 1

表示调起微信主界面。

调起 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

这类用法在测试的时候很实用,比如某个广播的场景很难制造,可以考虑通过这种方式来发送广播。

强制停止应用

adb shell am force-stop <packagename>

收紧内存

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

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

例如

adb shell am send-trim-memory 12345 RUNNING_LOW

表示向 pid=12345 的进程,发出 level=RUNNING_LOW 的收紧内存命令。

文件管理

复制设备里的文件到电脑

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 里有个很实用的命令叫 inputinput 命令的完整 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)

查看日志

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 -c

格式

比如long格式:

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

示例:

[ 07-28 20:16:03.089  1357: 1357 I/WifiConnectivityMonitor ]
ACTION_SERVICE_STATE_CHANGED: cn

指定格式可与上面的过滤同时使用。比如:

adb logcat -v long ActivityManager:I *:S

内核日志

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 dumpsys window displays

还能看到前后台app的信息

android_id

adb shell settings get secure android_id

输出示例:

2741c803b9501b3a

Android 系统版本

adb shell getprop ro.build.version.release

输出示例:

5.0.2

CPU信息

adb shell cat /proc/cpuinfo

输出示例:

Processor    : AArch64 Processor rev 13 (aarch64)
processor    : 0
BogoMIPS    : 38.40
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer    : 0x51
CPU architecture: 8
CPU variant    : 0x7
CPU part    : 0x803
CPU revision    : 12

processor    : 1
BogoMIPS    : 38.40
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer    : 0x51
CPU architecture: 8
CPU variant    : 0x7
CPU part    : 0x803
CPU revision    : 12

processor    : 2
BogoMIPS    : 38.40
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer    : 0x51
CPU architecture: 8
CPU variant    : 0x7
CPU part    : 0x803
CPU revision    : 12

processor    : 3
BogoMIPS    : 38.40
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer    : 0x51
CPU architecture: 8
CPU variant    : 0x7
CPU part    : 0x803
CPU revision    : 12

processor    : 4
BogoMIPS    : 38.40
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer    : 0x51
CPU architecture: 8
CPU variant    : 0x6
CPU part    : 0x802
CPU revision    : 13

processor    : 5
BogoMIPS    : 38.40
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer    : 0x51
CPU architecture: 8
CPU variant    : 0x6
CPU part    : 0x802
CPU revision    : 13

processor    : 6
BogoMIPS    : 38.40
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer    : 0x51
CPU architecture: 8
CPU variant    : 0x6
CPU part    : 0x802
CPU revision    : 13

processor    : 7
BogoMIPS    : 38.40
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer    : 0x51
CPU architecture: 8
CPU variant    : 0x6
CPU part    : 0x802
CPU revision    : 13

Hardware    : Qualcomm Technologies, Inc SDM845

这是 SM-G9650 的 CPU 信息,我们从输出里可以看到使用的硬件是 Qualcomm Technologies,processor 的编号是 0 到 8,所以它是八核的,采用的架构是 AArch64 Processor rev 13 (aarch64)

内存信息

adb shell cat /proc/meminfo

输出示例:

emTotal:        5713076 kB
MemFree:          256604 kB
MemAvailable:    3030428 kB
Buffers:          169656 kB
Cached:          2573432 kB
SwapCached:        62232 kB
Active:          2302792 kB
Inactive:        1728628 kB
Active(anon):     702956 kB
Inactive(anon):   605688 kB
Active(file):    1599836 kB
Inactive(file):  1122940 kB
Unevictable:        9900 kB
Mlocked:            9900 kB
RbinTotal:        593920 kB
RbinAlloced:           0 kB
RbinPool:              0 kB
RbinFree:              0 kB
SwapTotal:       2621436 kB
SwapFree:        2056556 kB
Dirty:               160 kB
Writeback:             0 kB
AnonPages:       1291056 kB
Mapped:           779792 kB
Shmem:             17748 kB
Slab:             364484 kB
SReclaimable:     159248 kB
SUnreclaim:       205236 kB
KernelStack:       54464 kB
PageTables:        96608 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     5477972 kB
Committed_AS:   116679068 kB
VmallocTotal:   263061440 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
CmaTotal:         237568 kB
CmaFree:           35708 kB

其中,MemTotal 就是设备的总内存,MemFree 是当前空闲内存。

修改设置

注: 修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行 adb reboot 重启设备,或手动重启。

修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的设置值。

关闭USB调试模式

adb shell settings put global adb_enabled 0

恢复:

用命令恢复不了了,毕竟关闭了 USB 调试 adb 就连接不上 Android 设备了。

去设备上手动恢复吧:「设置」-「开发者选项」-「Android 调试」。

允许/禁止访问非 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

禁止访问非 SDK API:

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

不需要设备获得 Root 权限。

命令最后的数字的含义:

含义
0 禁止检测非 SDK 接口的调用。该情况下,日志记录功能被禁用,并且令 strict mode API,即 detectNonSdkApiUsage() 无效。不推荐。
1 仅警告——允许访问所有非 SDK 接口,但保留日志中的警告信息,可继续使用 strick mode API。
2 禁止调用深灰名单和黑名单中的接口。
3 禁止调用黑名单中的接口,但允许调用深灰名单中的接口。

通过adb shell进入安卓shell后如何退出?

Ctrl+C无法退出shell;

直接输入 exit 即可


   转载规则


《adb》 锦泉 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录