Crashlytics for mobile apps in Qt
-
Hey there :D
I wanted to add Crashlytics to my Qt Project (for now only for Android) but stumbled across some issues :/
Seems like, I am not the first one having troubles,
but I didn't manage to find a solution that works :/@RonaldoD I found your post, back from 2015. I know, that's a little outdated, but I was wondering, if you have some useful hints? Sadly, the website I not available anymore :(
Re: Integrate Qt Android Application with Crashlytics ToolsWhat I managed so far, was the integration of the Firebase Crashlytics SDK from google (not the "old" Fabric SDK)
for the native android java side, essential code below:build.gradle ... apply plugin: 'com.google.firebase.crashlytics' dependencies { ... // Add the Firebase SDK for Crashlytics. //implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' // old fabric implementation 'com.google.firebase:firebase-crashlytics:17.0.0-beta03' // Add the Crashlytics NDK dependency. //implementation 'com.google.firebase:firebase-crashlytics-ndk:17.0.0-beta03'
which seems to work for exceptions and logging on the android side
mFirebaseCrashlytics.log("crashing!"); // log error try { throw new RuntimeException("Test Crash"); } catch (Exception exc) { mFirebaseCrashlytics.recordException(exc); // capture Android stack trace }
But if the App really crashes, it seems that there is no stack trace available in my Crashlytics reports.
Application output from Qt Creator is something like this#30 pc 0023c840 /data/app/com.test.app-RkCEhhQMFtPWdUreXh90mw==/lib/x86/libQt5Core_x86.so (void QJNIObjectPrivate::callStaticMethodV<void>(_jclass*, char const*, char const*, char*)+72) #31 pc 0023c8be /data/app/com.test.app-RkCEhhQMFtPWdUreXh90mw==/lib/x86/libQt5Core_x86.so (void QJNIObjectPrivate::callStaticMethod<void>(_jclass*, char const*, char const*, ...)+58) #32 pc 00023b50 /data/app/com.test.app-RkCEhhQMFtPWdUreXh90mw==/lib/x86/libplugins_platforms_qtforandroid_x86.so (???) No pending exception expected: java.lang.RuntimeException: forced runtime exception at void com.test.app.MyApp.testCrash() (myapp.java:85)
I am not really familiar with the Qt / depending mobile platform build systems,
but I assume I need to add the Crashlytics NDK to be able to capture the cpp/Qt stack trace?But as soon, as I am adding :firebase-crashlytics-ndk:17.0.0-beta03 in the Gradle dependencies, my app crashes at startup:
I System.out: java: 15:26:50.GMT+02:00 > Android onCreate() hit in myActivity.java W System : ClassLoader referenced unknown path: W System.err: java.lang.ClassNotFoundException: Didn't find class "org.qtproject.qt5.android.QtActivityDelegate" on path: DexPathList[[],nativeLibraryDirectories=[/system/lib, /system/product/lib]] W System.err: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196) W System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:379) ... W System.err: at com.test.app.myActivity.onCreate(:61)
Following the guidelines from https://firebase.google.com/docs/crashlytics/ndk-reports-new-sdk I found that I need to
- Run the following NDK-specific Gradle tasks:
./gradlew app:assembleBUILD_VARIANT
./gradlew app:uploadCrashlyticsSymbolFileBUILD_VARIANT
But I do not know, where / when to put these?
Also I don't really understand
Step 3 (optional): Upload symbols for external dependencies
What are "stripped libraries", how do I know which I need and where to find them?
Is there anyone with more experience, who can help me with this topic? :D
Any help is appreciated!best Regards
SyntaX - Run the following NDK-specific Gradle tasks:
-
ok, still don't know what exactly are unstripped / stripped libs are,
but I managed to get basic NDK reports running :Dthe mentioned gradlew app:uploadCrashlyticsSymbol goes into the build.gradle file within the android tag:
afterEvaluate { assembleRelease.finalizedBy(uploadCrashlyticsSymbolFileRelease) }
other settings can be taken from the official sdk documentation found here
https://firebase.google.com/docs/crashlytics/ndk-reports-new-sdk -
I managed to achieve one step further to my goal :D
The 'libs' folder is generated during compilation, which contains the depending .so files,
which I was able to include with relative paths, from the build directory:buildTypes { //debug release { // When minifyEnabled is set to true, Crashlytics automatically // uploads mapping files because the plugin detects that obfuscation // is enabled. mappingFileUploadEnabled defaults to true if // minifyEnabled is true. minifyEnabled true firebaseCrashlytics { //mappingFileUploadEnabled true // Enable processing and uploading of native symbols to Crashlytics // servers. By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled true strippedNativeLibsDir '/libs' unstrippedNativeLibsDir '/libs' } } }
Although the full compilation now takes about 28 minutes on my machine, at least I am able to compile and deploy the application on my test devices (Emulator and Nexus 10 :D)
But if I open the application on my device, it immediately crashes xD
D/libcrashlytics(19474): Initializing native crash handling successful. I/FirebaseCrashlytics(19474): Crashlytics NDK initialization successful ... W/System.err(19474): java.lang.ClassNotFoundException: Didn't find class "org.qtproject.qt5.android.QtActivityDelegate" on path: DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]] W/System.err(19474): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) W/System.err(19474): at java.lang.ClassLoader.loadClass(ClassLoader.java:511) W/System.err(19474): at java.lang.ClassLoader.loadClass(ClassLoader.java:469) ...