See a pretty error screen when your Android app crashes

Overview

WhatTheStack

Banner

WhatTheStack is a library to make your debugging experience on Android better.

It shows you a pretty error screen when your Android App crashes, instead of a boring old dialog saying "Unfortunately, <your-app> has crashed".

Demo

Setup

Release

Add Jitpack repository in your root build.gradle file:

allprojects {
  repositories {
    maven { url 'https://jitpack.io' }
  }
}

And then add the dependency to your app:

dependencies {
  debugImplementation 'com.github.haroldadmin:WhatTheStack:(latest-version)'
}

Now when an uncaught exception is thrown in your application, you will be greeted with a screen containing information about the crash. We support light and dark themes too!

Usage

WhatTheStack works by overriding the default exception handler in your app. It processes any uncaught exception in your app, parses it to extract useful information, and then shows it in a pretty screen.

Automatic Initialization

WhatTheStack uses the Jetpack App Startup library to run automatically when your app starts. You don't need to write any code to initialize it manually.

Need to disable automatic initialization? If you want to disable automatic startup, add the following lines to your Manifest file:
<provider
  android:name="androidx.startup.InitializationProvider"
  android:authorities="${applicationId}.androidx-startup"
  android:exported="false"
  tools:node="merge">
  <meta-data  android:name="com.haroldadmin.whatthestack.WhatTheStackInitializer"
    android:value="androidx.startup"
      tools:node="remove"/>
</provider>

Debug vs Release builds

We recommend using WhatTheStack in debug builds only. We see it as a tool to improve the experience of the developer, not the user.

Need to use it in release builds? If you want to use WhatTheStack in release builds, replace the `debugImplementation` dependency with `implementation'.
dependencies {
-  debugImplementation 'com.github.haroldadmin:WhatTheStack:(latest-version)'
+  implementation 'com.github.haroldadmin:WhatTheStack:(latest-version)'
}'

The library ships with Proguard rules to ensure that it works correctly even after minification.

Contributions

We are happy to accept any external contributions in the form of PRs, issues, or blog posts.

Please consider starring the repository if you find it useful or intriguing!

Comments
  • Add ability to restart the app from the error screen

    Add ability to restart the app from the error screen

    The crash screen should provide the user with the ability to restart the app.

    Tasks:

    • Record information to build an intent for the app when it crashes
    • Add a button below Share Stacktrace which fires the intent to launch the app again
    • Finish the crashed activity

    I am not sure how this would affect the task-stack. Might need to fiddle with launch options to fix unexpected behaviours.

    enhancement Hacktoberfest 
    opened by haroldadmin 9
  • Experiment with Jetpack Compose in WhatTheStackActivity

    Experiment with Jetpack Compose in WhatTheStackActivity

    Jetpack Compose is the next generation UI toolkit for Android. Creating an experimental version of the error screen in compose would serve as a nice playground for the project.

    Tasks:

    • Setup project for Jetpack Compose (enable compose in build features)
    • Create an experimental version of WhatTheStackActivity using composables
    • Incorporate Jetpack Compose's Material Theming for implementing dark mode support
    enhancement Hacktoberfest 
    opened by haroldadmin 6
  • Startup Crash IllegalStateException: Default FirebaseApp is not initialized in this process my.package.id:what_the_stack_process. Make sure to call FirebaseApp.initializeApp(Context) first.

    Startup Crash IllegalStateException: Default FirebaseApp is not initialized in this process my.package.id:what_the_stack_process. Make sure to call FirebaseApp.initializeApp(Context) first.

    The app crashes on startup in the WTS process and I can't initialize the library manually without the content provider because it's annotated with an error and the initializer class is internal 😞

    bug 
    opened by sebaslogen 6
  • Migrate to ViewBinding in the project

    Migrate to ViewBinding in the project

    WhatTheStack started as a small project to only display very basic information on a crash. findViewById sufficed for this purpose.

    However, the complexity of the error screen has increased since then, and is going to continue in that direction. Therefore it makes sense to now refactor the project to migrate to ViewBinding instead.

    Tasks:

    • Enable ViewBinding in the project's build configuration
    • Migrate to ViewBinding in the sample app
    • Migrate to ViewBinding in the library
    enhancement good first issue Hacktoberfest 
    opened by haroldadmin 5
  • Large exceptions (such as stack overflow error) can crash the library, eating the original exception

    Large exceptions (such as stack overflow error) can crash the library, eating the original exception

    When app crashes with a really large exception (such as stack overflow error with a really long stack trace), WhatTheStack will crash:

    kotlinx.coroutines.CoroutinesInternalError: Fatal exception in coroutines machinery for CancellableContinuation(DispatchedContinuation[AndroidUiDispatcher@491392b, Continuation at androidx.compose.runtime.PausableMonotonicFrameClock.withFrameNanos(PausableMonotonicFrameClock.kt:63)@382a188]){Completed}@3066721. Please read KDoc to 'handleFatalException' method and report this incident to maintainers
    	at kotlinx.coroutines.DispatchedTask.handleFatalException(DispatchedTask.kt:144)
    	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:115)
    	at androidx.compose.ui.platform.AndroidUiDispatcher.performTrampolineDispatch(AndroidUiDispatcher.android.kt:81)
    	at androidx.compose.ui.platform.AndroidUiDispatcher.access$performTrampolineDispatch(AndroidUiDispatcher.android.kt:41)
    	at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:68)
    	at [android.view.Choreographer$CallbackRecord.run(Choreographer.java:1035)](http://android.view.Choreographer$CallbackRecord.run(Choreographer.java:1035))
    	at [android.view.Choreographer.doCallbacks(Choreographer.java:845)](http://android.view.Choreographer.doCallbacks(Choreographer.java:845))
    	at [android.view.Choreographer.doFrame(Choreographer.java:775)](http://android.view.Choreographer.doFrame(Choreographer.java:775))
    	at [android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1022)](http://android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1022))
    	at [android.os.Handler.handleCallback(Handler.java:938)](http://android.os.Handler.handleCallback(Handler.java:938))
    	at [android.os.Handler.dispatchMessage(Handler.java:99)](http://android.os.Handler.dispatchMessage(Handler.java:99))
    	at [android.os.Looper.loopOnce(Looper.java:201)](http://android.os.Looper.loopOnce(Looper.java:201))
    	at [android.os.Looper.loop(Looper.java:288)](http://android.os.Looper.loop(Looper.java:288))
    	at [android.app.ActivityThread.main(ActivityThread.java:7840)](http://android.app.ActivityThread.main(ActivityThread.java:7840))
    	at java.lang.reflect.Method.invoke(Native Method)
    	at [com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:550)](http://com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:550))
    	at [com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)](http://com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003))
    Caused by: android.os.TransactionTooLargeException: data parcel size 7859848 bytes
    	at android.os.BinderProxy.transactNative(Native Method)
    	at [android.os.BinderProxy.transact(BinderProxy.java:571)](http://android.os.BinderProxy.transact(BinderProxy.java:571))
    	at [android.os.IMessenger$Stub$Proxy.send(IMessenger.java:125)](http://android.os.IMessenger$Stub$Proxy.send(IMessenger.java:125))
    	at [android.os.Messenger.send(Messenger.java:59)](http://android.os.Messenger.send(Messenger.java:59))
    	at com.haroldadmin.whatthestack.WhatTheStackExceptionHandler.uncaughtException(WhatTheStackExceptionHandler.kt:22)
    	at [java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1073)](http://java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1073))
    	at [java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068)](http://java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068))
    	at kotlinx.coroutines.CoroutineExceptionHandlerImplKt.handleCoroutineExceptionImpl(CoroutineExceptionHandlerImpl.kt:45)
    	at kotlinx.coroutines.CoroutineExceptionHandlerKt.handleCoroutineException(CoroutineExceptionHandler.kt:39)
    	at kotlinx.coroutines.StandaloneCoroutine.handleJobException(Builders.common.kt:192)
    	at kotlinx.coroutines.JobSupport.finalizeFinishingState(JobSupport.kt:229)
    	at kotlinx.coroutines.JobSupport.tryMakeCompletingSlowPath(JobSupport.kt:906)
    	at kotlinx.coroutines.JobSupport.tryMakeCompleting(JobSupport.kt:863)
    	at kotlinx.coroutines.JobSupport.makeCompletingOnce$kotlinx_coroutines_core(JobSupport.kt:828)
    	at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:100)
    	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
    	at kotlinx.coroutines.UndispatchedCoroutine.afterResume(CoroutineContext.kt:147)
    	at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:102)
    	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
    	at kotlinx.coroutines.internal.ScopeCoroutine.afterResume(Scopes.kt:33)
    	at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:102)
    	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
    	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
    

    Even worse, this exception will override original exception, making it unaccessible unless I disable WhatTheStack.

    Maybe in this rare case, WhatTheStack could try catch this error, print original exception to the logcat and just display the message (without the stacktrace)?

    opened by matejdro 4
  • Suspected race conditon exception with Encrypted Realm database

    Suspected race conditon exception with Encrypted Realm database

    Hey,

    We're seeing a crash in our debug and release builds with the below stacktrace. The behaviour is strange because the app technically crashes but because the service is going into a fatal state, we just get a dialog to state that this app keeps stopping etc.

    I believe it's a race condition issue because when I attach a debugger to sanity check the pid, I can't reproduce the issue. Removing WhatTheStack also resolves it but I'd like to see what I can do to work around this.

    When our app starts, our Application will create our Dagger AppModule which includes getting our encrypted realm instance. From your experience with Jetpack Startup, do you believe it would be better for us to adapt it to hopefully prevent this issue?

    stacktrace

    2021-12-13 13:50:36.546 19590-19590/com.my.app.dev E/REALM_JNI: jni: ThrowingException 7, /data/user/0/com.my.app.dev/files/encrypted-register.realm: Encrypted interprocess sharing is currently unsupported.DB has been opened by pid: 19556. Current pid is 19590. in /tmp/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_OsSharedRealm.cpp line 106, . 2021-12-13 13:50:36.546 19590-19590/com.my.app.dev E/REALM_JNI: Exception has been thrown: /data/user/0/com.my.app.dev/files/encrypted-register.realm: Encrypted interprocess sharing is currently unsupported.DB has been opened by pid: 19556. Current pid is 19590. in /tmp/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_OsSharedRealm.cpp line 106 2021-12-13 13:50:36.546 19590-19590/com.my.app.dev D/AndroidRuntime: Shutting down VM 2021-12-13 13:50:36.547 19590-19590/com.my.app.dev E/AndroidRuntime: FATAL EXCEPTION: main Process: com.my.app.dev:what_the_stack_process, PID: 19590 java.lang.RuntimeException: Unable to create application com.my.app.DebugApplication: java.lang.RuntimeException: /data/user/0/com.my.app.dev/files/encrypted-register.realm: Encrypted interprocess sharing is currently unsupported.DB has been opened by pid: 19556. Current pid is 19590. in /tmp/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_OsSharedRealm.cpp line 106 at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6465) at android.app.ActivityThread.access$1300(ActivityThread.java:219) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) Caused by: java.lang.RuntimeException: /data/user/0/com.my.app.dev/files/encrypted-register.realm: Encrypted interprocess sharing is currently unsupported.DB has been opened by pid: 19556. Current pid is 19590. in /tmp/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_OsSharedRealm.cpp line 106 at io.realm.internal.OsSharedRealm.nativeGetSharedRealm(Native Method) at io.realm.internal.OsSharedRealm.(OsSharedRealm.java:175) at io.realm.internal.OsSharedRealm.getInstance(OsSharedRealm.java:251) at io.realm.BaseRealm.(BaseRealm.java:141) at io.realm.BaseRealm.(BaseRealm.java:108) at io.realm.Realm.(Realm.java:159) at io.realm.Realm.createInstance(Realm.java:495) at io.realm.RealmCache.createInstance(RealmCache.java:494) at io.realm.RealmCache.doCreateRealmOrGetFromCache(RealmCache.java:461) at io.realm.RealmCache.createRealmOrGetFromCache(RealmCache.java:422) at io.realm.Realm.getInstance(Realm.java:424) at com.my.app.persistence.RealmDao.getRealmInstance(RealmDao.kt:144) at com.my.app.persistence.RealmDao.executeQuery(RealmDao.kt:137) at com.my.app.users.persistence.UsersDao.findUserById(UsersDao.kt:47) at com.my.app.users.service.UsersService.fetchUserById(UsersService.kt:97) at com.my.app.users.service.UsersService.restorePersistedActiveUser(UsersService.kt:63) at com.my.app.users.service.UsersService.restoreLastLoggedInUser(UsersService.kt:58) at com.my.app.users.service.UsersService.(UsersService.kt:46) at com.my.app.users.service.UsersService_Factory.newInstance(UsersService_Factory.java:65) at com.my.app.users.service.UsersService_Factory.get(UsersService_Factory.java:51) at com.my.app.users.service.UsersService_Factory.get(UsersService_Factory.java:15) at dagger.internal.DoubleCheck.get(DoubleCheck.java:47) at com.my.app.updates.service.UpdateService_Factory.get(UpdateService_Factory.java:90) at com.my.app.updates.service.UpdateService_Factory.get(UpdateService_Factory.java:22) at dagger.internal.DoubleCheck.get(DoubleCheck.java:47) at com.my.app.updates.service.UpdateService_Factory.get(UpdateService_Factory.java:105) at com.my.app.updates.service.UpdateService_Factory.get(UpdateService_Factory.java:26) at dagger.internal.DoubleCheck.get(DoubleCheck.java:47) at dagger.internal.DelegateFactory.get(DelegateFactory.java:36) at com.my.app.scheduler.service.UpdateTimerTask_Factory.get(UpdateTimerTask_Factory.java:33) at com.my.app.scheduler.service.UpdateTimerTask_Factory.get(UpdateTimerTask_Factory.java:11) at com.my.app.scheduler.service.UpdateScheduler_Factory.get(UpdateScheduler_Factory.java:27) 2021-12-13 13:50:36.548 19590-19590/com.my.app.dev E/AndroidRuntime: at com.my.app.scheduler.service.UpdateScheduler_Factory.get(UpdateScheduler_Factory.java:9) at dagger.internal.DoubleCheck.get(DoubleCheck.java:47) at com.my.app.modules.DaggerApplicationComponent.injectApplication(DaggerApplicationComponent.java:3989) at com.my.app.modules.DaggerApplicationComponent.inject(DaggerApplicationComponent.java:3312) at com.my.app.Application.initializeDagger(Application.kt:87) at com.my.app.Application.onCreate(Application.kt:63) at com.my.app.DebugApplication.onCreate(DebugApplication.kt:13) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1182) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6460)

    Thanks!

    opened by kelvinharron 3
  • Error screen does not work with minifyEnabled = true

    Error screen does not work with minifyEnabled = true

    Hi,

    Great idea with the library! Unfortunately I cannot make it work on minified builds: the Service simply doesn't get the message to start the Activity. I can reproduce the issue by building the release variant of the demo app in this repository, without modifying anything. Devices: OnePlus 3T (Android 9), Galaxy Note 10+ (Android 10)

    I've spent some time trying to fix this as I'm working on something similar, but couldn't make it work. I tried starting the service in different ways (starting the Activity in onStartCommand()) which, again, works in debug builds but not after enabling minification. @Keep-ing every relevant class didn't fix the issue either.

    Is there a limitation regarding ProGuard I wasn't aware of?

    Thanks, Peter

    opened by pandulapeter 3
  • Don't override default uncaught exception handler

    Don't override default uncaught exception handler

    If you register a custom UncaughtExceptionHandler you should delegate to the currently set default UncaughtExceptionHandler. This allows for chaining of multiple different UncaughtExceptionHandlers, e.g. WhatTheStack and Crashlytics.

    enhancement 
    opened by hameno 3
  • Support for targeting sdk 31

    Support for targeting sdk 31

    To support users of the library who are targeting SDK 12/S/31 or higher, please add android:exported="true|false" in AndroidManifest.xml for these components:

    com.haroldadmin.whatthestack.WhatTheStackService com.haroldadmin.whatthestack.WhatTheStackActivity

    Currently the only way to get my app to build with targetSdkVersion 31 is to add mergeable entries for these components in my app's Manifest with android:exported="true" to overwrite the library manifest entries i.e.

    <service
              android:name="com.haroldadmin.whatthestack.WhatTheStackService"
              android:process=":what_the_stack_process"
              android:exported="false"
              tools:node="merge"/>
    <activity
              android:name="com.haroldadmin.whatthestack.WhatTheStackActivity"
              android:process=":what_the_stack_process"
              android:exported="true"
              tools:node="merge"/>
    

    see https://developer.android.com/about/versions/12/behavior-changes-12#exported

    opened by ldcomstock 2
  • Add ProGuard rules to keep WhatTheStackInitializer

    Add ProGuard rules to keep WhatTheStackInitializer

    Without this my app consistently crashes due to the class being discarded by R8.

    Stacktrace
     D  Shutting down VM
     E  FATAL EXCEPTION: main
     E  Process: dev.msfjarvis.aps, PID: 2800
     E  java.lang.RuntimeException: Unable to get provider androidx.startup.InitializationProvider: androidx.startup.StartupException: java.lang.ClassNotFoundException: com
        .haroldadmin.whatthestack.WhatTheStackInitializer
     E      at android.app.ActivityThread.installProvider(ActivityThread.java:7135)
     E      at android.app.ActivityThread.installContentProviders(ActivityThread.java:6675)
     E      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6592)
     E      at android.app.ActivityThread.access$1300(ActivityThread.java:233)
     E      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1896)
     E      at android.os.Handler.dispatchMessage(Handler.java:106)
     E      at android.os.Looper.loop(Looper.java:223)
     E      at android.app.ActivityThread.main(ActivityThread.java:7523)
     E      at java.lang.reflect.Method.invoke(Native Method)
     E      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
     E      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)
     E  Caused by: androidx.startup.StartupException: java.lang.ClassNotFoundException: com.haroldadmin.whatthestack.WhatTheStackInitializer
     E      at androidx.startup.InitializationProvider.onCreate(InitializationProvider.java:22)
     E      at android.content.ContentProvider.attachInfo(ContentProvider.java:2388)
     E      at android.content.ContentProvider.attachInfo(ContentProvider.java:2358)
     E      at android.app.ActivityThread.installProvider(ActivityThread.java:7130)
     E      ... 10 more
     E  Caused by: java.lang.ClassNotFoundException: com.haroldadmin.whatthestack.WhatTheStackInitializer
     E      at java.lang.Class.classForName(Native Method)
     E      at java.lang.Class.forName(Class.java:454)
     E      at java.lang.Class.forName(Class.java:379)
     E      at androidx.startup.InitializationProvider.onCreate(InitializationProvider.java:18)
     E      ... 13 more
     E  Caused by: java.lang.ClassNotFoundException: com.haroldadmin.whatthestack.WhatTheStackInitializer
     E      ... 17 more
    
    opened by msfjarvis 2
  • Error when adding to existing project with webviews

    Error when adding to existing project with webviews

    Hey! Thank you for this library. I just got it up and running and we're excited to catch those rare but annoying to debug crashes when away from our machines. I implemented it (0.3.0) into our existing project and had to make two changes to our codebase:

    • Add Configuration.Provider interface for WorkManager in the main application, as we provide Workmanager through Dagger WorkManager.getInstance(applicationContext).
    • Add the following block of code in the Application onCreate:
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        if (packageName != getProcessName()) WebView.setDataDirectorySuffix(getProcessName())
    }
    

    The second fix was a result of whatthestack throwing the following exception:

    Stacktrace
      
      2021-12-03 23:59:10.482 17446-17446/com.myapp.name.dev E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.myapp.name.dev:what_the_stack_process, PID: 17446
        java.lang.RuntimeException: Unable to create application com.myapp.name.DebugApplication: java.lang.RuntimeException: Using WebView from more than one process at once with the same data directory is not supported. https://crbug.com/558377
            at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6465)
            at android.app.ActivityThread.access$1300(ActivityThread.java:219)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859)
            at android.os.Handler.dispatchMessage(Handler.java:107)
            at android.os.Looper.loop(Looper.java:214)
            at android.app.ActivityThread.main(ActivityThread.java:7356)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
         Caused by: java.lang.RuntimeException: Using WebView from more than one process at once with the same data directory is not supported. https://crbug.com/558377
            at org.chromium.android_webview.AwBrowserProcess.a(PG:40)
            at kv.c(PG:90)
            at kv.b(PG:160)
            at kv.e(PG:177)
            at com.android.webview.chromium.WebViewChromiumFactoryProvider.getStatics(PG:204)
            at android.webkit.WebView.setWebContentsDebuggingEnabled(WebView.java:1974)
            at com.myapp.name.DebugApplication.onCreate(DebugApplication.kt:17)
            at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1182)
            at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6460)
            at android.app.ActivityThread.access$1300(ActivityThread.java:219) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859) 
            at android.os.Handler.dispatchMessage(Handler.java:107) 
            at android.os.Looper.loop(Looper.java:214) 
            at android.app.ActivityThread.main(ActivityThread.java:7356) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
    

    I don't see any webview code in this repo, so I assume it's down to us having multiple webviews (and could be fixed by removing WebView.setWebContentsDebuggingEnabled). Happy to close this issue out as it could help others with the same issue.

    opened by kelvinharron 1
  • Add ability to view stacktraces of all threads when the exception is captured

    Add ability to view stacktraces of all threads when the exception is captured

    It is helpful to view the stacktraces of all active threads during the time an exception is thrown. Representing each thread's stacktrace in a list of collapsible items would make it easy to go through each one of them.

    Tasks:

    • Capture all active stacktraces using the Thread.getAllStackTraces() API in the exception handler
    • Parse the captured values and send them over the service connection
    • Create an accordion-style list to display the stacktrace of each thread

    This is a fairly huge change. Discussing exact UI implementations would be helpful before starting work on the PR.

    enhancement Hacktoberfest 
    opened by haroldadmin 0
  • Add more themes for the error screen

    Add more themes for the error screen

    The current error reporting screen supports both light and dark themes, using the Material Components library. It would be great if we could provide more customization options to the user in the form of additional themes.

    Tasks:

    • Add additional themes to styles.xml
    • Make themes configurable through application code, or manifest merger (needs exploration)
    • Perform a check in WhatTheStackActivity to decide which theme to use
    enhancement good first issue 
    opened by haroldadmin 2
  • Error screen does not work if the app crashes very quickly after launching

    Error screen does not work if the app crashes very quickly after launching

    The library relies on a service running in a different process to process and display the error screen. This means that if the application crashes immediately after start, the service might not get enough time to be prepared for accepting new messages.

    Unfortunately it looks like there is no easy solution for this problem.

    bug 
    opened by haroldadmin 7
  • Separate the library into a runtime-module and a ui-module

    Separate the library into a runtime-module and a ui-module

    This library consists of two parts: A background service, and a UI Activity. Consider separating them into different modules and allow more flexibility between them.

    Separating these classes will allow for features such as:

    • Adding custom exception handlers
    • Showing a different Activity when the app crashes
    • Selectively including only the required dependencies in projects
    enhancement 
    opened by haroldadmin 0
  • Additional stack trace options & list items

    Additional stack trace options & list items

    This library is incredibly awesome, it's a tiny idea that can dramatically improve developing experience.

    I haven't had the pleasure yet to test and use it yet but I can tell you a couple of ideas that came to my mind (Maybe with time I can create a pr and add them)

    Instead of exception, cause, message thrown, a RecyclerView listing an icon together with the title, and a content TextView for each field could be used, so you have nicer animations, better graphic and higher flexibility (If one day you want to add another field to show).

    Plus, you could add a "Share Logcat" button alongside "Copy Logcat", to provide more options.

    enhancement 
    opened by cioccarellia 1
Releases(1.0.0-alpha04)
  • 1.0.0-alpha04(Mar 21, 2022)

    WhatTheStack now logs every exception it receives.

    This helps preserve the original error's information even if something goes wrong in the library's internals.

    Source code(tar.gz)
    Source code(zip)
  • 1.0.0-alpha02(Nov 28, 2021)

    WhatTheStack now uses Jetpack Compose!

    Changes

    • Migration to Jetpack Compose
    • Switch target API to 31
    • Switch to Gradle Versions Catalog
    • Upgrade to latest ktlint version
    • Use JDK 11 in CI builds
    • Use JDK 11 in Jitpack builds

    Please try this new release and report any bugs/feedback!

    Source code(tar.gz)
    Source code(zip)
  • 1.0.0-alpha01(Nov 28, 2021)

    WhatTheStack now uses Jetpack Compose!

    Changes

    • Migration to Jetpack Compose
    • Switch target API to 31
    • Switch to Gradle Versions Catalog
    • Upgrade to latest ktlint version
    • Use JDK 11 in CI builds

    Please try this new release and report any bugs/feedback!

    Source code(tar.gz)
    Source code(zip)
  • 0.3.0(Jan 20, 2021)

  • 0.2.0(Oct 30, 2020)

    This release adds the following new features:

    • Compatibility with crash reporting libraries like Crashlytics (thanks @hameno)
    • Updated documentation
    Source code(tar.gz)
    Source code(zip)
  • 0.1.0(Oct 20, 2020)

    Shiny new release for WhatTheStack!

    This release includes several new features:

    • WhatTheStackActivity now uses ViewBinding (thanks @shivam21)
    • Added ability to share the stacktrace directly from WhatTheStackActivity (thanks @larissayasin)
    • Add ability to restart the app from WhatTheStackActivity (thanks again, @shivam21)
    • Shiny new repository banner and logo!
    Source code(tar.gz)
    Source code(zip)
  • 0.0.5(Aug 19, 2020)

  • 0.0.4(Jun 27, 2020)

    This release adds a proguard rules file to WhatTheStack to prevent Proguard/R8 from stripping required code. Thanks to @msfjarvis for contributing these changes!

    Source code(tar.gz)
    Source code(zip)
  • 0.0.3(Jun 20, 2020)

    This release moves WTS to use the Jetpack App Startup library instead of its own ContentProvider.

    This can be a breaking change if you disabled this ContentProvider in your manifest. If not, then it should be a simple version upgrade without affecting any functionality.

    Source code(tar.gz)
    Source code(zip)
Owner
Kshitij Chauhan
Mobile Engineer | CS Undergrad@DTU
Kshitij Chauhan
Small library that allows the application to display a small troubleshooting guide in case of repeated app startup crashes.

AppSalvager What is it? AppSalvager allows you to combat the issue of repeating crashes on app startup. Failed data migration, SDKs not handling their

Alexander Leontev 29 Aug 31, 2022
Proof of concept of custom widgets and apps running on the Z Flip3 cover screen. Adds a widget to Z Flip3 cover screen that lets you launch a web browser-like app on the cover.

SubUI-browser Proof of concept of custom widgets and apps running on the Z Flip3 cover screen. Adds a widget to Z Flip3 cover screen that lets you lau

null 35 Dec 24, 2022
Android-splash-screen-demo - Sample application to demo the various features provided in android-splash-screen

Android Splash screen API demo This is a sample application used to demonstrate the various features provided in android-splash-screen. More details c

Sridhar 1 Jan 3, 2022
KKM (Katalog Kos Moklet) mobile app to see any available kos (boarding house) at moklet

KKM (Katalog Kos Moklet) mobile app to see any available "kos" (boarding house) at moklet

Raviolini 1 Jun 1, 2022
🚀 Stock Market App / See listed companies and details with Jetpack Compose.

?? Stock Market App ?? Preview ?? ✨ See listed companies and details with Jetpack Compose ✨ ?? Libraries Retrofit2 Open CSV Compose Destinations Dagge

Yağmur Erdoğan 6 Sep 19, 2022
🕹️ See how the properties of Android's "shape" affect the Drawable's appearance, intuitively.

GradientDrawableTuner English | 中文 Get confusing about the drawable in Android? Try playing with GradientDrawableTuner! With the GradientDrawableTuner

Hong Duan 344 Nov 29, 2022
A movie application where you can search a movie that you want and see the detail of movie

MovieApp This is a simple movie application where you can search a movie that you want and see the detail of movie Technologies Hilt (Dependency Injec

Serhad Mert 5 Nov 30, 2021
My solutions for the Advent of Code 2021. See the link for a playlist with recordings of me solving each puzzle.

Advent of Code 2021 My solutions for the Advent of Code 2021 solved with Kotlin. What is the Advent of Code? Advent of Code is an online event created

The Self-Taught Software Engineer 6 Jan 5, 2022
LedBuzz is a NodeMCU-powered see-through propeller display

LedBuzz What it does LedBuzz is a NodeMCU-powered see-through propeller display. By simply staring at your ceiling fan, you receive notification alert

Jatin 2 Jan 9, 2022
Keep track of popular & top rated movies and see movie details

Movies Keep track of popular & top rated movies and see movie details Features Keep track of popular & top rated movies See movie details Libraries Je

Amr Saraya 1 May 1, 2022
An Android mobile app for viewing device screen in your web browser

Screen Stream over HTTP An Android mobile app for viewing device screen in your web browser. Developed by Dmitriy Krivoruchko · If there are any issue

Dmitriy Krivoruchko 1.1k Dec 31, 2022
Happy-Birthday - Design and implement a single screen app that displays information

Happy Birthday Android App | Android Basics in Kotlin Course Solution code for t

Anas Tariq 1 Feb 6, 2022
Android cutout screen support Android P. Android O support huawei, xiaomi, oppo and vivo.

CutoutScreenSupport Android cutout screen support Android P. Android O support huawei, xiaomi, oppo and vivo. Usage whether the mobile phone is cutout

hacket 5 Nov 3, 2022
Android samples built using Jetpack Window Manager for foldable and dual-screen devices like Microsoft Surface Duo.

Jetpack Window Manager samples for dual-screen and foldable devices like Microsoft Surface Duo Android app samples that use Jetpack Window Manager to

Microsoft 45 Dec 19, 2022
This Android application demonstrates new splash screen API launched by Google last year.

This Android application demonstrates new splash screen API launched by Google last year.

Mohit Rajput 1 Feb 22, 2022
Turtle Graphics 🐢 implementation for Android Platform with Code Editor, Preview Screen and packages

Turtle Graphics Download Turtle is an Android Application inspired from the original Turtle Graphics and Logo, Logo is an educational programming lang

Amr Hesham 15 Dec 30, 2022
A Simple Splash Screen For Kotlin

SolarSystem I have Completed the TASK-1: Made the splash screen TASK-2: Made a b

Vedant Taak 0 Dec 22, 2021
Source code of JekyllEx Android App which can manage your Jekyll blog directly from your Android device!

JekyllEx Android App Built with ❤︎ by Gourav Khunger ?? Introduction JekyllEx is an Android App that allows you to manage a Jekyll Blog directly from

JekyllEx 24 Nov 8, 2022