Получить 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")
Ответы
Ответ 1
Вы можете использовать:
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);
Ответ 2
ваше имя процесса: '/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());
}
}
}
Ответ 3
У меня такая же проблема. Наконец, я нахожу метод, чтобы убить мой двоичный процесс с помощью javascript-кода.
сначала напишите информацию о процессе в файл txt:
echo `ps | grep /data/data/com.something.something/mybinary` > /sdcard/pid.txt
а затем используйте Java-код для чтения этого файла, вы можете получить String как:
root 17857 16409 87568 14880 ffffffff aaf0ec68 R /data/data/com.something.something/mybinary
у вас есть pid вашего процесса, выполните команду kill в java.
Ответ 4
Вы можете сделать что-то вроде этого:
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 вашего процесса.