Java 获取进程的PID以杀死它,而不知道它的全名
我正在编写一个Android应用程序。现在我要讲的是应用程序应该终止进程的部分。但我不知道它的全名和PID。我知道命令:Java 获取进程的PID以杀死它,而不知道它的全名,java,android,eclipse,process,kill,Java,Android,Eclipse,Process,Kill,我正在编写一个Android应用程序。现在我要讲的是应用程序应该终止进程的部分。但我不知道它的全名和PID。我知道命令: android.os.Process.killProcess(Pid) 及 但我的问题是我不知道这个过程的全名 这是一个本机代码过程,所以不像com.something.something 这个过程是/data/data/com.something.something/mybinary 但它运行的命令如下 /data/data/com.something.something
android.os.Process.killProcess(Pid)
及
但我的问题是我不知道这个过程的全名
这是一个本机代码过程,所以不像com.something.something
这个过程是/data/data/com.something.something/mybinary
但它运行的命令如下
/data/data/com.something.something/mybinary -a 123 -b 456
因为这个,我不能用
android.os.Process.getUidForName("/data/data/com.something.something/mybinary")
您可以使用:
ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> services = manager.getRunningAppProcesses();
String service1name = services[1].processName;
您可以这样做smth:
Process p = Runtime.getRuntime().exec("ps");
p.waitFor();
StringBuffer sb = new StringBuffer();
InputStreamReader isr = new InputStreamReader(p.getInputStream());
int ch;
char [] buf = new char[1024];
while((ch = isr.read(buf)) != -1)
{
sb.append(buf, 0, ch);
}
HashMap pMap = new HashMap<String, Integer>();
String [] processLinesAr = sb.toString().split("\n");
for(String line : processLinesAr)
{
String [] comps = line.split("[\\s]+");
if(comps.length != 9)
return;
pid = Integer.parseInt(comps[1]);
packageName = comps[8];
pMap.put(packageName, pid);
//...
}
processp=Runtime.getRuntime().exec(“ps”);
p、 waitFor();
StringBuffer sb=新的StringBuffer();
InputStreamReader isr=新的InputStreamReader(p.getInputStream());
int-ch;
char[]buf=新字符[1024];
而((ch=isr.read(buf))!=-1)
{
sb.追加(buf,0,ch);
}
HashMap pMap=新HashMap();
字符串[]processLinesAr=sb.toString().split(“\n”);
用于(字符串行:processLinesAr)
{
字符串[]comps=line.split([\\s]+”);
如果(组件长度!=9)
返回;
pid=Integer.parseInt(comps[1]);
packageName=comps[8];
pMap.put(packageName,pid);
//...
}
然后,您可以解析sb并获取进程的pid。您的进程名称是'/data/data/com.something.something/mybinary' 首先通过解析top的输出获取运行的本机进程的进程id,然后使用android.os.process.killProcess(Pid)
}我也遇到了同样的问题。最后,我找到了一种用android java代码杀死二进制进程的方法。 首先,将进程信息写入txt文件:
echo `ps | grep /data/data/com.something.something/mybinary` > /sdcard/pid.txt
然后,使用java代码读取此文件,您可以得到如下字符串:
root 17857 16409 87568 14880 ffffffff aaf0ec68 R /data/data/com.something.something/mybinary
您已经获得了进程的pid,请在java中执行kill命令。yuri正在使用此方法检查我的进程是否正在运行:if(sb.toString().indexOf(“data/data/myprocess”)>0),但是我如何解析sb以获得进程的pid,我知道pid在进程名称后面,但是我如何提取它呢?我提取了pid,使其成为一个整数,但我试图用android.os.process.killProcess(pid)杀死它;但它不起作用。当我用:android.os.Process.killProcess(android.os.Process.myPid())自杀时;它可以使用另一个pid,但不能使用:这是不安全的,因为
ps
在工具箱或busybox版本中可能有不同的输出。但是如何初始化管理器对象,我不知道。ActivityManager=(ActivityManager)getSystemService(Context.ACTIVITY_服务);这是初始化它的方式。不是从/data/data/com.something.something/mybinaryWith killProcess(pid)获取进程。根据文档,您只能终止您创建的进程。使用ActivityManager.KillBackgroundProcess(packageName)终止另一个应用程序的进程。
import org.apache.commons.exec.*;
import java.io.IOException;
public class NativeKillerRunnable implements Runnable {
private static final Logger logger = LoggerFactory.getLogger(NativeKillerRunnable.class);
@Override
public void run() {
String commandtoexec = "top -n 1 -m 100";
CommandLine cmdLine = CommandLine.parse(commandtoexec);
DefaultExecutor executor = new DefaultExecutor();
try {
PumpStreamHandler psh = new PumpStreamHandler(new LogOutputStream() {
@Override
protected void processLine(String s, int i) {
s = s.trim();
//check for name of your binary process
if(s.contains("mybinary"))
{
String[] strings = s.split(" ");
android.os.Process.killProcess(Integer.parseInt(strings[0]));
logger.info("killed mybinary process with pid = "+strings[0]);
}
}
});
executor.setStreamHandler(psh);
executor.execute(cmdLine);
} catch (ExecuteException executeException) {
logger.error("caught exception while killing mybinary process "+executeException.getMessage());
}
}
echo `ps | grep /data/data/com.something.something/mybinary` > /sdcard/pid.txt
root 17857 16409 87568 14880 ffffffff aaf0ec68 R /data/data/com.something.something/mybinary