Runtime.exec () error: se bloquea sin proporcionar un objeto de proceso

Si uso esto:

process = Runtime.getRuntime().exec("logcat -d time"); 

o eso:

 process = new ProcessBuilder() .command("logcat", "-d", "time") .redirectErrorStream(true) .start(); 

Tengo los mismos resultados: a menudo se cuelga dentro de la llamada exec () o start (), no importa lo que traté de hacer! El subproceso que ejecuta esto no puede incluso ser interrumpido con Thread.interrupt ()! El proceso hijo definitivamente se inicia y si se matan los comandos anteriores volver.

Estas llamadas pueden fallar en el primer intento, por lo que no hay manera de leer su salida! También puedo usar un simple "su -c matar xxx" línea de comandos, el mismo resultado!

EDIT: Comenzó a depurar el archivo java_lang_ProcessManager.cpp en un proyecto NDK con algunos registros de depuración! Así que aquí está lo que encontré hasta ahora, después de la bifurcación () el padre hace esto:

 int result; int count = read(statusIn, &result, sizeof(int)); <- hangs there close(statusIn); 

Aunque el proceso del niño no se supone que bloquea en él: Eso es lo que hace el niño ( si se inició en absoluto !):

  // Make statusOut automatically close if execvp() succeeds. fcntl(statusOut, F_SETFD, FD_CLOEXEC); <- make the parent will not block // Close remaining unwanted open fds. closeNonStandardFds(statusOut, androidSystemPropertiesFd); <- hangs here sometimes ... execvp(commands[0], commands); // If we got here, execvp() failed or the working dir was invalid. execFailed: int error = errno; write(statusOut, &error, sizeof(int)); close(statusOut); exit(error); 

El niño puede fallar por 2 razones reproducibles: 1- el código de niño no está funcionando, pero el padre cree que es! 2- bloques de niños en closeNonStandardFds (statusOut, androidSystemPropertiesFd);

En cualquier caso, la lectura (statusIn …) en el padre termina en interbloqueo! Y un proceso hijo se deja muerto (y no se puede acceder, pid desconocido, ningún objeto de proceso)!

Este problema se soluciona en Jelly Bean (Android 4.1) pero no en ICS (4.0.4) y supongo que nunca se solucionará en ICS.

¡La solución anterior no resultó ser fiable de ninguna manera, causando más problemas en algunos dispositivos!

Así que volví de nuevo al estándar .exec () y seguí cavando …

Observando el código secundario que se bloquea, me di cuenta de que el proceso secundario se bloqueará al intentar cerrar todos los descriptores de archivo heredados de los padres (excepto el creado en la llamada exec).

Así que busco el código de toda la aplicación para cualquier BufferedReader / Writer y clases similares para asegurarse de que los que se cerraron al llamar a exec ()!

La frecuencia del problema se redujo considerablemente y en realidad nunca se produjo de nuevo cuando eliminé el último descriptor de archivo abierto antes de llamar a exec ().

Nota: ¡ Asegúrese de que el binario de SU esté al día, también puede causar este problema!

Disfrute de su búsqueda;)

La corrección de errores en Bionic se inició meses atrás, pero todavía no se ha incluido en Android 4.0.4.

Tengo el mismo problema en ICS (parece que funciona bien en Android <4). ¿Encontraste una solución?

Una simple solución podría ser llamar al método "exec" en un hilo dedicado con un timeout-join para que esta situación pudiera ser "detectada" (sí sé que no es muy elegante …)

  • Android: mantener vivo un servicio de fondo (prevenir la muerte del proceso)
  • GetRunningAppProcesses devuelve la lista vacía en Android M (5.1.1)
  • El método android finish () no borra la aplicación de la memoria
  • Exploración de subred de Android
  • ¿Cuáles son los pros y los contras de usar múltiples procesos dentro de la aplicación Android
  • Android - ¿Cómo decidir si ejecutar un servicio en un proceso separado?
  • ¿Cómo puede una aplicación de Android tener más de un proceso?
  • ¿Cómo puedo abrir un Fragmento de Android en un nuevo proceso?
  • Apertura de la cámara en un proceso diferente
  • Cada actividad en Android es un proceso o una aplicación es un proceso
  • Android - ¿Cómo obtener el processName o packageName usando PID?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.