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

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

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

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

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

android:finishOnTaskLaunch="true" 

但自动恢复仍然发生。

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

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

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

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

  • Android NDK溢出了dalvik JNI本地参考表
  • JNI Warnig预期返回types'L'调用LocationManager.requestLocationUpdates
  • 执行任务失败':app:compileDebugNdk'
  • Android NDK OpenGL应用的浮点或定点?
  • Android NDK Mutex
  • 我如何加载我自己的Java类在Android上的C?
  • OpenCV本地示例不构build
  • 如何使用eclipse在Java中使用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 /保持活力。

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