Android应用程序在崩溃后自动重新启动

我的应用程序部分是使用C / C ++编写的原生应用程序。 问题是,每当C / C ++部分由于某种原因崩溃,应用程序死亡,然后自动重新启动。 这导致各种各样的混乱的问题

现在当然,它不应该在本地崩溃,我试图消除为什么会发生的所有原因。 但是,如果发生了,我想:

  1. 退出优雅
  2. 如果死了,至less不要尝试自动重启。

我很好奇为什么这种行为发生。 经过一番search之后,我尝试在AndroidManifest.xml的主要activity元素中放入以下代码:

android:finishOnTaskLaunch="true" 

但自动恢复仍然发生。

任何人都知道这是为什么发生,如何改变它?

更新:我认为一个更基本的问题是,
如果有本机崩溃,有没有类似于callback?

其中一个答案build议“处理碰撞信号”。 我很感激任何关于如何在应用程序或模块级别完成的链接。

就目前而言,如果发生崩溃,应用程序会消失,logcat中没有任何内容,因此不可能进行debugging。

Solutions Collecting From Web of "Android应用程序在崩溃后自动重新启动"

尝试处理碰撞信号(SIGSEGV等),并在信号处理程序中发送给自己。 这个技巧帮助我。

例:

 #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); } 

UPDATE2

如果你想在android logcat中看到crashlog,你应该使用这个信号处理程序

 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); } 

我从android源代码(不能插入链接,因为android.git.kernel.org是closures的),但我不知道它将在未来的Android版本

默认情况下你的应用程序不应该自动重启。 通常人们必须注册这种东西,例如通过AlarmManager /保持活力。

你有作为你的应用程序的一部分的服务?