Runtime.exec () error: se bloquea sin proporcionar un objeto de proceso
Si uso esto:
process = Runtime.getRuntime().exec("logcat -d time");
o eso:
- La vinculación al servicio que ya fue iniciada por BroadcastReceiver crea una nueva instancia de servicio
- Aplicación de Android vs. Proceso
- Servicio de Android: proceso vs. no
- Cómo forzar a detener una aplicación de Android
- Acceso denegado (0x80004005) en Process.Start () en la aplicación android
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)!
- ¿Va a correr un servicio Android en un proceso diferente, contribuir al mismo límite de montón?
- Android proceso sigue vivo después de terminar las actividades
- ¿Las aplicaciones que utilizan varios procesos comparten una instancia de Dalvik?
- El nombre de aplicación de PackageManager siempre es nulo
- Cuando su BroadcastReceiver se invoca a través de un Intent, ¿en qué proceso se ejecuta?
- La aplicación de Android no se cierra después de llamar a System.exit (0)
- Android proceso asesino
- Cómo leer la salida del comando de proceso android
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 …)
- Portar una aplicación de 100 Actividades a Fragmentos sin morir
- ¿Cómo puedo comprobar desde Android WebView si una página es una "página 404 no encontrada"?