adb调试之am命令详解

楚宪
2023-12-01

概述

作为一名开发者,相信对adb指令一定不会陌生。那么在手机连接adb后,可通过am命令做很多操作:

  • 拨打电话:通过adb,可以直接拨打电话10086
adb shell am start -a android.intent.action.CALL -d tel:10086
adb shell am start -a android.intent.action.VIEW -d  https://www.baidu.com
  • 启动应用:比如,启动包名为com.android.example,主Activity为.MainActivity,且extra数据以”website”为key, “www.baidu.com”为value。通过java代码要完成该功能虽然不复杂,但至少需要一个android环境,而通过adb的方式,只需要在adb窗口,输入如下命令便可完成
am start -n com.android.example/.MainActivity -es website www.baidu.com

am 命令

am 命令列表

命令格式如下:

am [subcommand] [options]

命令列表如下:

命令功能实现方法
am start [options] 启动ActivitystartActivityAsUser
am startservice 启动ServicestartService
am stopservice 停止ServicestopService
am broadcast 发送广播broadcastIntent
am kill 杀指定后台进程killBackgroundProcesses
am kill-all杀所有后台进程killAllBackgroundProcesses
am force-stop 强杀进程forceStopPackage
am hang系统卡住hang
am restart重启restart
am bug-report创建bugreportrequestBugReport
am dumpheap 进程pid的堆信息输出到filedumpheap
am send-trim-memory 收紧进程的内存setProcessMemoryTrimLevel
am monitor监控MyActivityController.run

am命令实的实现方式在Am.java,最终几乎都是调用ActivityManagerService相应的方法来完成:

  • 比如命令am start -a android.intent.action.VIEW -d https://www.baidu.com, 启动Acitivty最终调用的是ActivityManagerService类的startActivityAsUser()方法来完成的
  • 再比如 am kill-all命令,最终的实现工作是由ActivityManagerService的killBackgroundProcesses()方法完成的

接下来,说说[options]和 参数含义和使用

Activity 启动命令

先来介绍一下启动Activity命令am start [options] 使用options参数,接下来列举Activity命令的[options]参数:

参数意义
-D允许调试功能
-W等待app启动完成
-R <COUNT>重复启动Activity COUNT次
-S启动activity之前,先调用forceStopPackage()方法强制停止app
-opengl -trace运行获取OpenGL函数的trace
-user <USER_ID>current: 指定用户来运行App,默认为当前用户
-start -profiler <FILE>启动profiler,并将结果发送到 <FILE>
-P <FILE>类似 -start -profiler,不同的是当app进入idle状态,则停止profiling
-sampling INTERVAL设置profiler 取样时间间隔,单位ms

启动Activity的实现原理: 存在-W参数则调用startActivityAndWait()方法来运行,否则startActivityAsUser()

trim-memory 命令

收紧内存命令:

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

例如: 向pid=12345的进程,发出level=RUNNING_LOW的收紧内存命令:

am send-trim-memory 12345 RUNNING_LOW

level取值范围为: HIDDEN、RUNNING_MODERATE、BACKGROUND、RUNNING_LOW、MODERATE、RUNNING_CRITICAL、COMPLETE

Intent 参数

Intent的参数和flags较多,本文为方便起见,分为3种类型参数,常用参数,Extra参数,Flags参数

1. 常用参数
参数意义
-a <ACTION>指定Intent action, 实现原理Intent.setAction()
-n <COMPONENT>指定组件名,格式为{包名}/.{主Activity名},实现原理Intent.setComponent()
-d <DATA_URI>指定Intent data URI
-t <MIME_TYPE>指定Intent MIME Type
-c <CATEGORY> [-c <CATEGORY>] …]指定Intent category,实现原理Intent.addCategory()
-p <PACKAGE>指定包名,实现原理Intent.setPackage()
-f <FLAGS>添加flags,实现原理Intent.setFlags(int ),紧接着的参数必须是int型

实例:

am start -a android.intent.action.VIEW
am start -n com.android.example/.MainActivity
am start -d content://contacts/people/1
am start -t image/png
am start -c android.intent.category.APP_CONTACTS
2. Extra 参数

A. 基本类型

参数-e/-es-esn-ez-ei-el-ef-eu-ecn
类型String(String)nullbooleanintlongfloaturicomponent

比如参数es是Extra String首字母简称,实例:

am start -n com.android.example/.MainActivity -es website www.baidu.com

此处-es website www.baidu.com,等价于Intent.putExtra(“website”, “www.baidu.com”)

B. 数组类型

参数-esa-eia-ela-efa
数组类型String[]int[]long[]float[]

比如参数eia,是Extra int array首字母简称,多个value值之间以逗号隔开,实例:

am start -n com.android.example/.MainActivity -ela weekday 1,2,3,4,5

此处-ela weekday 1,2,3,4,5,等价于Intent.putExtra(“weekday”, new int[]{1,2,3,4,5})

C. ArrayList 类型

参数-esal-eial-elal-efal
List类型Stringintlongfloat

比如参数efal,是Extra float Array List首字母简称,多个value值之间以逗号隔开,实例:

am start -n com.android.example/.MainActivity -efal nums 1.2,2.2

此处-efal nums 1.2,2.2,等价于先构造ArrayList变量,再通过putExtra放入第二个参数

3. Flags 参数

在参数类型中,提到有-f <FLAGS>,是通过Intent.setFlags(int )方法,来设置Intent的flags.本小节也是关于flags,是通过Intent.addFlags(int )方法。如下所示,所有的flags参数:

[--grant-read-uri-permission] [--grant-write-uri-permission]
[--grant-persistable-uri-permission] [--grant-prefix-uri-permission]
[--debug-log-resolution]
[--exclude-stopped-packages] [--include-stopped-packages]
[--activity-brought-to-front] [--activity-clear-top]
[--activity-clear-when-task-reset] [--activity-exclude-from-recents]
[--activity-launched-from-history] [--activity-multiple-task]
[--activity-no-animation] [--activity-no-history]
[--activity-no-user-action] [--activity-previous-is-top]
[--activity-reorder-to-front] [--activity-reset-task-if-needed]
[--activity-single-top] [--activity-clear-task]
[--activity-task-on-home]
[--receiver-registered-only] [--receiver-replace-pending]

例如,发送action=”broadcast.demo”的广播,并且对于forceStopPackage()的应用不允许接收该广播,命令如下:

am broadcast -a broadcast.demo --exclude-stopped-packages
 类似资料: