通过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等,原来这样也可以的,真是学习了。
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的支持的功能。
public static void main(String[] args) {try {(new Am()).run(args);} catch (IllegalArgumentException e) {showUsage();}}private void run(String[] args) throws Exception {……//获取ActivityManagerService实例mAm = ActivityManagerNative.getDefault();mArgs = args;String op = args[0];mNextArg = 1;//Am所支持的命令 if (op.equals("start")) {runStart();} else if (op.equals("startservice")) {runStartService();} else if (op.equals("force-stop")) {runForceStop();} else if (op.equals("kill")) {runKill();} else if (op.equals("kill-all")) {runKillAll();} else if (op.equals("instrument")) {runInstrument();} else if (op.equals("broadcast")) {sendBroadcast();}…… //很多命令}
看一下发送广播的命令:
private void sendBroadcast() throws Exception {//解析发送广播的参数Intent intent = makeIntent(UserHandle.USER_ALL);IntentReceiver receiver = new IntentReceiver();//通过AMS发送广播mAm.broadcastIntent(null, intent, null, receiver, 0, null, null, null, true, false,mUserId);receiver.waitForFinish();}
所以Android 还有这样一个工具am,通过看showUsage,可以干很多事情的;
通过system调用Am命令执行动作相关推荐
- Linux下使用system函数获取命令执行返回结果
在Linux C语言中,需要获取设备挂载和空间容量信息,这时候最简单的方式就是使用命令工具进行查询,但是system函数调用之能返回进行执行的状态,不能返回执行的结果:所以这里自己实现system函数 ...
- java调用cmd命令执行mysql命令
java调用cmd命令在linux执行mysql数据恢复命令 Statement statement = con.createStatement(); ResultSet resultsql = st ...
- php调用at命令,执行AT命令在php中发送短信
我试图从PHP执行AT命令. 我试过exec()和shell_exec() 请不要建议第三方SMS网关,我的客户不想透露他的私人信息,并希望从他自己的服务器发送短信. 我有一个GSM调制解调器连接到一 ...
- ThinkPHP V5.0.5漏洞_ThinkPHP 5.x 远程命令执行漏洞分析与复现
php中文网最新课程 每日17点准时技术干货分享 0x00 前言 ThinkPHP 官方 2018 年 12 月 9 日发布重要的安全更新,修复了一个严重的远程代码执行漏洞.该更新主要涉及一个安全更新 ...
- linux shell 命令执行结果,如何通过程序执行shell命令并获取命令执行结果?
1 参考资料 1.[c/c++]如何调用[linux]shell命令行命令并获取命令行的输出内容(https://blog.csdn.net/youngstar70/article/details/7 ...
- RCE漏洞以及命令执行漏洞
目录 概念 代码执行和命令执行区别 代码执行漏洞特点 命令执行漏洞特点 漏洞形成条件 漏洞产生地方 如何检测漏洞 白盒情况下 黑盒情况下 防御方案 变量过滤或固定 WAF产品防火墙防护 敏感函数禁用 ...
- C或C 如何通过程序执行shell命令并获取命令执行结果?
1 应用场景 最近在实际程序开发中,需要通过程序执行 shell 命令,并获取命令输出内容.但是系统自带的 system 只能返回命令执行成功与否,不能捕获命令输出. 2 扩展性 由于应用场景本就广泛 ...
- python执行linux命令返回结果_Python中调用Linux命令并获取返回值
方法一.使用os模块的system方法:os.system(cmd),其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256/512表示未找到,该方法适用于she ...
- python调用shell命令-在Python中执行shell命令的6种方法,你都知道吗?
原标题:在Python中执行shell命令的6种方法,你都知道吗? Python经常被称作"胶水语言",因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库.今天我们就讲解 ...
最新文章
- 高效排序算法(希尔排序)
- Win7_Wifi热点
- Delphi中TVarRec做为参数的用法
- 当我们在UI上点add button增加新的search criteria之后,是framework做的处理把新的row render出来
- 学习flex布局(弹性布局)
- 为iptables增加layer7补丁(Linux2.6.25内核
- 《Linux 就是这个范儿 - 阅读笔记2》 融于心而表于行(1)
- CodeForces 877C
- java catch用法_java – 如何避免使用try … catch块
- SAP License:为什么新一代的财务产品不能从传统erp企业里长出来?
- 自然语言处理系列-1.什么是NLP?
- Oracle for Windows Embedded CE
- jsonp和jsonpcallback的使用
- 模拟cmos集成电路 第二版 razavi
- bp神经网络模型拓扑结构,bp神经网络模型结构图
- 软考高项笔记 | PERT 三点估算
- 密码领域专用语言 ZUC算法
- 【高等数学】平面束方程的俩种设法与其中一种设法会出现的漏解问题
- JavaScript中的函数 1
- 王之泰201771010131《面向对象程序设计(java)》第七周学习总结