在底层代码中看到这样一条语句:

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命令执行动作相关推荐

  1. Linux下使用system函数获取命令执行返回结果

    在Linux C语言中,需要获取设备挂载和空间容量信息,这时候最简单的方式就是使用命令工具进行查询,但是system函数调用之能返回进行执行的状态,不能返回执行的结果:所以这里自己实现system函数 ...

  2. java调用cmd命令执行mysql命令

    java调用cmd命令在linux执行mysql数据恢复命令 Statement statement = con.createStatement(); ResultSet resultsql = st ...

  3. php调用at命令,执行AT命令在php中发送短信

    我试图从PHP执行AT命令. 我试过exec()和shell_exec() 请不要建议第三方SMS网关,我的客户不想透露他的私人信息,并希望从他自己的服务器发送短信. 我有一个GSM调制解调器连接到一 ...

  4. ThinkPHP V5.0.5漏洞_ThinkPHP 5.x 远程命令执行漏洞分析与复现

    php中文网最新课程 每日17点准时技术干货分享 0x00 前言 ThinkPHP 官方 2018 年 12 月 9 日发布重要的安全更新,修复了一个严重的远程代码执行漏洞.该更新主要涉及一个安全更新 ...

  5. linux shell 命令执行结果,如何通过程序执行shell命令并获取命令执行结果?

    1 参考资料 1.[c/c++]如何调用[linux]shell命令行命令并获取命令行的输出内容(https://blog.csdn.net/youngstar70/article/details/7 ...

  6. RCE漏洞以及命令执行漏洞

    目录 概念 代码执行和命令执行区别 代码执行漏洞特点 命令执行漏洞特点 漏洞形成条件 漏洞产生地方 如何检测漏洞 白盒情况下 黑盒情况下 防御方案 变量过滤或固定 WAF产品防火墙防护 敏感函数禁用 ...

  7. C或C 如何通过程序执行shell命令并获取命令执行结果?

    1 应用场景 最近在实际程序开发中,需要通过程序执行 shell 命令,并获取命令输出内容.但是系统自带的 system 只能返回命令执行成功与否,不能捕获命令输出. 2 扩展性 由于应用场景本就广泛 ...

  8. python执行linux命令返回结果_Python中调用Linux命令并获取返回值

    方法一.使用os模块的system方法:os.system(cmd),其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256/512表示未找到,该方法适用于she ...

  9. python调用shell命令-在Python中执行shell命令的6种方法,你都知道吗?

    原标题:在Python中执行shell命令的6种方法,你都知道吗? Python经常被称作"胶水语言",因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库.今天我们就讲解 ...

最新文章

  1. 高效排序算法(希尔排序)
  2. Win7_Wifi热点
  3. Delphi中TVarRec做为参数的用法
  4. 当我们在UI上点add button增加新的search criteria之后,是framework做的处理把新的row render出来
  5. 学习flex布局(弹性布局)
  6. 为iptables增加layer7补丁(Linux2.6.25内核
  7. 《Linux 就是这个范儿 - 阅读笔记2》 融于心而表于行(1)
  8. CodeForces 877C
  9. java catch用法_java – 如何避免使用try … catch块
  10. SAP License:为什么新一代的财务产品不能从传统erp企业里长出来?
  11. 自然语言处理系列-1.什么是NLP?
  12. Oracle for Windows Embedded CE
  13. jsonp和jsonpcallback的使用
  14. 模拟cmos集成电路 第二版 razavi
  15. bp神经网络模型拓扑结构,bp神经网络模型结构图
  16. 软考高项笔记 | PERT 三点估算
  17. 密码领域专用语言 ZUC算法
  18. 【高等数学】平面束方程的俩种设法与其中一种设法会出现的漏解问题
  19. JavaScript中的函数 1
  20. 王之泰201771010131《面向对象程序设计(java)》第七周学习总结

热门文章

  1. HUST-2015 Multi-University Training Contest 9
  2. mac idea在mybatis xml文件里引入全限定类名报红解决
  3. 后端技术:MyBatis动态SQL写法介绍
  4. 程序人生:这5个程序员,改变了世界,你都认识吗!
  5. 后端:死磕18个Java8日期处理,工作必用!
  6. 系统实施基础:系统实施的相关知识介绍
  7. 超级全面的权限系统设计方案
  8. STM32 定时器中断
  9. 《Java 高并发》05 线程的基本操作
  10. 猎鹰spacex_SpaceX:简单,美观的界面是未来