环境:Android 5.1.1(已root)

最近有一个需求,需要在Android下杀死指定pid的进程。Android原生API提供了几个接口:

(1)android.os.Process.killProcess(int pid)  只能杀死应用自己和启动的子进程

(2)ActivityManager.killBackgroundProcesses(String packageName) 参数只能传包名,不能传pid

但是我们的程序需要杀死指定pid的其他进程。熟悉linux的朋友都知道,kill命令可以进行杀死进程的操作。在Android下可以用Runtime.getRuntime.exec()来执行linux命令。

废话不多说,上代码:

try {

String s = "\n";

String sErr = "\n";

String cmd = "kill -9 " + pid;

Log.d(TAG,"cmd=" + cmd);

Process p = Runtime.getRuntime().exec(cmd);

InputStream is = p.getInputStream();

InputStream ers = p.getErrorStream();

BufferedReader reader = new BufferedReader(new InputStreamReader(is));

DataInputStream ise = new DataInputStream(ers);

String line = null;

String error = null;

while ((line = reader.readLine()) != null) {

s += line + "\n";

}

Log.d(TAG,"s=" + s);

while((error = ise.readLine()) != null) {

sErr += error + "\n";

}

Log.d(TAG,"sErr=" + sErr);

int result = p.waitFor();

Log.d(TAG,"result=" + result);

is.close();

ers.close();

reader.close();

ise.close();

p.destroy();

} catch (IOException e) {

e.printStackTrace();

} catch (InterruptedException e) {

e.printStackTrace();

}

此时从日志可以看到

sErr=kill: 5135: Operation not permitted

应该是没有kill权限的问题。

那把上面代码的kill 前加了一个su,变成

String cmd = "su kill -9 " + pid;

再执行:

sErr=tmp-mksh: tmp-mksh: -9: unknown option

String cmd = "su -c 'kill -9 " + pid + "'";

日志:

sErr=tmp-mksh: kill -9 5135: not found仍然还是失败,昨天到这一步的时候就放弃了,又去找了另外一种实现方式。但是今天在写这篇博客之前,不甘心于失败,又去查了一遍,发现在stackoverflow有一句评论:

+1 nice answer, but adb shell "su -c kill 101" works for me (without '). Thanks :)抱着一试的想法,命令改成了

String cmd = "su -c kill -9 " + pid;执行竟然成功了。有时候成功和失败,很多就差这一次尝试。

接下来说说我昨天用的第二种实现方法,直接上代码:

Process sh = null;

DataOutputStream os = null;

try {

sh = Runtime.getRuntime().exec("su");

os = new DataOutputStream(sh.getOutputStream());

try {

os.writeBytes("kill -9 " + pid + "\n");

Log.d(TAG, "kill -9");

sleep(2000);

} catch (IOException e) {

Log.d(TAG, "kill -9 catch exception");

e.printStackTrace();

}

} catch (IOException e) {

e.printStackTrace();

} catch (InterruptedException e) {

e.printStackTrace();

}

这里是用了一个DataOutputStream的方式,直接把命令写入到流中。先通过su获取root权限,然后直接执行kill命令。

总结:

以上杀其他进程的方式,都是在root的基础上进行的,非root环境暂时没有去探索。

调试过程中,一定要想办法打出错误日志,之前没有把Process的ErrorStream输出,自己每次执行,错误原因都不知道改怎么查。

参考:

android 命令kill进程号,一定是我打开的姿势不对——Android下使用kill命令杀死指定进程...相关推荐

  1. linux中杀死指定进程,Linux中通过 kill命令 杀死指定进程

    一  杀死指定进程 现知道有一个curl线程正在运行,需要杀死 anggang@barry$ curl -y 30 -Y 1 -m 300 -x 8.8.8.8:808 -o html_baidu h ...

  2. linux杀死指定名称的进程,Linux kill 杀死指定进程

    一  杀死指定进程 现知道有一个php线程正在运行,需要杀死 root 26278 1 0 2015 ? 00:00:31 /usr/local/php/bin/php /var/www/html/r ...

  3. python获取进程编号(目的、获取当前进程编号、根据编号杀死指定进程号、获取当前父进程编号)

    1. 获取进程编号的目的         获取进程编号的目的是验证主进程和子进程的关系,可以得知子进程是由那个主进程创建出来的. 获取进程编号的两种操作 获取当前进程编号 获取当前父进程编号 2. 获 ...

  4. Linux kill 杀死指定进程

    Linux kill 杀死指定进程 一  杀死指定进程 现知道有一个php线程正在运行,需要杀死 root 26278 1 0 2015 ? 00:00:31 /usr/local/php/bin/p ...

  5. shell中一些特殊命令|: 管道命令。;;在前一个命令结束时,而忽略其返回值,继续执行下一個命令。

    shell传递参数 $0 对应的是当前 Shell 脚本程序的名称,$#对应的是总共有几个参数,$*对应的是所有位置的参数值,$?对应的是显示上一次命令的执行返回值,而$1.$2.$3--则分别对应着 ...

  6. vbs 杀死进程_VBS杀死指定进程

    以下是一小段杀死指定进程名字的小vbs,希望对大家有帮助. Function KillProc(strProcName) On Error Resume Next Set objWMIService ...

  7. linux 杀死指定pid,Linuxkill杀死指定进程

    一.杀死指定进程 现知道有一个curl线程正在运行,需要杀死 anggang@barry$ curl -y 30 -Y 1 -m 300 -x 8.8.8.8:808 -o html_baidu ht ...

  8. Linux查看tomcat服务进程号,Linux下启动停止查看杀死Tomcat进程

    启动 一般是执行tomcat/bin/startup.sh,sh tomcat/bin/startup.sh 停止 一般是执行 sh tomcat/bin/shutdown.sh脚本命令 查看 执行p ...

  9. linux杀死指定进程中的线程,linux查看进程和线程的命令

    1.任务:获得进程信息 :ps命令,或者top命令,它能显示当前运行中进程的相关信息,包括进程的PID. ps命令能提供一份当前进程的快照.如果想状态可以自动刷新,可以使用top命令. 2.任务:获得 ...

最新文章

  1. 一个form表单,多个提交按钮(实现不同功能和地址的提交)
  2. centos下mysql常用的三种备份方法_centos下mysql自动备份(全量)
  3. nature | 基于深度学习方法的虚拟组织染色
  4. protobuf流的反解析Message
  5. 前端VUE工程不占用80端口,浏览器不带端口访问VUE项目的实现
  6. nginx ngx_http_core_module(http server location)
  7. hotplug,automount与mdev的调试
  8. amap vueamap 与_vue中使用vue-amap(高德地图)
  9. 手机号空号检测的几点建议
  10. webgl图库研究(包括BabylonJS、Threejs、LayaboxJS、SceneJS、ThingJS等框架的特性、适用范围、支持格式、优缺点、相关网址)
  11. Android中视频播放以及解码
  12. 原创 | GIS属性表转为Excel表格
  13. 【附源码】计算机毕业设计SSM社区生鲜配送系统
  14. IDEA设置类注解模板
  15. Mysql 增加表注释
  16. 希尔排序解析实例实现
  17. JavaWeb基础知识总结
  18. qtscrcpy自定义按键_QtScrcpy电脑控制手机 苹果般丝滑华为多屏协同般体验 免安装使用...
  19. java实现多继承的三种方式
  20. [小物分享] 金豪世纪

热门文章

  1. 怎么检查linux安全组配置,怎样查看安全组规则是否生效
  2. Linux日志分析与安全
  3. 查看Oracle数据库所有的用户及表空间等
  4. SQL Server 查询某个数据库中的所有表名、某个表的字段名、字段类型、字段注释
  5. 软件设计模式,给你解决问题的标准答案,少走弯路
  6. 字典和json相互转换
  7. Java如何根据经纬度计算两点距离?
  8. PySide是Python语言的Qt框架的一个绑定。PySide支持跨平台和本地GUI应用程序开发,是在Python 2.6、2.7和3.x版本下可用。
  9. SQL外连接之交集、并集、差集查询
  10. 哪种投影仪家用比较好?目前最好的家用投影仪