From 9267e75cb83b9db6ee61484a546fc0e227d28ced Mon Sep 17 00:00:00 2001 From: Carter Jernigan Date: Tue, 31 May 2022 12:38:02 -0400 Subject: [PATCH] [#303] Write crash logs on external storage (#429) - Added automatic exception logging, registered in the Application object - The design sends the exception to a second process, as the main process could be in a bad state when crashing. If we ever encounter problems with this design, it is easily toggleable to turn off with a boolean resource - Reading the process name is a bit complex on older Android versions, so we leverage a ContentProvider (which runs prior to Application.onCreate()) to get the process name - Added a simple logging mechanism for multiprocess and multithread log messages - Refactored spackle-lib into spackle-lib (multiplatform) and spackle-android-lib Co-authored-by: Honza --- .github/workflows/pull-request.yml | 2 +- .idea/runConfigurations/assemble.xml | 6 +- .../runConfigurations/assembleAndroidTest.xml | 6 +- .../{kotlin_test.xml => check.xml} | 6 +- ...k_connectedCheck_detektAll_ktlint_lint.xml | 27 ++++ .idea/runConfigurations/connectedCheck.xml | 23 +++ ...l => crash_android_lib_connectedCheck.xml} | 6 +- .idea/runConfigurations/ktlintFormat.xml | 6 +- .../spackle_android_lib_connectedCheck.xml | 55 +++++++ .../testDebugWithEmulatorWtf.xml | 23 +++ app/build.gradle.kts | 3 + app/src/main/AndroidManifest.xml | 9 +- .../java/co/electriccoin/zcash/app/AppImpl.kt | 16 -- .../zcash/app/ZcashApplication.kt | 30 ++++ crash-android-lib/build.gradle.kts | 43 +++++ crash-android-lib/gradle.lockfile | 35 +++++ crash-android-lib/proguard-consumer.txt | 0 .../src/androidTest/AndroidManifest.xml | 7 + .../AndroidUncaughtExceptionHandlerTest.kt | 44 ++++++ .../internal/ReportableExceptionTest.kt | 19 +++ .../src/main/AndroidManifest.xml | 21 +++ .../crash/android/AndroidExceptionPath.kt | 35 +++++ .../zcash/crash/android/CrashReporter.kt | 53 +++++++ .../internal/AndroidExceptionReporter.kt | 27 ++++ .../internal/AndroidReportableException.kt | 60 +++++++ .../AndroidUncaughtExceptionHandler.kt | 60 +++++++ .../CrashProcessNameContentProvider.kt | 5 + .../android/internal/ExceptionReceiver.kt | 36 +++++ .../src/main/res/values/bools.xml | 4 + .../src/main/res/values/strings.xml | 4 + crash-lib/build.gradle.kts | 36 +++++ crash-lib/gradle.lockfile | 35 +++++ .../zcash/crash/ReportableException.kt | 14 ++ .../zcash/crash/ReportedException.kt | 12 ++ .../fixture/ReportableExceptionFixture.kt | 24 +++ .../electriccoin/zcash/crash/ExceptionPath.kt | 37 +++++ .../zcash/crash/ReportableExceptionExt.kt | 21 +++ .../zcash/crash/ReportedExceptionExt.kt | 27 ++++ .../zcash/crash/ReportedExceptionExtTest.kt | 29 ++++ docs/Architecture.md | 42 +++-- .../testing/manual_testing/Contact Support.md | 18 ++- .../testing/manual_testing/Crash Reporting.md | 13 ++ docs/testing/manual_testing/Logging.md | 8 + .../proguard-consumer.txt | 0 sdk-ext-lib/proguard-consumer.txt | 0 sdk-ext-ui-lib/proguard-consumer.txt | 0 settings.gradle.kts | 3 + spackle-android-lib/build.gradle.kts | 36 +++++ spackle-android-lib/proguard-consumer.txt | 9 ++ .../src/androidTest/AndroidManifest.xml | 0 .../AbstractProcessNameContentProviderTest.kt | 28 ++++ .../spackle/process/ProcessNameCompatTest.kt | 24 +++ .../src/main/AndroidManifest.xml | 12 ++ .../zcash/spackle/AndroidApiVersion.kt | 0 .../electriccoin/zcash/spackle/ContextExt.kt | 9 ++ .../spackle/CoroutineBroadcastReceiver.kt | 33 ++++ .../zcash/spackle/EmulatorWtfUtil.kt | 2 +- .../zcash/spackle/FirebaseTestLabUtil.kt | 0 .../zcash/spackle/StrictModeCompat.kt | 8 +- .../co/electriccoin/zcash/spackle/Twig.kt | 147 ++++++++++++++++++ .../AbstractProcessNameContentProvider.kt | 72 +++++++++ .../spackle/process/ProcessNameCompat.kt | 80 ++++++++++ .../internal/DefaultProcessContentProvider.kt | 9 ++ spackle-lib/build.gradle.kts | 56 ++++--- spackle-lib/gradle.lockfile | 32 ++++ .../zcash/spackle/model/IndexTest.kt | 12 -- .../zcash/spackle/model/ProgressTest.kt | 19 --- .../zcash/spackle/LazyWithArgument.kt | 0 .../zcash/spackle/SuspendingLazy.kt | 0 .../electriccoin/zcash/spackle/model/Index.kt | 0 .../zcash/spackle/model/Progress.kt | 0 .../zcash/spackle/model/IndexTest.kt | 13 ++ .../zcash/spackle/model/ProgressTest.kt | 21 +++ .../electriccoin/zcash/spackle/io/FileExt.kt | 87 +++++++++++ .../zcash/spackle/io/WriteAtomicallyTest.kt | 62 ++++++++ spackle-lib/src/main/AndroidManifest.xml | 8 - ui-design-lib/build.gradle.kts | 2 +- ui-design-lib/proguard-consumer.txt | 0 ui-lib/build.gradle.kts | 3 +- ui-lib/proguard-consumer.txt | 0 .../view/ScanPermissionGrantedViewTest.kt | 3 + .../co/electriccoin/zcash/ui/MainActivity.kt | 13 +- .../electriccoin/zcash/ui/common/Constants.kt | 4 +- .../zcash/ui/screen/home/view/HomeView.kt | 59 ++++++- .../screen/home/viewmodel/WalletViewModel.kt | 15 +- .../restore/viewmodel/RestoreViewModel.kt | 5 +- .../ui/screen/support/model/CrashInfo.kt | 31 +++- .../ui/screen/support/model/SupportInfo.kt | 2 +- .../support/viewmodel/SupportViewModel.kt | 5 +- 89 files changed, 1761 insertions(+), 150 deletions(-) rename .idea/runConfigurations/{kotlin_test.xml => check.xml} (77%) create mode 100644 .idea/runConfigurations/check_connectedCheck_detektAll_ktlint_lint.xml create mode 100644 .idea/runConfigurations/connectedCheck.xml rename .idea/runConfigurations/{spackle_lib_connectedCheck.xml => crash_android_lib_connectedCheck.xml} (88%) create mode 100644 .idea/runConfigurations/spackle_android_lib_connectedCheck.xml create mode 100644 .idea/runConfigurations/testDebugWithEmulatorWtf.xml delete mode 100644 app/src/main/java/co/electriccoin/zcash/app/AppImpl.kt create mode 100644 app/src/main/java/co/electriccoin/zcash/app/ZcashApplication.kt create mode 100644 crash-android-lib/build.gradle.kts create mode 100644 crash-android-lib/gradle.lockfile create mode 100644 crash-android-lib/proguard-consumer.txt create mode 100644 crash-android-lib/src/androidTest/AndroidManifest.xml create mode 100644 crash-android-lib/src/androidTest/kotlin/co/electriccoin/zcash/crash/android/internal/AndroidUncaughtExceptionHandlerTest.kt create mode 100644 crash-android-lib/src/androidTest/kotlin/co/electriccoin/zcash/crash/android/internal/ReportableExceptionTest.kt create mode 100644 crash-android-lib/src/main/AndroidManifest.xml create mode 100644 crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/AndroidExceptionPath.kt create mode 100644 crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/CrashReporter.kt create mode 100644 crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/internal/AndroidExceptionReporter.kt create mode 100644 crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/internal/AndroidReportableException.kt create mode 100644 crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/internal/AndroidUncaughtExceptionHandler.kt create mode 100644 crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/internal/CrashProcessNameContentProvider.kt create mode 100644 crash-android-lib/src/main/kotlin/co/electriccoin/zcash/crash/android/internal/ExceptionReceiver.kt create mode 100644 crash-android-lib/src/main/res/values/bools.xml create mode 100644 crash-android-lib/src/main/res/values/strings.xml create mode 100644 crash-lib/build.gradle.kts create mode 100644 crash-lib/gradle.lockfile create mode 100644 crash-lib/src/commonMain/kotlin/co/electriccoin/zcash/crash/ReportableException.kt create mode 100644 crash-lib/src/commonMain/kotlin/co/electriccoin/zcash/crash/ReportedException.kt create mode 100644 crash-lib/src/commonMain/kotlin/co/electriccoin/zcash/crash/fixture/ReportableExceptionFixture.kt create mode 100644 crash-lib/src/jvmMain/kotlin/co/electriccoin/zcash/crash/ExceptionPath.kt create mode 100644 crash-lib/src/jvmMain/kotlin/co/electriccoin/zcash/crash/ReportableExceptionExt.kt create mode 100644 crash-lib/src/jvmMain/kotlin/co/electriccoin/zcash/crash/ReportedExceptionExt.kt create mode 100644 crash-lib/src/jvmTest/kotlin/co/electriccoin/zcash/crash/ReportedExceptionExtTest.kt create mode 100644 docs/testing/manual_testing/Crash Reporting.md create mode 100644 docs/testing/manual_testing/Logging.md create mode 100644 preference-impl-android-lib/proguard-consumer.txt create mode 100644 sdk-ext-lib/proguard-consumer.txt create mode 100644 sdk-ext-ui-lib/proguard-consumer.txt create mode 100644 spackle-android-lib/build.gradle.kts create mode 100644 spackle-android-lib/proguard-consumer.txt rename {spackle-lib => spackle-android-lib}/src/androidTest/AndroidManifest.xml (100%) create mode 100644 spackle-android-lib/src/androidTest/java/co/electriccoin/zcash/spackle/process/AbstractProcessNameContentProviderTest.kt create mode 100644 spackle-android-lib/src/androidTest/java/co/electriccoin/zcash/spackle/process/ProcessNameCompatTest.kt create mode 100644 spackle-android-lib/src/main/AndroidManifest.xml rename {spackle-lib/src/main/java => spackle-android-lib/src/main/kotlin}/co/electriccoin/zcash/spackle/AndroidApiVersion.kt (100%) create mode 100644 spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/ContextExt.kt create mode 100644 spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/CoroutineBroadcastReceiver.kt rename {spackle-lib/src/main/java => spackle-android-lib/src/main/kotlin}/co/electriccoin/zcash/spackle/EmulatorWtfUtil.kt (94%) rename {spackle-lib/src/main/java => spackle-android-lib/src/main/kotlin}/co/electriccoin/zcash/spackle/FirebaseTestLabUtil.kt (100%) rename app/src/main/java/co/electriccoin/zcash/app/StrictModeHelper.kt => spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/StrictModeCompat.kt (90%) create mode 100644 spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/Twig.kt create mode 100644 spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/process/AbstractProcessNameContentProvider.kt create mode 100644 spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/process/ProcessNameCompat.kt create mode 100644 spackle-android-lib/src/main/kotlin/co/electriccoin/zcash/spackle/process/internal/DefaultProcessContentProvider.kt create mode 100644 spackle-lib/gradle.lockfile delete mode 100644 spackle-lib/src/androidTest/java/co/electriccoin/zcash/spackle/model/IndexTest.kt delete mode 100644 spackle-lib/src/androidTest/java/co/electriccoin/zcash/spackle/model/ProgressTest.kt rename spackle-lib/src/{main/java => commonMain/kotlin}/co/electriccoin/zcash/spackle/LazyWithArgument.kt (100%) rename spackle-lib/src/{main/java => commonMain/kotlin}/co/electriccoin/zcash/spackle/SuspendingLazy.kt (100%) rename spackle-lib/src/{main/java => commonMain/kotlin}/co/electriccoin/zcash/spackle/model/Index.kt (100%) rename spackle-lib/src/{main/java => commonMain/kotlin}/co/electriccoin/zcash/spackle/model/Progress.kt (100%) create mode 100644 spackle-lib/src/commonTest/kotlin/co/electriccoin/zcash/spackle/model/IndexTest.kt create mode 100644 spackle-lib/src/commonTest/kotlin/co/electriccoin/zcash/spackle/model/ProgressTest.kt create mode 100644 spackle-lib/src/jvmMain/kotlin/co/electriccoin/zcash/spackle/io/FileExt.kt create mode 100644 spackle-lib/src/jvmTest/kotlin/co/electriccoin/zcash/spackle/io/WriteAtomicallyTest.kt delete mode 100644 spackle-lib/src/main/AndroidManifest.xml create mode 100644 ui-design-lib/proguard-consumer.txt create mode 100644 ui-lib/proguard-consumer.txt diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index ca70db67..24052f5b 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -196,7 +196,7 @@ jobs: timeout-minutes: 4 run: | # Note that we explicitly check just the Kotlin modules, to avoid compiling the Android modules here - ./gradlew :preference-api-lib:check + ./gradlew :crash-lib:check :preference-api-lib:check :spackle-lib:check - name: Collect Artifacts if: ${{ always() }} timeout-minutes: 1 diff --git a/.idea/runConfigurations/assemble.xml b/.idea/runConfigurations/assemble.xml index 8f9115b9..451a6c5b 100644 --- a/.idea/runConfigurations/assemble.xml +++ b/.idea/runConfigurations/assemble.xml @@ -4,12 +4,14 @@