Android中通过system调用Am命令执行动作
2014-08-13 10:09
399 查看
Android中通过system调用Am命令执行动作
在底层代码中看到这样一条语句:
system("/system/bin/sh -c \"am broadcast -a android.intent.action.AT_AIRPLANE_MODE --ez state true\"");
system 这是干什么的啊??
经google原来system是系统调用,执行一个系统命令。
这里system加上其参数的意思:
调用system,通过shell,执行可执行程序或者脚本am,
发送broadcast Action为:android.intent.action.AT_AIRPLANE_MODE 广播参数--ez 键值对 state true……
这样也可以啊,我原来以为android底层要主动和上层进行交互,就得通过socket等,原来这样也可以的,真是学习了。
During execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored.
system()函数调用/bin/sh来执行参数指定的命令,/bin/sh 一般是一个软连接,指向某个具体的shell,比如bash,-c选项是告诉shell从字符串command中读取命令;
在该command执行期间,SIGCHLD是被阻塞的,好比在说:hi,内核,这会不要给我送SIGCHLD信号,等我忙完再说;
在该command执行期间,SIGINT和SIGQUIT是被忽略的,意思是进程收到这两个信号后没有任何动作。
为了更好的理解system()函数返回值,需要了解其执行过程,实际上system()函数执行了三步操作:
a.fork一个子进程;
b.在子进程中调用exec函数去执行command;
c.在父进程中调用wait去等待子进程结束。
对于fork失败,system()函数返回-1。
如果exec执行成功,也即command顺利执行完毕,则返回command通过exit或return返回的值。
注意,command顺利执行不代表执行成功,比如command:"rm debuglog.txt",不管文件存不存在该command都顺利执行了
如果exec执行失败,也即command没有顺利执行,比如被信号中断,或者command命令根本不存在,system()函数返回127.
如果command为NULL,则system()函数返回非0值,一般为1.
具体可参考这篇文章:
http://my.oschina.net/renhc/blog/53580
\frameworks\base\cmds\am\am 这个就是放在system/bin/am:
base=/system
export CLASSPATH=$base/framework/am.jar
exec app_process $base/bin com.android.commands.am.Am "$@"
通过app_process创建执行com.android.commands.am.Am这样进程 $@传递所有参数给Am
\frameworks\base\cmds\am\src
\frameworks\base\cmds\am\Android.mk
将编译java层Am为一个am.jar包,下面看一下Am的支持的功能。
?
看一下发送广播的命令:
?
所以Android 还有这样一个工具am,通过看showUsage,可以干很多事情的;
在底层代码中看到这样一条语句:
system("/system/bin/sh -c \"am broadcast -a android.intent.action.AT_AIRPLANE_MODE --ez state true\"");
system 这是干什么的啊??
经google原来system是系统调用,执行一个系统命令。
这里system加上其参数的意思:
调用system,通过shell,执行可执行程序或者脚本am,
发送broadcast Action为:android.intent.action.AT_AIRPLANE_MODE 广播参数--ez 键值对 state true……
这样也可以啊,我原来以为android底层要主动和上层进行交互,就得通过socket等,原来这样也可以的,真是学习了。
1 system命令
system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed.During execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored.
system()函数调用/bin/sh来执行参数指定的命令,/bin/sh 一般是一个软连接,指向某个具体的shell,比如bash,-c选项是告诉shell从字符串command中读取命令;
在该command执行期间,SIGCHLD是被阻塞的,好比在说:hi,内核,这会不要给我送SIGCHLD信号,等我忙完再说;
在该command执行期间,SIGINT和SIGQUIT是被忽略的,意思是进程收到这两个信号后没有任何动作。
为了更好的理解system()函数返回值,需要了解其执行过程,实际上system()函数执行了三步操作:
a.fork一个子进程;
b.在子进程中调用exec函数去执行command;
c.在父进程中调用wait去等待子进程结束。
对于fork失败,system()函数返回-1。
如果exec执行成功,也即command顺利执行完毕,则返回command通过exit或return返回的值。
注意,command顺利执行不代表执行成功,比如command:"rm debuglog.txt",不管文件存不存在该command都顺利执行了
如果exec执行失败,也即command没有顺利执行,比如被信号中断,或者command命令根本不存在,system()函数返回127.
如果command为NULL,则system()函数返回非0值,一般为1.
具体可参考这篇文章:
http://my.oschina.net/renhc/blog/53580
2 AM
am的代码实现在\frameworks\base\cmds\am\目录下:\frameworks\base\cmds\am\am 这个就是放在system/bin/am:
base=/system
export CLASSPATH=$base/framework/am.jar
exec app_process $base/bin com.android.commands.am.Am "$@"
通过app_process创建执行com.android.commands.am.Am这样进程 $@传递所有参数给Am
\frameworks\base\cmds\am\src
\frameworks\base\cmds\am\Android.mk
将编译java层Am为一个am.jar包,下面看一下Am的支持的功能。
?
看一下发送广播的命令:
?
所以Android 还有这样一个工具am,通过看showUsage,可以干很多事情的;
相关文章推荐
- 通过system调用Am命令执行动作
- 通过system调用Am命令执行动作
- 通过adb命令在Android设备中执行Java命令, 并调用so文件。
- 解决:Android编译源码根目录下/system/vold后,通过push命令将编译生成的vold文件push至system/bin下无法正常开机
- 解决:Android编译源码根目录下/system/vold后,通过push命令将编译生成的vold文件push至system/bin下无法正常开机
- Android下通过root实现对system_server中binder的ioctl调用拦截
- [收集]用asp.net调用dos命令~(通过cmd来执行)
- 在windows下使用cmd命令通过adb shell自动调用android模拟或真机的InstrumentRunner进行android 自动化测试
- 通过Java语言,执行Linux命令并获得反馈数据。--适用于Android系统
- execlp启动android进程命令窗口通过adb shell 进入android 的Linux命令界面,输入am -help看到如下信息: 我们可以通过命令启动android中的
- 添加android service并通过getSystemService调用
- Android下通过root实现对system_server中binder的ioctl调用拦截
- python调用os.system执行系统命令,中文输出显示乱码
- Android下通过root实现对system_server中binder的ioctl调用拦截
- system执行linux命令通过返回值判断是否成功
- 子进程中调用system命令执行openssl后,程序退出了,原因是SIGCHLD信号的处理
- Android 通过Intent调用系统功能和Action动作和服务广播【大全】
- android 通过Intent action 跳转到系统页面,调用系统功能以及action动作
- Android 通过Intent调用系统功能和Action动作和服务广播【大全】
- iis php exec() system() 命令无法执行,通过cmd执行PHP可输出执行的cmd结果