Получить PID процесса, чтобы убить его, не зная его полного имени

Я кодирую приложение для Android. Теперь я перейду к части, где приложение должно убить процесс. Но я не знаю его полного имени или его ПИД. Я знаю команды:

android.os.Process.killProcess(Pid) 

а также

 android.os.Process.getUidForName("com.android.email") 

Но моя проблема в том, что я не знаю полного имени процесса.

Это процесс нативного кода, поэтому не что-то вроде 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; 

Вы можете получить имена всех запущенных процессов, проверить, какой из них хотите убить, выбрать этот процесс, чтобы получить идентификатор процесса через service.pid.

И позвоните:

 android.os.Process.killProcess(service.pid); 

Ваше имя процесса «/data/data/com.something.something/mybinary» сначала получает идентификатор процесса собственного процесса, запускаемого путем разбора вывода сверху, а затем использует android.os.Process.killProcess (Pid)

  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()); } } 

}

Вы можете сделать что-то вроде этого:

 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); //... } 

Затем вы можете разобрать sb и получить pid вашего процесса.