Obtener el PID de un proceso para matarlo, sin saber su nombre completo
Estoy codificando una aplicación de Android. Ahora voy a una parte donde la aplicación debe matar a un proceso. Pero no sé su nombre completo o su PID. Conozco los comandos:
android.os.Process.killProcess(Pid)
y
- ¿Cómo puedo abrir un Fragmento de Android en un nuevo proceso?
- ¿Cómo ejecutar una aplicación Qt en segundo plano en Android?
- Obtención de una lista de procesos en ejecución y eliminación de un proceso específico
- Cómo matar a mi propia actividad - la manera dura
- El nombre de aplicación de PackageManager siempre es nulo
android.os.Process.getUidForName("com.android.email")
Pero mi problema es que no sé el nombre completo del proceso.
Es un proceso de código nativo, por lo que no es algo como com.something.algo
El proceso es /data/data/com.something.something/mybinary
Pero se está ejecutando con comandos como
/data/data/com.something.something/mybinary -a 123 -b 456
Por eso no puedo usar
android.os.Process.getUidForName("/data/data/com.something.something/mybinary")
- La aplicación de Android no se cierra después de llamar a System.exit (0)
- Acceso denegado (0x80004005) en Process.Start () en la aplicación android
- ¿Va a correr un servicio Android en un proceso diferente, contribuir al mismo límite de montón?
- Android - ¿Cómo decidir si ejecutar un servicio en un proceso separado?
- Runtime.exec () error: se bloquea sin proporcionar un objeto de proceso
- Android proceso asesino
- Activación del flash de la cámara durante la grabación de vídeo
- La notificación sigue en la barra después de matar al servicio
Puedes usar:
ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> services = manager.getRunningAppProcesses(); String service1name = services[1].processName;
Puede obtener todos los nombres de paquetes del proceso en ejecución, compruebe el que desea matar, elija ese proceso para obtener la identificación del proceso por service.pid.
Y llama:
android.os.Process.killProcess(service.pid);
Su nombre de proceso es '/data/data/com.something.something/mybinary' primero obtenga el id del proceso nativo ejecutándose analizando la salida de la parte superior y luego use 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()); } }
}
Usted puede hacer smth como esto:
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); //... }
A continuación, puede analizar sb y obtener pid de su proceso.
- Parallax XY y cálculo de la rotación
- Desactivar el uso de Android hasta que se confirme la acción intencionada