tiene solo repente reinicia prende porque instalar enseguida celular bateria aplicaciones apaga android android-ndk

android - repente - porque mi celular huawei se reinicia solo



La aplicación de Android se reinicia automáticamente después de un bloqueo (2)

Mi aplicación está parcialmente escrita en una aplicación nativa usando C / C ++. El problema es que cada vez que la pieza de C / C ++ se bloquea por alguna razón, la aplicación muere y luego se reinicia automáticamente. Esto causa todo tipo de problemas desordenados.

Ahora, por supuesto, no debería bloquearse en la parte nativa y estoy tratando de eliminar todas las razones por las que sucedería. Sin embargo, si sucede me gustaría:

  1. Salir con gracia
  2. Si muere, al menos no intente reiniciarse automáticamente.

Tengo curiosidad por saber por qué ocurre este comportamiento. Después de algunas búsquedas, intenté colocar la siguiente línea en el elemento de actividad principal del AndroidManifest.xml:

android:finishOnTaskLaunch="true"

Pero la restauración automática todavía sucede.

¿Alguien sabe por qué sucede esto y cómo cambiarlo?

ACTUALIZACIÓN: Creo que una pregunta más fundamental es,
¿Hay algo similar a una devolución de llamada si hay un bloqueo nativo?

Una de las respuestas sugirió ''manejar señales de choque''. Agradecería cualquier enlace sobre cómo se puede hacer a nivel de aplicación o módulo.

Tal como está actualmente, si se produce un bloqueo, la aplicación simplemente desaparece, no hay nada en Logcat, por lo que no es posible la depuración.


Por defecto, su aplicación no debería reiniciarse automáticamente. Generalmente, uno tendría que registrarse para este tipo de cosas, por ejemplo, a través del AlarmManager / keep alives.

¿Tienes un servicio como parte de tu aplicación?


Trate de manejar las señales de choque (SIGSEGV, etc.) y envíese a usted mismo en el manejador de señales. Este truco me ayuda.

Ejemplo:

#include <signal.h> #include <unistd.h> static void signal_handler(int signal, siginfo_t *info, void *reserved) { kill(getpid(),SIGKILL); } extern "C" jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/) { struct sigaction handler; memset(&handler, 0, sizeof(handler)); handler.sa_sigaction = signal_handler; handler.sa_flags = SA_SIGINFO; sigaction(SIGILL, &handler, NULL); sigaction(SIGABRT, &handler, NULL); sigaction(SIGBUS, &handler, NULL); sigaction(SIGFPE, &handler, NULL); sigaction(SIGSEGV, &handler, NULL); sigaction(SIGSTKFLT, &handler, NULL); return(JNI_VERSION_1_6); }

Actualización2

Si desea ver crashlog en logcat de Android, debe usar este controlador de señal

static void signal_handler(int signal, siginfo_t *info, void *reserved) { struct sockaddr_un addr; size_t namelen; socklen_t alen; int s, err; char name[] = "android:debuggerd"; namelen = strlen(name); // Test with length +1 for the *initial* ''/0''. if ((namelen + 1) > sizeof(addr.sun_path)) { errno = EINVAL; return; } /* This is used for abstract socket namespace, we need * an initial ''/0'' at the start of the Unix socket path. * * Note: The path in this case is *not* supposed to be * ''/0''-terminated. ("man 7 unix" for the gory details.) */ memset (&addr, 0, sizeof addr); addr.sun_family = AF_LOCAL; addr.sun_path[0] = 0; memcpy(addr.sun_path + 1, name, namelen); alen = namelen + offsetof(struct sockaddr_un, sun_path) + 1; s = socket(AF_LOCAL, SOCK_STREAM, 0); if(s < 0) return; RETRY_ON_EINTR(err,connect(s, (struct sockaddr *) &addr, alen)); if (err < 0) { close(s); s = -1; } pid_t tid = gettid(); if(s>=0) { /* debugger knows our pid from the credentials on the * local socket but we need to tell it our tid. It * is paranoid and will verify that we are giving a tid * that''s actually in our process */ int ret; RETRY_ON_EINTR(ret, write(s, &tid, sizeof(unsigned))); if (ret == sizeof(unsigned)) { /* if the write failed, there is no point to read on * the file descriptor. */ RETRY_ON_EINTR(ret, read(s, &tid, 1)); //notify_gdb_of_libraries(); } close(s); } wait(NULL); kill(getpid(),SIGKILL); }

Lo tomé de la fuente de Android (no puedo insertar el enlace porque android.git.kernel.org está inactivo), pero no estoy seguro de que funcione en futuras versiones de Android