android 命令kill进程号,一定是我打开的姿势不对——Android下使用kill命令杀死指定进程...
环境: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命令杀死指定进程...相关推荐
- linux中杀死指定进程,Linux中通过 kill命令 杀死指定进程
一 杀死指定进程 现知道有一个curl线程正在运行,需要杀死 anggang@barry$ curl -y 30 -Y 1 -m 300 -x 8.8.8.8:808 -o html_baidu h ...
- linux杀死指定名称的进程,Linux kill 杀死指定进程
一 杀死指定进程 现知道有一个php线程正在运行,需要杀死 root 26278 1 0 2015 ? 00:00:31 /usr/local/php/bin/php /var/www/html/r ...
- python获取进程编号(目的、获取当前进程编号、根据编号杀死指定进程号、获取当前父进程编号)
1. 获取进程编号的目的 获取进程编号的目的是验证主进程和子进程的关系,可以得知子进程是由那个主进程创建出来的. 获取进程编号的两种操作 获取当前进程编号 获取当前父进程编号 2. 获 ...
- Linux kill 杀死指定进程
Linux kill 杀死指定进程 一 杀死指定进程 现知道有一个php线程正在运行,需要杀死 root 26278 1 0 2015 ? 00:00:31 /usr/local/php/bin/p ...
- shell中一些特殊命令|: 管道命令。;;在前一个命令结束时,而忽略其返回值,继续执行下一個命令。
shell传递参数 $0 对应的是当前 Shell 脚本程序的名称,$#对应的是总共有几个参数,$*对应的是所有位置的参数值,$?对应的是显示上一次命令的执行返回值,而$1.$2.$3--则分别对应着 ...
- vbs 杀死进程_VBS杀死指定进程
以下是一小段杀死指定进程名字的小vbs,希望对大家有帮助. Function KillProc(strProcName) On Error Resume Next Set objWMIService ...
- linux 杀死指定pid,Linuxkill杀死指定进程
一.杀死指定进程 现知道有一个curl线程正在运行,需要杀死 anggang@barry$ curl -y 30 -Y 1 -m 300 -x 8.8.8.8:808 -o html_baidu ht ...
- Linux查看tomcat服务进程号,Linux下启动停止查看杀死Tomcat进程
启动 一般是执行tomcat/bin/startup.sh,sh tomcat/bin/startup.sh 停止 一般是执行 sh tomcat/bin/shutdown.sh脚本命令 查看 执行p ...
- linux杀死指定进程中的线程,linux查看进程和线程的命令
1.任务:获得进程信息 :ps命令,或者top命令,它能显示当前运行中进程的相关信息,包括进程的PID. ps命令能提供一份当前进程的快照.如果想状态可以自动刷新,可以使用top命令. 2.任务:获得 ...
最新文章
- 一个form表单,多个提交按钮(实现不同功能和地址的提交)
- centos下mysql常用的三种备份方法_centos下mysql自动备份(全量)
- nature | 基于深度学习方法的虚拟组织染色
- protobuf流的反解析Message
- 前端VUE工程不占用80端口,浏览器不带端口访问VUE项目的实现
- nginx ngx_http_core_module(http server location)
- hotplug,automount与mdev的调试
- amap vueamap 与_vue中使用vue-amap(高德地图)
- 手机号空号检测的几点建议
- webgl图库研究(包括BabylonJS、Threejs、LayaboxJS、SceneJS、ThingJS等框架的特性、适用范围、支持格式、优缺点、相关网址)
- Android中视频播放以及解码
- 原创 | GIS属性表转为Excel表格
- 【附源码】计算机毕业设计SSM社区生鲜配送系统
- IDEA设置类注解模板
- Mysql 增加表注释
- 希尔排序解析实例实现
- JavaWeb基础知识总结
- qtscrcpy自定义按键_QtScrcpy电脑控制手机 苹果般丝滑华为多屏协同般体验 免安装使用...
- java实现多继承的三种方式
- [小物分享] 金豪世纪
热门文章
- 怎么检查linux安全组配置,怎样查看安全组规则是否生效
- Linux日志分析与安全
- 查看Oracle数据库所有的用户及表空间等
- SQL Server 查询某个数据库中的所有表名、某个表的字段名、字段类型、字段注释
- 软件设计模式,给你解决问题的标准答案,少走弯路
- 字典和json相互转换
- Java如何根据经纬度计算两点距离?
- PySide是Python语言的Qt框架的一个绑定。PySide支持跨平台和本地GUI应用程序开发,是在Python 2.6、2.7和3.x版本下可用。
- SQL外连接之交集、并集、差集查询
- 哪种投影仪家用比较好?目前最好的家用投影仪