使用am start命令启动android apk应用程序
代码语言:javascript复制am start -n {包(package)名}/{包名}.{活动(activity)名称}
启动tbox service test apk adb root adb shell am start -n com.demo.hmi.xxxservices.xxx/.MainActivity
程序的入口类可以从每个应用的AndroidManifest.xml的文件中得到; 启动的方法可以从每个应用的AndroidManifest.xml的文件中得到;
还可以使用 pm 和 dumpsys命令得知 这种情况下,只知道一个apk名字,也没有打开使用过,则使用
代码语言:javascript复制pm list package #列出全部的包名,在这些包名中找出和apk相似的包 如 com.demo.hmi.onstarservices.tbox
dumpsys package com.demo.hmi.onstarservices.tbox #列出包的信息如下
代码语言:javascript复制Activity Resolver Table:
Non-Data Actions:
android.intent.action.MAIN:
a738865 com.demo.hmi.onstarservices.tbox/.MainActivity filter 5b39c16
Action: "android.intent.action.MAIN"
Action: "android.intent.action.onstarservices.tbox"
Category: "android.intent.category.LAUNCHER"
android.intent.action.onstarservices.tbox:
a738865 com.demo.hmi.onstarservices.tbox/.MainActivity filter 5b39c16
Action: "android.intent.action.MAIN"
Action: "android.intent.action.onstarservices.tbox"
Category: "android.intent.category.LAUNCHER"
Key Set Manager:
[com.demo.hmi.onstarservices.tbox]
Signing KeySets: 11
Packages:
Package [com.demo.hmi.onstarservices.tbox] (9de093a):
userId=10060
pkg=Package{735c9eb com.demo.hmi.onstarservices.tbox}
codePath=/system/app/TboxServiceTest.apk
resourcePath=/system/app/TboxServiceTest.apk
legacyNativeLibraryDir=/system/lib64/TboxServiceTest
primaryCpuAbi=null
secondaryCpuAbi=null
versionCode=1 minSdk=15 targetSdk=28
versionName=1.0
splits=[base]
apkSigningVersion=1
applicationInfo=ApplicationInfo{c2ec348 com.demo.hmi.onstarservices.tbox}
flags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
privateFlags=[ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION ]
dataDir=/data/user/0/com.demo.hmi.onstarservices.tbox
supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]
timeStamp=2020-01-07 15:07:00
firstInstallTime=2020-01-07 15:07:00
lastUpdateTime=2020-01-07 15:07:00
signatures=PackageSignatures{11945e1 version:1, signatures:[77f655d], past signatures:[]}
installPermissionsFixed=false
pkgFlags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
User 0: ceDataInode=796 installed=true hidden=false suspended=false stopped=false notLaunched=false enabled=0 instant=false virtual=false
runtime permissions:
Package Changes:
Sequence number=0
Dexopt state:
[com.demo.hmi.onstarservices.tbox]
path: /system/app/TboxServiceTest.apk
arm64: [status=verify] [reason=boot]
Compiler stats:
[com.demo.hmi.onstarservices.tbox]
其中有如下一行
代码语言:javascript复制a738865 com.demo.hmi.onstarservices.tbox/.MainActivity
可知要启动的package和activity
代码语言:javascript复制am start com.demo.hmi.onstarservices.tbox/.MainActivity
压测中经常会用到am start
命令去进行操作,基本上也只用到 am start -n
和 am start -a ** -d **
,后来测试activity启动用到了am start -W
,才惊觉这个命令的功能还是很强大的
-
am start -n <Activity>
解释:启动一个activity e.g. am start -n com.android.settings/.Settings 启动android原生设置的一级页面 -
am start -a <Activity> -d <parameter>
解释: 启动一个activity同时传入-d后面的参数 e.g. am start -a android.intent.action.CALL -d tel:10086 打开拨号盘并拨打电话给10086 am start -a android.intent.action.VIEW geo:0,0?q=beijing 启动google键盘并定位到北京 -
am start -D <Activity>
解释:将应用设置成可调式模式,打开会提示waiting for debugger,方便调试那些在打开过程中产生的bug。 -
am start -W <Activity>
解释:等待完全启动,并记录了启动时间 e.g.am start -W com.android.settings/.Settings
应用完全启动,并记录启动时间,结果如下:
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.settings/.Settings
Status: ok
Activity: com.android.settings/.MiuiSettings
ThisTime: 414
TotalTime: 718
WaitTime: 801
Complete
-
am start -P <FILE>
解释:类似 –start-profiler,不同的是当app进入idle状态,则停止profiling -
am start -S
解释:启动activity之前,需要先调用forceStopPackage()方法强制停止应用,比如如果activity打开,-n只会重新起一遍activity,-S会杀掉原来的应用,重新启动activity -
am start --opengl-trace
解释:运行获取OpenGL函数的trace -
am start --user <USER_ID> | current
解释:指定用户来运行App,默认为当前用户。
Android在shell中提供了 am 命令来发送Intent,它的源码为位于 frameworks/base/cmds/am
它本身是用JAVA代码来实现的。
执行 am 命令其实是通过运行shell脚本 frameworks/base/cmds/am/am
,然后在该脚本中运行 app_process
命令来启动am这个java程序的。
frameworks/base/cmds/am/am
脚本文件如下:
# Script to start "am" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/am.jar
exec app_process $base/bin com.android.commands.am.Am "$@"
am命令语法如下
am [subcommand] [options]
start an Activity: am start [-D] [-W] <INTENT>
-D: enable debugging
-W: wait for launch to complete
start a Service: am startservice <INTENT>
send a broadcast Intent: am broadcast <INTENT>
start an Instrumentation: am instrument [flags] <COMPONENT>
-r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)
-e <NAME> <VALUE>: set argument <NAME> to <VALUE>
-p <FILE>: write profiling data to <FILE>
-w: wait for instrumentation to finish before returning
start profiling: am profile <PROCESS> start <FILE>
stop profiling: am profile <PROCESS> stop
start monitoring: am monitor [--gdb <port>]
--gdb: start gdbserv on the given port at crash/ANR
<INTENT> specifications include these flags:
[-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
[-c <CATEGORY> [-c <CATEGORY>] ...]
[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
[--esn <EXTRA_KEY> ...]
[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
[-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
[-n <COMPONENT>] [-f <FLAGS>]
[--grant-read-uri-permission] [--grant-write-uri-permission]
[--debug-log-resolution]
[--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]
[--receiver-registered-only] [--receiver-replace-pending]
[<URI>]
这是一个在 Android 设备上启动 “am” 的脚本,其中的 shell 非常基础。
该脚本的作用是设置 CLASSPATH 变量,将 am.jar 添加到 CLASSPATH 中,并执行 app_process 命令来启动 com.android.commands.am.Am 类。“$@” 表示传递给该脚本的所有参数都会被传递给 Am 类。
am 命令可以用于启动 Activity、Service、广播 Intent、以及测试 Instrumentation 等。命令语法包括子命令和选项。例如,使用 “am start” 子命令可以启动 Activity,“-D” 和 “-W” 选项分别表示开启调试模式和等待 Activity 启动完成。
INTENT> 参数可以包含各种标记和选项,如 Action、Data URI、MIME 类型、Category、Extra 等等。通过这些标记和选项,可以指定要启动的组件、传递参数给组件,或者实现其他功能。
需要注意的是,am 命令只能在已经 root 权限的设备上运行。