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

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

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")

person user1114653    schedule 24.12.2011    source источник


Ответы (4)


Ты можешь использовать:

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);
person AAnkit    schedule 24.12.2011
comment
Но как вы инициализируете объект менеджера, я не мог понять. - person Rui Marques; 03.10.2012
comment
Менеджер ActivityManager = (ActivityManager) getSystemService (Context.ACTIVITY_SERVICE); это то, как вы его инициализируете. - person AAnkit; 04.10.2012
comment
Не получить процесс из /data/data/com.something.something/mybinary - person Dave Jackson; 07.10.2013
comment
С помощью killProcess(pid) вы можете убить только созданный вами процесс в соответствии с документацией developer.android.com/reference/android/os/. Используйте ActivityManager.killBackgroundProcesses(packageName), чтобы завершить процесс другого приложения. - person Goran Horia Mihail; 03.12.2014

ваше имя процесса - '/data/data/com.something.something/mybinary', сначала получите идентификатор процесса собственного процесса, работающего путем анализа вывода top, а затем используйте 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());
    } 
}

}

person Dheeraj Sachan    schedule 23.06.2014

У меня такая же проблема. Наконец, я нашел способ убить мой двоичный процесс с помощью Java-кода Android. сначала запишите информацию о процессе в текстовый файл:

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 вашего процесса, выполните команду kill в java.

person coffee8651    schedule 24.10.2017

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

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 вашего процесса.

person Yury    schedule 24.12.2011
comment
Юрий, я использую этот метод, чтобы проверить, работает ли мой процесс: if(sb.toString().indexOf(data/data/myprocess) › 0) но как я могу разобрать sb, чтобы получить pid процесса, я знаю что pid находится за именем процесса, но как я могу его извлечь - person user1114653; 24.12.2011
comment
mhh, я извлек его, pid сделал его целым, но я пытаюсь убить его с помощью android.os.Process.killProcess(pid); но это не сработало. когда я убиваю себя с помощью: android.os.Process.killProcess(android.os.Process.myPid()); это работает, но с другим pid нет: S - person user1114653; 24.12.2011
comment
Это небезопасно, потому что ps может иметь разные выходные данные с версиями toolbox или busybox и т. д. - person shkschneider; 12.06.2012