浅谈android的am命令
android系统为大家提供了adb工具,在adb的基础上执行adb shell就可以从PC上对手机侧执行shell命令。和pc的linux系统一样,在系统的默认路径syste/bin下面是可执行程序。一般常用的有getprop,setprop等。和常用的linux命令比较,android自带的程序还是少了诸如find等常见命令。不过可以下载busybox程序,推送到android的system/bin目录下,修改这个程序的权限。即可增加一些常用的shell命令。不过使用这些命令的方式也有些不同,其执行格式如下:busybox find ………即在原有的命令前面增加busybox。
android自带的命令也有些linux本身没有,而android特有的。linux下,查询一个命令的使用一般是增加man命令,在android有些不同,工作中发现查询绝大多数命令的使用方式是,直接输入这个命令。比如shell环境下查看pm命令的使用方式,直接输入pm按回车就行。另外android的命令常见使用方法如下: am [subcommand] [options],即命令后面跟着一个子命令,因为是子命令而不是参数,所以不用加-,而后面的参数就需要加-,比如am start -a ***,start在这里就是子命令,-a在这里就是参数。以上这些都是个人在平时工作中的总结,在总结的基础上记忆起来就方便多了,如果有些地方因为知识面不够说的不对,还请指出。
接下来就主要讲解几个比较给力的android自带的命令,首先是am。直接去看下am的代码Am.java。每次在shell环境下执行am即启动一个线程执行Am.java的主函数,这个主函数的主要实现都在run方法里面,am命令后面带的参数会当做运行时参数传递个主方法(使用java这么久又一次见到给主函数传递参数,不容易),后面会根据传入的参数不同,执行不同的条件分支。可以看到当参数的个数小于1的时候,就执行showUsage()方法,即说明am命令使用方式的方法,并且有最常用的参数intent的详细使用说明。am命令中最常用到的是start命令,下面来看下这个命令的执行过程。
代码根据第一个参数判断是否是start子命令,进入private void runStart() throws Exception方法,接着进入执行解析参数的关键方法 private Intent makeIntent(int defUser) throws URISyntaxException里面。makeIntent里面用while循环根据传入的参数一点一点的配置即将使用的intent,大的比如intent的action,data小的比如flag,参数等。代码很普通,没有发现什么牛逼的算法,但是很实用很清晰。感慨下,不是也不需要每个人都能牛逼的提出惊人的算法做出惊人的成就,把平凡的事情有条理的做好就非常了不起。回到runStart方法,首先是检查am start是否接着-S(stop)参数,如果不是就跨进程调用am服务执行命令。到这里am及其start子命令的执行过程基本介绍完了。
说说常见使用am start命令的技巧,启动某一个操作并且传入数据方式如下:am -a "action" -d data,其中action可以到应用的配置文件里面查询;如果指定启动某个应用,可以在后面增加-n,即component。-n后面接的数据格式是:包名/组件名称。我们可以直接在am的log里面看到启动某个组件时候的amlog,其中cmp后面接的内容即可作为am start命令-n参数传入的数据,如下面所示:
07-07 17:44:14.993: I/ActivityManager(222): START { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] 易做图=0x10200000 cmp=com.android.contacts/.activities.PeopleActivity} from pid 16116 07-07 17:44:14.993: I/ActivityManager(222): START { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] 易做图=0x10200000 cmp=com.android.contacts/.activities.PeopleActivity} from pid 16116
对上面的结论启动activity,启动service都可用。如启动浏览器:am start -n com.android.browser/com.android.browser.BrowserActivity 或者是am start -a android.intent.action.VIEW -d http://www.google.cn/。
最后附上笔者最喜欢用的几个子命令及其参数的说明,掌握好这几个命令,对于android的debug有很大的帮助。
"am start: start an Activity. Options are:\n" +
" -D: enable debugging\n" +
" -W: wait for launch to complete\n" +
" --start-profiler <FILE>: start profiler and send results to <FILE>\n" +
" -P <FILE>: like above, but profiling stops when app goes idle\n" +
" -R: repeat the activity launch <COUNT> times. Prior to each repeat,\n" +
" the top activity will be finished.\n" +
" -S: force stop the target app before starting the activity\n" +
" --opengl-trace: enable tracing of OpenGL functions\n" +
" --user <USER_ID> | current: Specify which user to run as; if not\n" +
" specified then run as the current user.\n" +
补充:移动开发 , Android ,