{"id":16079379,"url":"https://github.com/Bhuvaneshw/CrashHandler","last_synced_at":"2025-10-22T22:30:45.333Z","repository":{"id":255475659,"uuid":"851197235","full_name":"Bhuvaneshw/CrashHandler","owner":"Bhuvaneshw","description":"A Crash Handling library for Android projects that automatically stores all crash logs in a file until intentionally cleared.","archived":false,"fork":false,"pushed_at":"2024-09-24T03:53:35.000Z","size":1878,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-09T11:04:04.739Z","etag":null,"topics":["android","crash","crash-handler","java","kotlin"],"latest_commit_sha":null,"homepage":"https://acutecoder.netlify.app","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Bhuvaneshw.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-02T15:56:10.000Z","updated_at":"2024-09-24T03:53:38.000Z","dependencies_parsed_at":"2024-09-13T15:11:38.438Z","dependency_job_id":null,"html_url":"https://github.com/Bhuvaneshw/CrashHandler","commit_stats":null,"previous_names":["bhuvaneshw/crashhandler"],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bhuvaneshw%2FCrashHandler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bhuvaneshw%2FCrashHandler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bhuvaneshw%2FCrashHandler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bhuvaneshw%2FCrashHandler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Bhuvaneshw","download_url":"https://codeload.github.com/Bhuvaneshw/CrashHandler/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237743729,"owners_count":19359287,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","crash","crash-handler","java","kotlin"],"created_at":"2024-10-09T11:00:32.420Z","updated_at":"2025-10-22T22:30:45.327Z","avatar_url":"https://github.com/Bhuvaneshw.png","language":"Kotlin","funding_links":[],"categories":["Kotlin"],"sub_categories":[],"readme":"# Crash handler\nA Crash Handling library for Android projects that automatically stores all crash logs in a file until intentionally cleared. It also records the time of the last exception, making it easy to review and debug issues by sharing the logs.\n\u003cbr\u003e\n## Screenshots\n  [\u003cimg src=\"screenshots/Screenshot1.png\" width=\"400\" alt=\"Default Crash Handler\"/\u003e](## \"Default Crash Handler\")  [\u003cimg src=\"screenshots/Screenshot2.png\" width=\"400\" alt=\"Custom Crash Handler\"/\u003e](## \"Custom Crash Handler\")\n\n## Contents:\u003cbr\u003e\n\u003ca href=\"#1-setup\"\u003e1. Setup\u003c/a\u003e\u003cbr\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"#11-gradle---kotlin-dsl\"\u003e1.1 Kotlin DSL\u003c/a\u003e\u003cbr\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"#12-gradle---groovy-dsl\"\u003e1.2 Groovy DSL\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"#2-usage\"\u003e2. Usage\u003c/a\u003e\u003cbr\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"#21-default-crash-handler\"\u003e2.1 Default Crash Hanlder\u003c/a\u003e\u003cbr\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"#22-formatter-and-logger\"\u003e2.2 Formatter and Logger\u003c/a\u003e\u003cbr\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"#23-restart-after-crash\"\u003e2.3 Restart after crash\u003c/a\u003e\u003cbr\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"#24-custom-crash-handler\"\u003e2.4 Custom Crash handler\u003c/a\u003e\u003cbr\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"#25-loading-crash-data-in-activity\"\u003e2.5 Loading Crash data in Activity\u003c/a\u003e\u003cbr\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"#26-thread-specific-crash-handler\"\u003e2.6 Thread specific crash handler\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"#2-usage\"\u003e3. Custom Crash Handler UI\u003c/a\u003e\u003cbr\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"#31-custom-activity-implementation\"\u003e3.1 Custom Activity Implementation\u003c/a\u003e or \u003ca href=\"crashhandler/src/main/java/com/acutecoder/crashhandler/CrashHandlerActivity.kt\"\u003eSee File\u003c/a\u003e\u003cbr\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"#32-custom-activity-implementation-for-compose\"\u003e3.2 Custom Activity Implementation for Compose\u003c/a\u003e or \u003ca href=\"app/src/main/java/com/acutecoder/crashhandler/CustomCrashHandlerActivity.kt\"\u003eSee File\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"#4-license\"\u003e4. License\u003c/a\u003e\n\u003chr\u003e\n\u003cbr\u003e\n\n## 1. Setup\n\n### 1.1 Gradle - Kotlin DSL\nStep 1: Project level build.gradle.kts / settings.gradle.kts\n```kotlin\ndependencyResolutionManagement {\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n        mavenCentral()\n        maven(\"https://jitpack.io\")\n    }\n}\n```\n\nStep 2: Module level build.gradle\u003cbr\u003e\n```kotlin\ndependencies {\n    implementation(\"com.github.Bhuvaneshw:CrashHandler:$version\")\n}\n```\nReplace \u003cb\u003e$version\u003c/b\u003e with latest version\u003cbr\u003e\nLatest Version: \u003cbr\u003e\n[![](https://jitpack.io/v/Bhuvaneshw/CrashHandler.svg)](https://jitpack.io/#Bhuvaneshw/CrashHandler)\u003cbr\u003e\u003cbr\u003e\n\u003cb\u003eExample:\u003c/b\u003e\n```kotlin\ndependencies {\n    implementation(\"com.github.Bhuvaneshw:CrashHandler:1.0.0\")\n}\n```\n\n### 1.2 Gradle - Groovy DSL\nStep 1: Project level build.gradle / settings.gradle\n```groovy\ndependencyResolutionManagement {\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n        mavenCentral()\n        maven { url 'https://jitpack.io' }\n    }\n}\n```\n\nStep 2: Module level build.gradle\u003cbr\u003e\n```groovy\ndependencies {\n    implementation 'com.github.Bhuvaneshw:CrashHandler:$version'\n}\n```\n\u003chr\u003e\n\u003cbr\u003e\n\n## 2. Usage\n### 2.1 Default Crash handler\n\nExtend Application with CrashHandlerApplication and call installCrashHandler()\n\u003cbr\u003e\u003cbr\u003e\nKotlin\n```kotlin\nclass MyApp : CrashHandlerApplication() {\n    init {\n        installCrashHandler()\n    }\n}\n```\n\n\u003cbr\u003e\n\nJava\n```Java\npublic class MyApp extends CrashHandlerApplication {\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        initCrashHandler();\n    }\n}\n```\n\u003cbr\u003e\nRegister in AndroidManifiest\n\n```xml\n\u003capplication\n        android:name=\".MyApp\"\n        ...\u003e\n    ...\n\n    \u003c!-- If you are using default CrashHandlerActivity, register the activity (required from version 1.0.4 onwards)--\u003e\n    \u003cactivity\n        android:name=\"com.acutecoder.crashhandler.CrashHandlerActivity\"\n        android:exported=\"false\" /\u003e\n\n\u003c/application\u003e\n```\n\u003cbr\u003e\n\n\u003e [!NOTE]\n\u003e This default handler will not restart app after crash. See [Restart after crash](#23-restart-after-crash) section\n\n\u003cbr\u003e\n\n### 2.2 Formatter and Logger\nYou can provide Custom Formatter by extending [ErrorMessageFormatter](crashhandler/src/main/java/com/acutecoder/crashhandler/formatter/ErrorMessageFormatter.java) and pass it in [installCrashHandler](#21-default-crash-handler)\n\nYou can provide Custom Logger by extending [CrashLogger](crashhandler/src/main/java/com/acutecoder/crashhandler/logger/CrashLogger.java) and pass it in [installCrashHandler](#21-default-crash-handler)\nKotlin\n```kotlin\nclass MyApp : CrashHandlerApplication() {\n    init {\n        installCrashHandler(\n            errorMessageFormatter = DefaultErrorMessageFormatter, // OR timedErrorMessageFormatter()\n            logger = AndroidErrorLogger(),\n        )\n    }\n}\n```\n\u003cbr\u003e\n\nJava\n```java\npublic class MyApp extends CrashHandlerApplication {\n    @Override\n    public void onCreate() {\n        super.onCreate();\n       initCrashHandler(DefaultErrorMessageFormatter.INSTANCE, new RestartAppCallback(this), new AndroidErrorLogger());\n\n    }\n}\n```\n\u003e [!NOTE]\n\u003e The default formatter is [DefaultErrorMessageFormatter](crashhandler/src/main/java/com/acutecoder/crashhandler/formatter/DefaultErrorMessageFormatter.kt) and the default logger is [AndroidErrorLogger](crashhandler/src/main/java/com/acutecoder/crashhandler/logger/AndroidErrorLogger.kt)\n\n\u003e [!NOTE]\n\u003e TimedErrorMessageFormatter follows Decorator Patter, to create instance use timedErrorMessageFormatter() extension function for Kotlin and new TimedErrorMessageFormatter(this, DefaultErrorMessageFormatter.INSTANCE) for Java\n\n\u003cbr\u003e\n\n### 2.3 Restart after crash\n\nProvide RestartAppCallback() while initializing the crash handler\n\u003cbr\u003e\u003cbr\u003e\nKotlin\n```kotlin\nclass MyApp : CrashHandlerApplication() {\n    init {\n        installCrashHandler(callback = RestartAppCallback(this))\n    }\n}\n```\n\u003cbr\u003e\n\nJava\n```java\npublic class MyApp extends CrashHandlerApplication {\n    @Override\n    public void onCreate() {\n        super.onCreate();\n\n        initCrashHandler(\n          DefaultErrorMessageFormatter.INSTANCE,\n          new RestartAppCallback(this),\n          new AndroidErrorLogger()\n        );\n    }\n}\n```\n\u003cbr\u003e\n\n### 2.4 Custom Crash Handler\n\nOverride startCrashHandlerActivity() and provide your custom activity class\n\u003cbr\u003e\u003cbr\u003e\nKotlin\n```kotlin\nclass CustomCrashHandlerApp : CrashHandlerApplication() {\n\n    init {\n        installCrashHandler()\n    }\n\n    override fun startCrashHandlerActivity(defaultActivityClass: Class\u003c*\u003e) {\n        super.startCrashHandlerActivity(CustomCrashHandlerActivity::class.java) // Provide your custom activity class\n    }\n\n}\n```\n\u003cbr\u003e\n\nJava\n```java\npublic class DefaultCrashHandlerApp extends CrashHandlerApplication {\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        initCrashHandler();\n    }\n\n    @Override\n    protected void startCrashHandlerActivity(@NonNull Class\u003c?\u003e defaultActivityClass) {\n        super.startCrashHandlerActivity(CustomCrashHandlerActivity.class); // Provide your custom activity class\n    }\n}\n\n```\n\u003cbr\u003e\n\n### 2.5 Loading crash data in Activity\n\u003e [!CAUTION]\n\u003e Calling loadErrorLog() on main thread is not allowed, throws ReadLogOnMainThreadException. \n\u003cbr\u003e\n\nKotlin\n```kotlin\nval log: ErrorLog = crashHandler.loadErrorLog()\nval errors: MutableList\u003cString\u003e? = log.errors\nval simplifiedLog: String = log.simplifiedLog()\nval lastErrorTime: String? = log.lastErrorTime\n```\n\u003e [!TIP]\n\u003e Using coroutine with IO dispatcher is recommended\n\u003cbr\u003e\n\nJava\n```ava\nErrorLog log = CrashHandlerUtilsKt.getCrashHandler(context).loadErrorLog();\n//Works only when the context.applicationContext is an instance of CrashHandler,\n//i.e The application must implement CrashHandler, like extending CrashHandlerApplication\nList\u003cString\u003e errors = log.getErrors();\nString simplifiedLog = log.simplifiedLog();\nString lastErrorTime = log.getLastErrorTime();\n```\n\u003cbr\u003e\n\n### 2.6 Thread specific crash handler\nYou can provide specific threads instead of setting it for all threads.\n\u003cbr\u003e\n\nKotlin\n```kotlin\nclass MyApp : CrashHandlerApplication() {\n    init {\n        installCrashHandler(threads = arrayOf(myThread1, myThread2, myThreadN))\n  \n        //OR\n        // installCrashHandler(\n        //    errorMessageFormatter = DefaultErrorMessageFormatter,\n        //    callback = null,\n        //    logger = AndroidErrorLogger(),\n        //    myThread1, myThread2, myThreadN\n        //)\n    }\n}\n```\n\n\u003cbr\u003e\n\nJava\n```java\npublic class MyApp extends CrashHandlerApplication {\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        initCrashHandler(DefaultErrorMessageFormatter.INSTANCE, new RestartAppCallback(this), new AndroidErrorLogger(), myThread1, myThread2, myThreadN);\n    }\n}\n```\n\u003cbr\u003e\n\n## 3. Custom Crash Handler UI\n\n### 3.1 Custom Activity Implementation\n\u003e [!NOTE]\n\u003e For more details see the [CrashHandlerActivity](crashhandler/src/main/java/com/acutecoder/crashhandler/CrashHandlerActivity.kt) implementation.\n\u003cbr\u003e\n\n### 3.2 Custom Activity Implementation for Compose\n\u003e [!NOTE]\n\u003e If you are using compose in your project see [CustomCrashHandlerActivity](app/src/main/java/com/acutecoder/crashhandler/CustomCrashHandlerActivity.kt) for implementation.\n\u003cbr\u003e\n\n\n## 4. License\n```\n    CrashHandler - Crash Handling Library\n    Copyright (C) 2024  Bhuvaneshwaran\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see \u003chttp://www.gnu.org/licenses/\u003e.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FBhuvaneshw%2FCrashHandler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FBhuvaneshw%2FCrashHandler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FBhuvaneshw%2FCrashHandler/lists"}