bug 595171 - crashreporter glue for Android. r=blassey a=blocking-fennec
--- a/Makefile.in
+++ b/Makefile.in
@@ -167,17 +167,17 @@ SYM_STORE_SOURCE_DIRS := $(topsrcdir)
include $(topsrcdir)/toolkit/mozapps/installer/package-name.mk
ifdef MOZ_SYMBOLS_EXTRA_BUILDID
EXTRA_BUILDID := -$(MOZ_SYMBOLS_EXTRA_BUILDID)
endif
SYMBOL_INDEX_NAME = \
- $(MOZ_APP_NAME)-$(MOZ_APP_VERSION)-$(OS_ARCH)-$(BUILDID)$(EXTRA_BUILDID)-symbols.txt
+ $(MOZ_APP_NAME)-$(MOZ_APP_VERSION)-$(OS_TARGET)-$(BUILDID)$(EXTRA_BUILDID)-symbols.txt
buildsymbols:
ifdef MOZ_CRASHREPORTER
echo building symbol store
$(RM) -rf $(DIST)/crashreporter-symbols
$(RM) -f "$(DIST)/$(SYMBOL_ARCHIVE_BASENAME).zip"
$(NSINSTALL) -D $(DIST)/crashreporter-symbols
$(PYTHON) $(topsrcdir)/toolkit/crashreporter/tools/symbolstore.py \
--- a/configure.in
+++ b/configure.in
@@ -6274,17 +6274,17 @@ esac
MOZ_ARG_DISABLE_BOOL(crashreporter,
[ --disable-crashreporter Disable breakpad crash reporting],
MOZ_CRASHREPORTER=,
MOZ_CRASHREPORTER=1)
if test -n "$MOZ_CRASHREPORTER"; then
AC_DEFINE(MOZ_CRASHREPORTER)
- if (test "$OS_ARCH" = "Linux" -o "$OS_ARCH" = "SunOS") && \
+ if (test "$OS_TARGET" = "Linux" -o "$OS_ARCH" = "SunOS") && \
test -z "$SKIP_LIBRARY_CHECKS"; then
PKG_CHECK_MODULES(MOZ_GTHREAD, gthread-2.0)
AC_SUBST(MOZ_GTHREAD_CFLAGS)
AC_SUBST(MOZ_GTHREAD_LIBS)
AC_CHECK_HEADERS([curl/curl.h], [], [AC_MSG_ERROR([Couldn't find curl/curl.h which is required for the crash reporter. Use --disable-crashreporter to disable the crash reporter.])])
fi
fi
--- a/toolkit/crashreporter/Makefile.in
+++ b/toolkit/crashreporter/Makefile.in
@@ -63,18 +63,23 @@ DIRS += \
google-breakpad/src/client \
google-breakpad/src/client/mac/crash_generation \
google-breakpad/src/client/mac/handler \
google-breakpad/src/tools/mac/dump_syms \
$(NULL)
endif
ifeq ($(OS_ARCH),Linux)
-# there's no define for this normally
-DEFINES += -DXP_LINUX
+# There's no define for XP_LINUX normally.
+# MOZ_APP_NAME is needed on Android, where we
+# need to launch by package name.
+DEFINES += \
+ -DXP_LINUX \
+ -DMOZ_APP_NAME=\"$(MOZ_APP_NAME)\" \
+ $(NULL)
DIRS += \
google-breakpad/src/common \
google-breakpad/src/common/linux \
google-breakpad/src/client \
google-breakpad/src/client/linux/crash_generation \
google-breakpad/src/client/linux/handler \
google-breakpad/src/client/linux/minidump_writer \
google-breakpad/src/tools/linux/dump_syms \
--- a/toolkit/crashreporter/client/Makefile.in
+++ b/toolkit/crashreporter/client/Makefile.in
@@ -46,18 +46,20 @@ relativesrcdir = toolkit/crashreporter/c
include $(DEPTH)/config/autoconf.mk
MODULE = crashreporter
# Don't use the STL wrappers in the crashreporter clients; they don't
# link with -lmozalloc, and it really doesn't matter here anyway.
STL_FLAGS =
+ifneq ($(OS_TARGET),Android)
PROGRAM = crashreporter$(BIN_SUFFIX)
DIST_PROGRAM = crashreporter$(BIN_SUFFIX)
+endif
LOCAL_INCLUDES = -I$(srcdir)/../google-breakpad/src
CPPSRCS = crashreporter.cpp
ifeq ($(OS_ARCH),WINNT)
CPPSRCS += crashreporter_win.cpp
LIBS += \
@@ -78,17 +80,17 @@ OS_LIBS += -framework Cocoa
LIBS += \
$(DEPTH)/toolkit/crashreporter/google-breakpad/src/client/mac/handler/$(LIB_PREFIX)exception_handler_s.$(LIB_SUFFIX) \
$(DEPTH)/toolkit/crashreporter/google-breakpad/src/common/mac/$(LIB_PREFIX)breakpad_mac_common_s.$(LIB_SUFFIX) \
$(NULL)
LOCAL_INCLUDES += -I$(srcdir) -I$(srcdir)/../google-breakpad/src/common/mac/
endif
-ifeq ($(OS_ARCH),Linux)
+ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2)
CPPSRCS += crashreporter_gtk_common.cpp crashreporter_unix_common.cpp
ifdef MOZ_PLATFORM_MAEMO
CPPSRCS += crashreporter_maemo_gtk.cpp
# Maemo's libcurl doesn't ship with a set of CA certificates,
# so we have to ship our own.
libs:: $(DIST)/bin/crashreporter.crt
--- a/toolkit/crashreporter/nsExceptionHandler.cpp
+++ b/toolkit/crashreporter/nsExceptionHandler.cpp
@@ -455,21 +455,32 @@ bool MinidumpCallback(const XP_CHAR* dum
return false;
#else // !XP_MACOSX
pid_t pid = sys_fork();
if (pid == -1)
return false;
else if (pid == 0) {
+#if !defined(__ANDROID__)
// need to clobber this, as libcurl might load NSS,
// and we want it to load the system NSS.
unsetenv("LD_LIBRARY_PATH");
(void) execl(crashReporterPath,
crashReporterPath, minidumpPath, (char*)0);
+#else
+ // Invoke the reportCrash activity using am
+ (void) execlp("/system/bin/am",
+ "/system/bin/am",
+ "start",
+ "-a", "org.mozilla.gecko.reportCrash",
+ "-n", crashReporterPath,
+ "--es", "minidumpPath", minidumpPath,
+ (char*)0);
+#endif
_exit(1);
}
#endif // XP_MACOSX
#endif // XP_UNIX
return returnValue;
}
@@ -552,21 +563,28 @@ nsresult SetExceptionHandler(nsILocalFil
exePath->AppendNative(NS_LITERAL_CSTRING(CRASH_REPORTER_FILENAME));
#ifdef XP_WIN32
nsString crashReporterPath_temp;
exePath->GetPath(crashReporterPath_temp);
crashReporterPath = ToNewUnicode(crashReporterPath_temp);
-#else
+#elif !defined(__ANDROID__)
nsCString crashReporterPath_temp;
exePath->GetNativePath(crashReporterPath_temp);
crashReporterPath = ToNewCString(crashReporterPath_temp);
+#else
+ // On Android, we launch using the application package name
+ // instead of a filename, so use MOZ_APP_NAME to do that here.
+ //TODO: don't hardcode org.mozilla here, so other vendors can
+ // ship XUL apps with different package names on Android?
+ nsCString package("org.mozilla." MOZ_APP_NAME "/.CrashReporter");
+ crashReporterPath = ToNewCString(package);
#endif
// get temp path to use for minidump path
#if defined(XP_WIN32)
nsString tempPath;
// first figure out buffer size
int pathLen = GetTempPath(0, NULL);
@@ -585,16 +603,23 @@ nsresult SetExceptionHandler(nsILocalFil
char path[PATH_MAX];
OSStatus status = FSRefMakePath(&fsRef, (UInt8*)path, PATH_MAX);
if (status != noErr)
return NS_ERROR_FAILURE;
tempPath = path;
+#elif defined(__ANDROID__)
+ // GeckoAppShell sets this in the environment
+ const char *tempenv = PR_GetEnv("TMPDIR");
+ if (!tempenv)
+ return NS_ERROR_FAILURE;
+ nsCString tempPath(tempenv);
+
#elif defined(XP_UNIX)
// we assume it's always /tmp on unix systems
nsCString tempPath = NS_LITERAL_CSTRING("/tmp/");
#else
#error "Implement this for your platform"
#endif
#ifdef XP_MACOSX