diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 9cef806461..0abb775d89 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -141,7 +141,7 @@ steps: - docker-compose#v2.6.0: run: android-instrumentation-tests env: - APP_LOCATION: "/app/sdk/build/outputs/apk/androidTest/debug/bugsnag-android-debug-androidTest.apk" + APP_LOCATION: "/app/bugsnag-android-core/build/outputs/apk/androidTest/debug/bugsnag-android-core-debug-androidTest.apk" INSTRUMENTATION_DEVICES: '["Google Nexus 5-4.4", "Google Pixel-7.1", "Google Pixel 3-9.0"]' NDK_VERSION: "r12b" concurrency: 5 @@ -152,7 +152,7 @@ steps: - docker-compose#v2.6.0: run: android-instrumentation-tests env: - APP_LOCATION: "/app/sdk/build/outputs/apk/androidTest/debug/bugsnag-android-debug-androidTest.apk" + APP_LOCATION: "/app/bugsnag-android-core/build/outputs/apk/androidTest/debug/bugsnag-android-core-debug-androidTest.apk" INSTRUMENTATION_DEVICES: '["Google Nexus 5-4.4", "Google Pixel-7.1", "Google Pixel 3-9.0"]' NDK_VERSION: "r16b" concurrency: 5 @@ -163,8 +163,8 @@ steps: - docker-compose#v2.6.0: run: android-instrumentation-tests env: - APP_LOCATION: "/app/sdk/build/outputs/apk/androidTest/debug/bugsnag-android-debug-androidTest.apk" + APP_LOCATION: "/app/bugsnag-android-core/build/outputs/apk/androidTest/debug/bugsnag-android-core-debug-androidTest.apk" INSTRUMENTATION_DEVICES: '["Google Nexus 5-4.4", "Google Pixel-7.1", "Google Pixel 3-9.0"]' NDK_VERSION: "r19" concurrency: 5 - concurrency_group: 'browserstack-app' \ No newline at end of file + concurrency_group: 'browserstack-app' diff --git a/.gitmodules b/.gitmodules index 3d29362928..a0972c06ec 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "sdk/src/main/jni/external/libunwindstack"] - path = sdk/src/main/jni/external/libunwindstack +[submodule "bugsnag-plugin-android-ndk/src/main/jni/external/libunwindstack-ndk"] + path = bugsnag-plugin-android-ndk/src/main/jni/external/libunwindstack-ndk url = https://github.com/bugsnag/libunwindstack-ndk diff --git a/CHANGELOG.md b/CHANGELOG.md index 01f99c1a26..5519e54d89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## 4.17.0 (2019-07-17) + +This release modularizes `bugsnag-android` into 3 separate artifacts: for JVM (Core), NDK, and ANR error +detection. No change should be required to your integration in order to use this version - simply +add a compile-time dependency on either `bugsnag-android` or `bugsnag-android-ndk` as before. + +If you do not wish to use the NDK/ANR artifacts, it is possible to exclude these via gradle. You +should also set `detectNdkCrashes` and `detectAnrs` to false on the `Configuration` object supplied +during `Bugsnag.init()`. + +```groovy +implementation("com.bugsnag:bugsnag-android:$version") { + exclude group: "com.bugsnag", module: "bugsnag-plugin-android-anr" + exclude group: "com.bugsnag", module: "bugsnag-plugin-android-ndk" +} +``` + +* Modularise bugsnag-android into Core, NDK, and ANR artifacts + [#522](https://github.com/bugsnag/bugsnag-android/pull/522) + ## 4.16.1 (2019-07-10) ### Bug fixes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 008f57d241..717d5afa8f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -84,10 +84,10 @@ git submodule update --init --recursive You can build new `.aar` files as follows: ```shell -./gradlew sdk:assemble +./gradlew assembleRelease ``` -Files are generated into`sdk/build/outputs/aar`. +Files are generated into`/build/outputs/aar`. ### Building with custom ABIs @@ -95,7 +95,7 @@ To build the NDK module with specific ABIs, use the `ABI_FILTERS` project option: ```shell -./gradlew assemble -PABI_FILTERS=x86,arm64-v8a +./gradlew assembleRelease -PABI_FILTERS=x86,arm64-v8a ``` ## Testing @@ -104,7 +104,7 @@ Full details of how to build and run tests can be found in [the testing guide](` ## Building the Example App -You can build and install the example app to as follows: +You can build and install the example app as follows: ```shell ./gradlew installDebug @@ -115,41 +115,15 @@ device/emulator. ## Installing/testing against a local maven repository -Sometimes its helpful to build and install the bugsnag-android libraries into a -local repository and test the entire dependency flow inside of a sample -application. - -To get started: - -1. In the `bugsnag-android` directory, run - `./gradlew assembleRelease publishSDKPublicationToMavenLocal && ./gradlew assembleRelease publishSDKPublicationToMavenLocal -PreleaseNdkArtefact=true`. - This installs `bugsnag-android` and `bugsnag-android-ndk` into your local - maven repository. -2. In your sample application `build.gradle`, add `mavenLocal()` to the *top* of - your `allprojects` repositories section: - - ```groovy - allprojects { - repositories { - mavenLocal() - // other repos as needed - } - } - ``` -3. In your sample application `app/build.gradle`, add the following to the - dependencies section, inserting the exact version number required: - - ```groovy - dependencies { - implementation 'com.bugsnag:bugsnag-android-ndk:[VERSION NUMBER]' - } - ``` -4. Clean your sample application and reload dependencies *every time* you - rebuild/republish the local dependencies: - - ``` - ./gradlew clean --refresh-dependencies - ``` +Change `VERSION_NAME` in `gradle.properties` to a version higher than the currently +released bugsnag-android, then run: + +```shell +./gradlew assembleRelease publishToMavenLocal +``` + +This installs bugsnag-android to a local maven repository. The example app should automatically use +this version when you next run the app. # Releasing a New Version @@ -224,12 +198,11 @@ If you are a project maintainer, you can build and release a new version of - [ ] Update the version number and dex count badge by running `make VERSION=[number] bump` - [ ] Inspect the updated CHANGELOG, README, and version files to ensure they are correct - Once merged: - - Pull the latest changes (checking out master if necessary) and build by running `./gradlew sdk:assembleRelease` + - Pull the latest changes (checking out master if necessary) and build by running `./gradlew assembleRelease` - Release to GitHub: - [ ] Run `git tag vX.X.X && git push origin --tags` - [ ] Create a release from your new tag on [GitHub Releases](https://github.com/bugsnag/bugsnag-android/releases) - - [ ] Upload the generated `.aar` file from `{sdk,ndk}/build/outputs/aar/bugsnag-android-*.aar` - - [ ] Release to Maven Central and Bintray by running `./gradlew sdk:assembleRelease publish bintrayUpload && ./gradlew sdk:assembleRelease publish bintrayUpload -PreleaseNdkArtefact=true` + - [ ] Release to Maven Central and Bintray by running `./gradlew assembleRelease publish bintrayUpload` - [ ] "Promote" the release build on Maven Central: - Go to the [sonatype open source dashboard](https://oss.sonatype.org/index.html#stagingRepositories) - Click the search box at the top right, and type “com.bugsnag” diff --git a/Makefile b/Makefile index 68e7d1a2ab..e132069349 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,15 @@ all: build -.PHONY: build test clean bump badge release +.PHONY: build test clean bump release build: - ./gradlew sdk:build + ./gradlew build clean: ./gradlew clean test: - ./gradlew :sdk:connectedCheck + ./gradlew connectedCheck remote-test: ifeq ($(BROWSER_STACK_USERNAME),) @@ -18,7 +18,7 @@ endif ifeq ($(BROWSER_STACK_ACCESS_KEY),) @$(error BROWSER_STACK_ACCESS_KEY is not defined) endif - @APP_LOCATION=/app/sdk/build/outputs/apk/androidTest/debug/bugsnag-android-debug-androidTest.apk \ + @APP_LOCATION=/app/bugsnag-android-core/build/outputs/apk/androidTest/debug/bugsnag-android-core-debug-androidTest.apk \ INSTRUMENTATION_DEVICES='["Google Nexus 5-4.4", "Google Pixel-7.1", "Google Pixel 3-9.0"]' \ docker-compose up --build android-instrumentation-tests @@ -37,7 +37,7 @@ else @APP_LOCATION=/app/build/fixture.apk docker-compose run android-maze-runner endif -bump: badge +bump: ifneq ($(shell git diff --staged),) @git diff --staged @$(error You have uncommitted changes. Push or discard them to continue) @@ -48,29 +48,9 @@ endif @echo Bumping the version number to $(VERSION) @sed -i '' "s/VERSION_NAME=.*/VERSION_NAME=$(VERSION)/" gradle.properties @sed -i '' "s/NOTIFIER_VERSION = .*;/NOTIFIER_VERSION = \"$(VERSION)\";/"\ - sdk/src/main/java/com/bugsnag/android/Notifier.java + bugsnag-android-core/src/main/java/com/bugsnag/android/Notifier.java @sed -i '' "s/## TBD/## $(VERSION) ($(shell date '+%Y-%m-%d'))/" CHANGELOG.md -badge: build -ifneq ($(shell git diff),) - @git diff - @$(error You have unstaged changes. Commit or discard them to continue) -endif - @echo "Counting ..." - @./gradlew countReleaseDexMethods > counter.txt - @awk 'BEGIN{ \ - "cat counter.txt | grep \"com.bugsnag.android\$\"" | getline output;\ - split(output, counts);\ - "du -k sdk/build/outputs/aar/bugsnag-android-*.aar | cut -f1" | getline size;\ - printf "![Method count and size](https://img.shields.io/badge/Methods%%20and%%20size-";\ - printf counts[1] "%%20classes%%20|%%20" counts[2] "%%20methods%%20|%%20" counts[3] "%%20fields%%20|%%20";\ - printf size "%%20KB-e91e63.svg)";\ - };' > tmp_url.txt - @awk '/!.*Method count and size.*/ { getline < "tmp_url.txt" }1' README.md > README.md.tmp - @mv README.md.tmp README.md - @rm counter.txt tmp_url.txt - - # Makes a release release: ifneq ($(shell git diff origin/master..master),) @@ -79,8 +59,8 @@ endif ifeq ($(VERSION),) @$(error VERSION is not defined. Run with `make VERSION=number release`) endif - @git add -p CHANGELOG.md README.md gradle.properties sdk/src/main/java/com/bugsnag/android/Notifier.java + @git add -p CHANGELOG.md README.md gradle.properties bugsnag-android-core/src/main/java/com/bugsnag/android/Notifier.java @git commit -m "Release v$(VERSION)" @git tag v$(VERSION) @git push origin master v$(VERSION) - @./gradlew sdk:assembleRelease publish bintrayUpload && ./gradlew sdk:assembleRelease publish bintrayUpload -PreleaseNdkArtefact=true + @./gradlew assembleRelease publish bintrayUpload && ./gradlew assembleRelease publish bintrayUpload -PreleaseNdkArtefact=true diff --git a/README.md b/README.md index 8c58b7f276..3ccb8cdd31 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,6 @@ # Bugsnag error monitoring & exception reporter for Android [![Documentation](https://img.shields.io/badge/documentation-latest-blue.svg)](https://docs.bugsnag.com/platforms/android/) [![Build status](https://api.travis-ci.com/bugsnag/bugsnag-android.svg?branch=master)](https://travis-ci.com/bugsnag/bugsnag-android) -[![Coverage Status](https://coveralls.io/repos/github/bugsnag/bugsnag-android/badge.svg?branch=master)](https://coveralls.io/github/bugsnag/bugsnag-android?branch=master) - -![Method count and size](https://img.shields.io/badge/Methods%20and%20size-103%20classes%20|%20822%20methods%20|%20408%20fields%20|%202052%20KB-e91e63.svg) Get comprehensive [Android crash reports](https://www.bugsnag.com/platforms/android/) to quickly debug errors. diff --git a/TESTING.md b/TESTING.md index e508aba127..6bd596000c 100644 --- a/TESTING.md +++ b/TESTING.md @@ -1,18 +1,27 @@ # Testing the Bugsnag Android notifier -## Running Tests Locally +Commands can be run on the entire project, or on an individual module: -Running the test suite requires a connected android device or emulator. +```shell +./gradlew build // builds whole project +./gradlew bugsnag-plugin-android-anr:build // builds bugsnag-plugin-android-anr module only +``` + +## Static analysis + +```shell +./gradlew lint checkstyle detekt +``` -### Unit tests +## Running Tests Locally -You can run the test suite on a device/emulator as follows from within the sdk directory: +Running the test suite requires a connected android device or emulator. ```shell ./gradlew connectedCheck ``` -### End-to-end tests +## End-to-end tests To run the end-to-end tests, first set up the environment by running [Bundler](https://bundler.io): @@ -32,14 +41,6 @@ Then run the tests using: bundle exec maze-runner ``` -### Running Lint - -You can run lint on the project using the following command: - -```shell -./gradlew lint checkstyle detekt -``` - ## Running remote tests These tests are implemented with our notifier testing tool [Maze runner](https://github.com/bugsnag/maze-runner). @@ -95,4 +96,4 @@ Run `make remote-integration-tests` If you wish to test a single feature, set the `TEST_FEATURE` environment variable to the name of the feature file. For example, to test the `breadcrumb` feature, use the following command: -`TEST_FEATURE=breadcrumb.feature make remote-integration-tests` \ No newline at end of file +`TEST_FEATURE=breadcrumb.feature make remote-integration-tests` diff --git a/bugsnag-android-core/README.md b/bugsnag-android-core/README.md new file mode 100644 index 0000000000..3d48abdb06 --- /dev/null +++ b/bugsnag-android-core/README.md @@ -0,0 +1,9 @@ +# bugsnag-android-core + +This module detects JVM exceptions and reports them to bugsnag. + +## High-level Overview + +An `UncaughtExceptionHandler` is installed which generates an error report whenever an uncaught +`Throwable` propagates. This module is also responsible for the delivery of JSON payloads to the +Error Reporting API, and also provides the main public API for bugsnag-android. diff --git a/bugsnag-android-core/build.gradle b/bugsnag-android-core/build.gradle new file mode 100644 index 0000000000..a8ba9d778f --- /dev/null +++ b/bugsnag-android-core/build.gradle @@ -0,0 +1,13 @@ +apply plugin: "com.android.library" +apply plugin: "kotlin-android" +apply plugin: "io.gitlab.arturbosch.detekt" + +android { + compileSdkVersion rootProject.ext.compileSdkVersion + defaultConfig.minSdkVersion rootProject.ext.minSdkVersion +} + +apply from: "../gradle/dependencies.gradle" +apply from: "../gradle/release.gradle" +apply from: "../gradle/detekt.gradle" +apply from: "../gradle/checkstyle.gradle" diff --git a/bugsnag-android-core/gradle.properties b/bugsnag-android-core/gradle.properties new file mode 100644 index 0000000000..99e420b0a5 --- /dev/null +++ b/bugsnag-android-core/gradle.properties @@ -0,0 +1,2 @@ +pomName=Bugsnag Android Core +artefactId=bugsnag-android-core diff --git a/sdk/proguard-rules.pro b/bugsnag-android-core/proguard-rules.pro similarity index 84% rename from sdk/proguard-rules.pro rename to bugsnag-android-core/proguard-rules.pro index cc792bffa1..74acea78f5 100644 --- a/sdk/proguard-rules.pro +++ b/bugsnag-android-core/proguard-rules.pro @@ -4,4 +4,3 @@ -keep class com.bugsnag.android.Breadcrumbs { *; } -keep class com.bugsnag.android.BreadcrumbType { *; } -keep class com.bugsnag.android.Severity { *; } --keep class com.bugsnag.android.ndk.NativeBridge { *; } diff --git a/sdk/src/androidTest/AndroidManifest.xml b/bugsnag-android-core/src/androidTest/AndroidManifest.xml similarity index 100% rename from sdk/src/androidTest/AndroidManifest.xml rename to bugsnag-android-core/src/androidTest/AndroidManifest.xml diff --git a/sdk/src/androidTest/java/com/bugsnag/android/AnrConfigTest.kt b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AnrConfigTest.kt similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/AnrConfigTest.kt rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AnrConfigTest.kt diff --git a/sdk/src/androidTest/java/com/bugsnag/android/AppDataOverrideTest.kt b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataOverrideTest.kt similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/AppDataOverrideTest.kt rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataOverrideTest.kt diff --git a/sdk/src/androidTest/java/com/bugsnag/android/AppDataSummaryTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataSummaryTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/AppDataSummaryTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataSummaryTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/AppDataTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataTest.java similarity index 93% rename from sdk/src/androidTest/java/com/bugsnag/android/AppDataTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataTest.java index 49453b1abe..3471e1e42c 100644 --- a/sdk/src/androidTest/java/com/bugsnag/android/AppDataTest.java +++ b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataTest.java @@ -52,7 +52,7 @@ public void setUp() throws Exception { @Test public void testAccessors() { - assertEquals("com.bugsnag.android.test", appData.get("packageName")); + assertEquals("com.bugsnag.android.core.test", appData.get("packageName")); assertNull(appData.get("buildUUID")); assertTrue(((Long) appData.get("duration")) > 0); assertEquals(500L, appData.get("durationInForeground")); @@ -68,7 +68,7 @@ public void testJsonSerialisation() throws JSONException { assertEquals("1.0", appDataJson.get("version")); assertEquals("development", appDataJson.get("releaseStage")); assertEquals("android", appDataJson.get("type")); - assertEquals("com.bugsnag.android.test", appDataJson.get("id")); + assertEquals("com.bugsnag.android.core.test", appDataJson.get("id")); assertNotNull(appDataJson.get("buildUUID")); assertTrue(((Long) appData.get("duration")) > 0); assertEquals(500L, appData.get("durationInForeground")); diff --git a/sdk/src/androidTest/java/com/bugsnag/android/BeforeNotifyTest.kt b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/BeforeNotifyTest.kt similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/BeforeNotifyTest.kt rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/BeforeNotifyTest.kt diff --git a/sdk/src/androidTest/java/com/bugsnag/android/BeforeRecordBreadcrumbsTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/BeforeRecordBreadcrumbsTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/BeforeRecordBreadcrumbsTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/BeforeRecordBreadcrumbsTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/BeforeSendTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/BeforeSendTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/BeforeSendTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/BeforeSendTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/BreadcrumbsTest.kt b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/BreadcrumbsTest.kt similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/BreadcrumbsTest.kt rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/BreadcrumbsTest.kt diff --git a/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/BugsnagPluginInterfaceTest.kt b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/BugsnagPluginInterfaceTest.kt new file mode 100644 index 0000000000..633a5f34df --- /dev/null +++ b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/BugsnagPluginInterfaceTest.kt @@ -0,0 +1,33 @@ +package com.bugsnag.android + +import org.junit.Test + +import org.junit.Assert.* +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.junit.MockitoJUnitRunner + +@RunWith(MockitoJUnitRunner::class) +class BugsnagPluginInterfaceTest { + + @Mock + lateinit var client: Client + + @Test + fun registerPlugin() { + BugsnagPluginInterface.registerPlugin(FakePlugin::class.java) + BugsnagPluginInterface.loadPlugins(client) + assertTrue(FakePlugin.initialised) + } +} + +internal class FakePlugin: BugsnagPlugin { + companion object { + var initialised = false + } + + override fun initialisePlugin(client: Client) { + initialised = true + } +} + diff --git a/sdk/src/androidTest/java/com/bugsnag/android/BugsnagTestUtils.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/BugsnagTestUtils.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/BugsnagTestUtils.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/BugsnagTestUtils.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/CachedThreadTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/CachedThreadTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/CachedThreadTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/CachedThreadTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ClientConfigTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ClientConfigTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/ClientConfigTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ClientConfigTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ClientNotifyTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ClientNotifyTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/ClientNotifyTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ClientNotifyTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ClientTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ClientTest.java similarity index 99% rename from sdk/src/androidTest/java/com/bugsnag/android/ClientTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ClientTest.java index 5868e1e2ef..a4aba8e64d 100644 --- a/sdk/src/androidTest/java/com/bugsnag/android/ClientTest.java +++ b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ClientTest.java @@ -330,7 +330,7 @@ public void testAppDataMetaData() { Map app = client.getAppData().getAppDataMetaData(); assertEquals(6, app.size()); assertEquals("Bugsnag Android Tests", app.get("name")); - assertEquals("com.bugsnag.android.test", app.get("packageName")); + assertEquals("com.bugsnag.android.core.test", app.get("packageName")); assertEquals("1.0", app.get("versionName")); assertNotNull(app.get("memoryUsage")); assertTrue(app.containsKey("activeScreen")); diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ConcurrentCallbackTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ConcurrentCallbackTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/ConcurrentCallbackTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ConcurrentCallbackTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ConfigurationTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ConfigurationTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/ConfigurationTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ConfigurationTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/CustomException.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/CustomException.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/CustomException.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/CustomException.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/DeliveryCompatTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/DeliveryCompatTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/DeliveryCompatTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/DeliveryCompatTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/DeviceDataSummaryTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/DeviceDataSummaryTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/DeviceDataSummaryTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/DeviceDataSummaryTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/DeviceDataTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/DeviceDataTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/DeviceDataTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/DeviceDataTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ErrorFilenameTest.kt b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ErrorFilenameTest.kt similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/ErrorFilenameTest.kt rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ErrorFilenameTest.kt diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ErrorReaderTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ErrorReaderTest.java similarity index 98% rename from sdk/src/androidTest/java/com/bugsnag/android/ErrorReaderTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ErrorReaderTest.java index c76480a340..30398be794 100644 --- a/sdk/src/androidTest/java/com/bugsnag/android/ErrorReaderTest.java +++ b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ErrorReaderTest.java @@ -9,7 +9,6 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; @@ -41,8 +40,8 @@ public class ErrorReaderTest { /** Constructs an Error from a JSON file */ @BeforeClass public static void setUp() throws IOException { - InputStream input = InstrumentationRegistry.getContext().getResources() - .openRawResource(com.bugsnag.android.test.R.raw.error); + ClassLoader classLoader = ErrorReaderTest.class.getClassLoader(); + InputStream input = classLoader.getResourceAsStream("error.json"); File fixtureFile = File.createTempFile("error", ".json"); OutputStream output = new FileOutputStream(fixtureFile); try { diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ErrorReportApiClientTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ErrorReportApiClientTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/ErrorReportApiClientTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ErrorReportApiClientTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ErrorTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ErrorTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/ErrorTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ErrorTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/EventReceiverTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/EventReceiverTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/EventReceiverTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/EventReceiverTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ExceptionHandlerTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ExceptionHandlerTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/ExceptionHandlerTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ExceptionHandlerTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ExceptionsTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ExceptionsTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/ExceptionsTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ExceptionsTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/FileUtils.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/FileUtils.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/FileUtils.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/FileUtils.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/HandledStateTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/HandledStateTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/HandledStateTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/HandledStateTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/JsonStreamTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/JsonStreamTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/JsonStreamTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/JsonStreamTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/JsonWriterBugsnagTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/JsonWriterBugsnagTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/JsonWriterBugsnagTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/JsonWriterBugsnagTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/JsonWriterTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/JsonWriterTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/JsonWriterTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/JsonWriterTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/MetaDataMergeTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/MetaDataMergeTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/MetaDataMergeTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/MetaDataMergeTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/MetaDataTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/MetaDataTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/MetaDataTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/MetaDataTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/NativeInterfaceTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/NativeInterfaceTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/NativeInterfaceTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/NativeInterfaceTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/NotifierTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/NotifierTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/NotifierTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/NotifierTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/NullMetadataTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/NullMetadataTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/NullMetadataTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/NullMetadataTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ObserverInterfaceTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ObserverInterfaceTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/ObserverInterfaceTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ObserverInterfaceTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ProjectPackagesTest.kt b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ProjectPackagesTest.kt similarity index 89% rename from sdk/src/androidTest/java/com/bugsnag/android/ProjectPackagesTest.kt rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ProjectPackagesTest.kt index d4facf62d9..d653e946a2 100644 --- a/sdk/src/androidTest/java/com/bugsnag/android/ProjectPackagesTest.kt +++ b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ProjectPackagesTest.kt @@ -13,7 +13,7 @@ class ProjectPackagesTest { assertNull(configuration.projectPackages) val client = Client(InstrumentationRegistry.getContext(), configuration) - assertArrayEquals(arrayOf("com.bugsnag.android.test"), client.config.projectPackages) + assertArrayEquals(arrayOf("com.bugsnag.android.core.test"), client.config.projectPackages) client.close() } diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ReportTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ReportTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/ReportTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ReportTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/RxErrorTest.kt b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/RxErrorTest.kt similarity index 84% rename from sdk/src/androidTest/java/com/bugsnag/android/RxErrorTest.kt rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/RxErrorTest.kt index 3ea3cc82cb..55a30a226c 100644 --- a/sdk/src/androidTest/java/com/bugsnag/android/RxErrorTest.kt +++ b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/RxErrorTest.kt @@ -1,15 +1,10 @@ package com.bugsnag.android -import android.support.test.InstrumentationRegistry import com.bugsnag.android.BugsnagTestUtils.streamableToJsonArray -import com.bugsnag.android.test.R import org.json.JSONObject -import org.junit.Assert.* - +import org.junit.Assert.assertEquals import org.junit.Test - import java.io.File -import java.io.FileOutputStream class RxErrorTest { @@ -48,10 +43,9 @@ class RxErrorTest { } private fun loadErrorFromFile(): Error? { - val input = InstrumentationRegistry.getContext().resources - .openRawResource(R.raw.rx_error) + val fileContents = javaClass.classLoader!!.getResource("rx_error.json")!!.readText() val fixtureFile = File.createTempFile("rx_error", ".json") - input.copyTo(FileOutputStream(fixtureFile)) + fixtureFile.writeText(fileContents) return ErrorReader.readError(Configuration("key"), fixtureFile) } } diff --git a/sdk/src/androidTest/java/com/bugsnag/android/SessionStoreTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/SessionStoreTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/SessionStoreTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/SessionStoreTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/SessionTest.kt b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/SessionTest.kt similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/SessionTest.kt rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/SessionTest.kt diff --git a/sdk/src/androidTest/java/com/bugsnag/android/SessionTrackerStopResumeTest.kt b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/SessionTrackerStopResumeTest.kt similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/SessionTrackerStopResumeTest.kt rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/SessionTrackerStopResumeTest.kt diff --git a/sdk/src/androidTest/java/com/bugsnag/android/SessionTrackerTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/SessionTrackerTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/SessionTrackerTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/SessionTrackerTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/SessionTrackingPayloadTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/SessionTrackingPayloadTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/SessionTrackingPayloadTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/SessionTrackingPayloadTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/StacktraceTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/StacktraceTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/StacktraceTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/StacktraceTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/StrictModeTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/StrictModeTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/StrictModeTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/StrictModeTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/StrictModeWrapper.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/StrictModeWrapper.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/StrictModeWrapper.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/StrictModeWrapper.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/TestRunListener.kt b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/TestRunListener.kt similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/TestRunListener.kt rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/TestRunListener.kt diff --git a/sdk/src/androidTest/java/com/bugsnag/android/ThreadStateTest.kt b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ThreadStateTest.kt similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/ThreadStateTest.kt rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ThreadStateTest.kt diff --git a/sdk/src/androidTest/java/com/bugsnag/android/UniqueBeforeNotifyTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/UniqueBeforeNotifyTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/UniqueBeforeNotifyTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/UniqueBeforeNotifyTest.java diff --git a/sdk/src/androidTest/java/com/bugsnag/android/UserTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/UserTest.java similarity index 100% rename from sdk/src/androidTest/java/com/bugsnag/android/UserTest.java rename to bugsnag-android-core/src/androidTest/java/com/bugsnag/android/UserTest.java diff --git a/sdk/src/androidTest/res/raw/error.json b/bugsnag-android-core/src/androidTest/resources/error.json similarity index 100% rename from sdk/src/androidTest/res/raw/error.json rename to bugsnag-android-core/src/androidTest/resources/error.json diff --git a/sdk/src/androidTest/res/raw/rx_error.json b/bugsnag-android-core/src/androidTest/resources/rx_error.json similarity index 100% rename from sdk/src/androidTest/res/raw/rx_error.json rename to bugsnag-android-core/src/androidTest/resources/rx_error.json diff --git a/sdk/src/main/AndroidManifest.xml b/bugsnag-android-core/src/main/AndroidManifest.xml similarity index 78% rename from sdk/src/main/AndroidManifest.xml rename to bugsnag-android-core/src/main/AndroidManifest.xml index 30e7fcebe8..15e2e4fac7 100644 --- a/sdk/src/main/AndroidManifest.xml +++ b/bugsnag-android-core/src/main/AndroidManifest.xml @@ -1,8 +1,6 @@ + package="com.bugsnag.android.core"> diff --git a/sdk/src/main/java/com/bugsnag/android/AppData.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/AppData.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/AppData.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/AppData.java diff --git a/sdk/src/main/java/com/bugsnag/android/Async.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Async.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/Async.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Async.java diff --git a/sdk/src/main/java/com/bugsnag/android/BadResponseException.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/BadResponseException.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/BadResponseException.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/BadResponseException.java diff --git a/sdk/src/main/java/com/bugsnag/android/BeforeNotify.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/BeforeNotify.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/BeforeNotify.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/BeforeNotify.java diff --git a/sdk/src/main/java/com/bugsnag/android/BeforeRecordBreadcrumb.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/BeforeRecordBreadcrumb.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/BeforeRecordBreadcrumb.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/BeforeRecordBreadcrumb.java diff --git a/sdk/src/main/java/com/bugsnag/android/BeforeSend.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/BeforeSend.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/BeforeSend.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/BeforeSend.java diff --git a/sdk/src/main/java/com/bugsnag/android/BeforeSendSession.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/BeforeSendSession.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/BeforeSendSession.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/BeforeSendSession.java diff --git a/sdk/src/main/java/com/bugsnag/android/Breadcrumb.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Breadcrumb.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/Breadcrumb.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Breadcrumb.java diff --git a/sdk/src/main/java/com/bugsnag/android/BreadcrumbType.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/BreadcrumbType.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/BreadcrumbType.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/BreadcrumbType.java diff --git a/sdk/src/main/java/com/bugsnag/android/Breadcrumbs.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Breadcrumbs.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/Breadcrumbs.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Breadcrumbs.java diff --git a/sdk/src/main/java/com/bugsnag/android/Bugsnag.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Bugsnag.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/Bugsnag.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Bugsnag.java diff --git a/sdk/src/main/java/com/bugsnag/android/BugsnagException.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/BugsnagException.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/BugsnagException.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/BugsnagException.java diff --git a/bugsnag-android-core/src/main/java/com/bugsnag/android/BugsnagPluginInterface.kt b/bugsnag-android-core/src/main/java/com/bugsnag/android/BugsnagPluginInterface.kt new file mode 100644 index 0000000000..5118700810 --- /dev/null +++ b/bugsnag-android-core/src/main/java/com/bugsnag/android/BugsnagPluginInterface.kt @@ -0,0 +1,30 @@ +package com.bugsnag.android + +interface BugsnagPlugin { + fun initialisePlugin(client: Client) +} + +object BugsnagPluginInterface { + + private val plugins = mutableSetOf>() + + fun registerPlugin(clz: Class<*>) { + plugins.add(clz) + } + + @JvmName("loadPlugins") + internal fun loadPlugins(client: Client) { + plugins + .toSet() + .mapNotNull { convertClzToPlugin(it) } + .forEach { it.initialisePlugin(client) } + } + + private fun convertClzToPlugin(it: Class<*>): BugsnagPlugin? { + return try { + it.newInstance() as BugsnagPlugin + } catch (exc: Exception) { + null + } + } +} diff --git a/sdk/src/main/java/com/bugsnag/android/CachedThread.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/CachedThread.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/CachedThread.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/CachedThread.java diff --git a/sdk/src/main/java/com/bugsnag/android/Callback.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Callback.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/Callback.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Callback.java diff --git a/sdk/src/main/java/com/bugsnag/android/Client.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Client.java similarity index 97% rename from sdk/src/main/java/com/bugsnag/android/Client.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Client.java index c24aebf572..1677d17139 100644 --- a/sdk/src/main/java/com/bugsnag/android/Client.java +++ b/bugsnag-android-core/src/main/java/com/bugsnag/android/Client.java @@ -12,8 +12,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.Resources; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; @@ -76,7 +74,6 @@ public class Client extends Observable implements Observer { final SharedPreferences sharedPrefs; private final OrientationEventListener orientationListener; - private AppNotRespondingMonitor anrMonitor; private final Connectivity connectivity; /** @@ -209,10 +206,6 @@ public void onErrorReadFailure(Error error) { enableExceptionHandler(); } - if (config.getDetectAnrs()) { - enableAnrDetection(); - } - // register a receiver for automatic breadcrumbs try { @@ -253,37 +246,37 @@ public void onOrientationChanged(int orientation) { // Flush any on-disk errors errorStore.flushOnLaunch(); - - if (config.getDetectNdkCrashes() || config.getDetectAnrs()) { - NativeInterface.configureClientObservers(this); - } + loadPlugins(); } - private void enableAnrDetection() { - AppNotRespondingMonitor.Delegate delegate = new AppNotRespondingMonitor.Delegate() { - @Override - public void onAppNotResponding(Thread thread) { - String errMsg = "Application did not respond to UI input"; - BugsnagException exc = new BugsnagException("ANR", errMsg, thread.getStackTrace()); + private void loadPlugins() { + NativeInterface.setClient(this); + BugsnagPluginInterface pluginInterface = BugsnagPluginInterface.INSTANCE; - cacheAndNotify(exc, Severity.ERROR, new MetaData(), - HandledState.REASON_ANR, null, thread); + if (config.getDetectNdkCrashes()) { + try { + pluginInterface.registerPlugin(Class.forName("com.bugsnag.android.NdkPlugin")); + } catch (ClassNotFoundException exc) { + Logger.warn("bugsnag-plugin-android-ndk artefact not found on classpath, " + + "NDK errors will not be captured."); } - }; - anrMonitor = new AppNotRespondingMonitor(delegate); - anrMonitor.start(); // begin monitoring for ANRs + } + if (config.getDetectAnrs()) { + try { + pluginInterface.registerPlugin(Class.forName("com.bugsnag.android.AnrPlugin")); + } catch (ClassNotFoundException exc) { + Logger.warn("bugsnag-plugin-android-anr artefact not found on classpath, " + + "ANR errors will not be captured."); + } + } + pluginInterface.loadPlugins(this); } void sendNativeSetupNotification() { setChanged(); ArrayList messageArgs = new ArrayList<>(); messageArgs.add(config); - if (anrMonitor != null) { - Object buffer = anrMonitor.getSentinelBuffer(); - if (buffer != null) { - messageArgs.add(buffer); - } - } + super.notifyObservers(new Message(NativeInterface.MessageType.INSTALL, messageArgs)); try { Async.run(new Runnable() { diff --git a/sdk/src/main/java/com/bugsnag/android/ConfigFactory.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/ConfigFactory.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/ConfigFactory.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/ConfigFactory.java diff --git a/sdk/src/main/java/com/bugsnag/android/Configuration.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Configuration.java similarity index 98% rename from sdk/src/main/java/com/bugsnag/android/Configuration.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Configuration.java index 8929a11418..c53bfddb7c 100644 --- a/sdk/src/main/java/com/bugsnag/android/Configuration.java +++ b/bugsnag-android-core/src/main/java/com/bugsnag/android/Configuration.java @@ -1,11 +1,11 @@ package com.bugsnag.android; import android.content.Context; -import android.os.Debug; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; +import java.lang.reflect.Field; import java.util.Arrays; import java.util.Collection; import java.util.Date; @@ -49,7 +49,7 @@ public class Configuration extends Observable implements Observer { private boolean automaticallyCollectBreadcrumbs = true; private boolean detectAnrs = false; - private boolean detectNdkCrashes = BuildConfig.DETECT_NDK_CRASHES; + private boolean detectNdkCrashes; private long anrThresholdMs = 5000; @NonNull @@ -75,6 +75,15 @@ public Configuration(@NonNull String apiKey) { this.apiKey = apiKey; this.metaData = new MetaData(); this.metaData.addObserver(this); + + try { + // check if DETECT_NDK_CRASHES has been set in bugsnag-android or bugsnag-android-ndk + Class clz = Class.forName("com.bugsnag.android.BuildConfig"); + Field field = clz.getDeclaredField("DETECT_NDK_CRASHES"); + detectNdkCrashes = field.getBoolean(null); + } catch (Throwable exc) { + detectNdkCrashes = false; + } } /** diff --git a/sdk/src/main/java/com/bugsnag/android/ConnectivityCompat.kt b/bugsnag-android-core/src/main/java/com/bugsnag/android/ConnectivityCompat.kt similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/ConnectivityCompat.kt rename to bugsnag-android-core/src/main/java/com/bugsnag/android/ConnectivityCompat.kt diff --git a/sdk/src/main/java/com/bugsnag/android/DateUtils.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/DateUtils.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/DateUtils.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/DateUtils.java diff --git a/sdk/src/main/java/com/bugsnag/android/DefaultDelivery.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/DefaultDelivery.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/DefaultDelivery.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/DefaultDelivery.java diff --git a/sdk/src/main/java/com/bugsnag/android/Delivery.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Delivery.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/Delivery.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Delivery.java diff --git a/sdk/src/main/java/com/bugsnag/android/DeliveryCompat.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/DeliveryCompat.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/DeliveryCompat.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/DeliveryCompat.java diff --git a/sdk/src/main/java/com/bugsnag/android/DeliveryFailureException.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/DeliveryFailureException.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/DeliveryFailureException.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/DeliveryFailureException.java diff --git a/sdk/src/main/java/com/bugsnag/android/DeliveryStyle.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/DeliveryStyle.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/DeliveryStyle.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/DeliveryStyle.java diff --git a/sdk/src/main/java/com/bugsnag/android/DeviceData.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/DeviceData.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/DeviceData.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/DeviceData.java diff --git a/sdk/src/main/java/com/bugsnag/android/Error.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Error.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/Error.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Error.java diff --git a/sdk/src/main/java/com/bugsnag/android/ErrorReader.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/ErrorReader.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/ErrorReader.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/ErrorReader.java diff --git a/sdk/src/main/java/com/bugsnag/android/ErrorReportApiClient.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/ErrorReportApiClient.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/ErrorReportApiClient.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/ErrorReportApiClient.java diff --git a/sdk/src/main/java/com/bugsnag/android/ErrorStore.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/ErrorStore.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/ErrorStore.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/ErrorStore.java diff --git a/sdk/src/main/java/com/bugsnag/android/EventReceiver.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/EventReceiver.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/EventReceiver.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/EventReceiver.java diff --git a/sdk/src/main/java/com/bugsnag/android/ExceptionHandler.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/ExceptionHandler.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/ExceptionHandler.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/ExceptionHandler.java diff --git a/sdk/src/main/java/com/bugsnag/android/Exceptions.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Exceptions.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/Exceptions.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Exceptions.java diff --git a/sdk/src/main/java/com/bugsnag/android/FileStore.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/FileStore.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/FileStore.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/FileStore.java diff --git a/sdk/src/main/java/com/bugsnag/android/ForegroundDetector.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/ForegroundDetector.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/ForegroundDetector.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/ForegroundDetector.java diff --git a/sdk/src/main/java/com/bugsnag/android/HandledState.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/HandledState.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/HandledState.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/HandledState.java diff --git a/sdk/src/main/java/com/bugsnag/android/IOUtils.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/IOUtils.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/IOUtils.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/IOUtils.java diff --git a/sdk/src/main/java/com/bugsnag/android/InternalApi.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/InternalApi.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/InternalApi.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/InternalApi.java diff --git a/sdk/src/main/java/com/bugsnag/android/JsonScope.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/JsonScope.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/JsonScope.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/JsonScope.java diff --git a/sdk/src/main/java/com/bugsnag/android/JsonStream.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/JsonStream.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/JsonStream.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/JsonStream.java diff --git a/sdk/src/main/java/com/bugsnag/android/JsonWriter.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/JsonWriter.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/JsonWriter.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/JsonWriter.java diff --git a/sdk/src/main/java/com/bugsnag/android/Logger.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Logger.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/Logger.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Logger.java diff --git a/sdk/src/main/java/com/bugsnag/android/MapUtils.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/MapUtils.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/MapUtils.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/MapUtils.java diff --git a/sdk/src/main/java/com/bugsnag/android/MetaData.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/MetaData.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/MetaData.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/MetaData.java diff --git a/sdk/src/main/java/com/bugsnag/android/NativeInterface.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/NativeInterface.java similarity index 98% rename from sdk/src/main/java/com/bugsnag/android/NativeInterface.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/NativeInterface.java index 86767cac62..cc251255ad 100644 --- a/sdk/src/main/java/com/bugsnag/android/NativeInterface.java +++ b/bugsnag-android-core/src/main/java/com/bugsnag/android/NativeInterface.java @@ -1,7 +1,5 @@ package com.bugsnag.android; -import com.bugsnag.android.ndk.NativeBridge; - import android.annotation.SuppressLint; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -164,14 +162,9 @@ public static void setClient(@NonNull Client client) { NativeInterface.client = client; } - /** - * Sets up observers for the NDK client - * @param client the client - */ + @Deprecated public static void configureClientObservers(@NonNull Client client) { setClient(client); - client.addObserver(new NativeBridge()); - client.sendNativeSetupNotification(); } @Nullable diff --git a/sdk/src/main/java/com/bugsnag/android/NetworkException.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/NetworkException.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/NetworkException.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/NetworkException.java diff --git a/sdk/src/main/java/com/bugsnag/android/Notifier.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Notifier.java similarity index 96% rename from sdk/src/main/java/com/bugsnag/android/Notifier.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Notifier.java index 7c524dc9a9..2e4060df9b 100644 --- a/sdk/src/main/java/com/bugsnag/android/Notifier.java +++ b/bugsnag-android-core/src/main/java/com/bugsnag/android/Notifier.java @@ -10,7 +10,7 @@ public class Notifier implements JsonStream.Streamable { private static final String NOTIFIER_NAME = "Android Bugsnag Notifier"; - private static final String NOTIFIER_VERSION = "4.16.1"; + private static final String NOTIFIER_VERSION = "4.17.0"; private static final String NOTIFIER_URL = "https://bugsnag.com"; @NonNull diff --git a/sdk/src/main/java/com/bugsnag/android/NotifyType.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/NotifyType.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/NotifyType.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/NotifyType.java diff --git a/sdk/src/main/java/com/bugsnag/android/ObjectJsonStreamer.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/ObjectJsonStreamer.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/ObjectJsonStreamer.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/ObjectJsonStreamer.java diff --git a/sdk/src/main/java/com/bugsnag/android/Report.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Report.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/Report.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Report.java diff --git a/sdk/src/main/java/com/bugsnag/android/Session.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Session.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/Session.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Session.java diff --git a/sdk/src/main/java/com/bugsnag/android/SessionStore.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/SessionStore.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/SessionStore.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/SessionStore.java diff --git a/sdk/src/main/java/com/bugsnag/android/SessionTracker.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/SessionTracker.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/SessionTracker.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/SessionTracker.java diff --git a/sdk/src/main/java/com/bugsnag/android/SessionTrackingApiClient.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/SessionTrackingApiClient.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/SessionTrackingApiClient.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/SessionTrackingApiClient.java diff --git a/sdk/src/main/java/com/bugsnag/android/SessionTrackingPayload.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/SessionTrackingPayload.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/SessionTrackingPayload.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/SessionTrackingPayload.java diff --git a/sdk/src/main/java/com/bugsnag/android/Severity.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Severity.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/Severity.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Severity.java diff --git a/sdk/src/main/java/com/bugsnag/android/Stacktrace.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Stacktrace.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/Stacktrace.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/Stacktrace.java diff --git a/sdk/src/main/java/com/bugsnag/android/StrictModeHandler.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/StrictModeHandler.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/StrictModeHandler.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/StrictModeHandler.java diff --git a/sdk/src/main/java/com/bugsnag/android/ThreadSafe.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/ThreadSafe.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/ThreadSafe.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/ThreadSafe.java diff --git a/sdk/src/main/java/com/bugsnag/android/ThreadState.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/ThreadState.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/ThreadState.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/ThreadState.java diff --git a/sdk/src/main/java/com/bugsnag/android/User.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/User.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/User.java rename to bugsnag-android-core/src/main/java/com/bugsnag/android/User.java diff --git a/bugsnag-android-ndk/README.md b/bugsnag-android-ndk/README.md new file mode 100644 index 0000000000..9ff81719ec --- /dev/null +++ b/bugsnag-android-ndk/README.md @@ -0,0 +1,3 @@ +# bugsnag-android-ndk + +This module is identical to [bugsnag-android](../bugsnag-android/README.md) and is published for legacy support. diff --git a/bugsnag-android-ndk/build.gradle b/bugsnag-android-ndk/build.gradle new file mode 100644 index 0000000000..4098412bcb --- /dev/null +++ b/bugsnag-android-ndk/build.gradle @@ -0,0 +1,18 @@ +apply plugin: "com.android.library" + +android { + compileSdkVersion rootProject.ext.compileSdkVersion + defaultConfig.minSdkVersion rootProject.ext.minSdkVersion + + buildTypes.each { buildType -> + buildType.buildConfigField("boolean", "DETECT_NDK_CRASHES", "true") + } +} + +dependencies { + api project(':bugsnag-android-core') + api project(':bugsnag-plugin-android-anr') + api project(':bugsnag-plugin-android-ndk') +} + +apply from: "../gradle/release.gradle" diff --git a/bugsnag-android-ndk/gradle.properties b/bugsnag-android-ndk/gradle.properties new file mode 100644 index 0000000000..709baa2c86 --- /dev/null +++ b/bugsnag-android-ndk/gradle.properties @@ -0,0 +1,2 @@ +pomName=Bugsnag Android NDK +artefactId=bugsnag-android-ndk diff --git a/bugsnag-android-ndk/src/main/AndroidManifest.xml b/bugsnag-android-ndk/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..c0e1ef95fa --- /dev/null +++ b/bugsnag-android-ndk/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/bugsnag-android/README.md b/bugsnag-android/README.md new file mode 100644 index 0000000000..e81edaadf7 --- /dev/null +++ b/bugsnag-android/README.md @@ -0,0 +1,17 @@ +# bugsnag-android + +This module is a meta package which contains no code itself. Its primary purpose is to +publish an AAR + POM that adds a dependency on _all_ the bugsnag-android-* artefacts. This allows +users to include bugsnag-android in their applications using the following syntax: + +``` +implementation "com.bugsnag:bugsnag-android:$version" +``` + +Which is simpler than manually specifying every single dependency: + +``` +implementation "com.bugsnag:bugsnag-android-core:$version" +implementation "com.bugsnag:bugsnag-plugin-android-ndk:$version" +implementation "com.bugsnag:bugsnag-plugin-android-anr:$version" +``` diff --git a/bugsnag-android/build.gradle b/bugsnag-android/build.gradle new file mode 100644 index 0000000000..a796264067 --- /dev/null +++ b/bugsnag-android/build.gradle @@ -0,0 +1,14 @@ +apply plugin: "com.android.library" + +android { + compileSdkVersion rootProject.ext.compileSdkVersion + defaultConfig.minSdkVersion rootProject.ext.minSdkVersion +} + +dependencies { + api project(':bugsnag-android-core') + api project(':bugsnag-plugin-android-anr') + api project(':bugsnag-plugin-android-ndk') +} + +apply from: "../gradle/release.gradle" diff --git a/bugsnag-android/gradle.properties b/bugsnag-android/gradle.properties new file mode 100644 index 0000000000..16f72c6159 --- /dev/null +++ b/bugsnag-android/gradle.properties @@ -0,0 +1,2 @@ +pomName=Bugsnag Android +artefactId=bugsnag-android diff --git a/bugsnag-android/src/main/AndroidManifest.xml b/bugsnag-android/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..c0e1ef95fa --- /dev/null +++ b/bugsnag-android/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/bugsnag-plugin-android-anr/CMakeLists.txt b/bugsnag-plugin-android-anr/CMakeLists.txt new file mode 100644 index 0000000000..3d76ae5f2a --- /dev/null +++ b/bugsnag-plugin-android-anr/CMakeLists.txt @@ -0,0 +1,2 @@ +cmake_minimum_required(VERSION 3.4.1) +add_subdirectory(src/main) diff --git a/bugsnag-plugin-android-anr/README.md b/bugsnag-plugin-android-anr/README.md new file mode 100644 index 0000000000..ef25f4626c --- /dev/null +++ b/bugsnag-plugin-android-anr/README.md @@ -0,0 +1,9 @@ +# bugsnag-plugin-android-anr + +This module detects ANRs and reports them to bugsnag. + +## High-level Overview + +When an ANR dialog is shown SIGQUIT is raised. This module installs a SIGQUIT handler and sets a +ByteBuffer that is continuously monitored from the JVM. When the JVM code detects a ByteBuffer has +been modified, it generates a report of the ANR. diff --git a/bugsnag-plugin-android-anr/build.gradle b/bugsnag-plugin-android-anr/build.gradle new file mode 100644 index 0000000000..d3f80f7b91 --- /dev/null +++ b/bugsnag-plugin-android-anr/build.gradle @@ -0,0 +1,24 @@ +apply plugin: "com.android.library" +apply plugin: "kotlin-android" +apply plugin: "io.gitlab.arturbosch.detekt" + +android { + compileSdkVersion rootProject.ext.compileSdkVersion + + defaultConfig { + minSdkVersion rootProject.ext.minSdkVersion + externalNativeBuild.cmake.arguments "-DANDROID_CPP_FEATURES=exceptions", "-DANDROID_STL=c++_static" + ndk.abiFilters = project.hasProperty("ABI_FILTERS") ? project.ABI_FILTERS.split(",") : + ["arm64-v8a", "armeabi-v7a", "armeabi", "x86", "x86_64"] + } + externalNativeBuild.cmake.path = "CMakeLists.txt" +} + +dependencies { + api project(':bugsnag-android-core') +} + +apply from: "../gradle/dependencies.gradle" +apply from: "../gradle/release.gradle" +apply from: "../gradle/detekt.gradle" +apply from: "../gradle/checkstyle.gradle" diff --git a/bugsnag-plugin-android-anr/gradle.properties b/bugsnag-plugin-android-anr/gradle.properties new file mode 100644 index 0000000000..0e68cfc63b --- /dev/null +++ b/bugsnag-plugin-android-anr/gradle.properties @@ -0,0 +1,2 @@ +pomName=Bugsnag Android ANR +artefactId=bugsnag-plugin-android-anr diff --git a/bugsnag-plugin-android-anr/proguard-rules.pro b/bugsnag-plugin-android-anr/proguard-rules.pro new file mode 100644 index 0000000000..f53af57439 --- /dev/null +++ b/bugsnag-plugin-android-anr/proguard-rules.pro @@ -0,0 +1,2 @@ +-keepattributes LineNumberTable,SourceFile +-keep class com.bugsnag.android.AnrPlugin { *; } diff --git a/bugsnag-plugin-android-anr/src/main/AndroidManifest.xml b/bugsnag-plugin-android-anr/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..869f2a5000 --- /dev/null +++ b/bugsnag-plugin-android-anr/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/bugsnag-plugin-android-anr/src/main/CMakeLists.txt b/bugsnag-plugin-android-anr/src/main/CMakeLists.txt new file mode 100644 index 0000000000..8223623cb5 --- /dev/null +++ b/bugsnag-plugin-android-anr/src/main/CMakeLists.txt @@ -0,0 +1,29 @@ +set(BUGSNAG_VERSION 1.0.1) +add_library( # Specifies the name of the library. + bugsnag-plugin-android-anr + # Sets the library as a shared library. + SHARED + # Provides a relative path to your source file(s). + jni/anr_handler.c + jni/bugsnag_anr.c + jni/utils/string.c + ) + +include_directories(jni) + +find_library( # Defines the name of the path variable that stores the + # location of the NDK library. + log-lib + # Specifies the name of the NDK library that + # CMake needs to locate. + log ) + +target_link_libraries( # Specifies the target library. + bugsnag-plugin-android-anr + # Links the log library to the target library. + ${log-lib}) + +set_target_properties(bugsnag-plugin-android-anr + PROPERTIES + COMPILE_OPTIONS + -Werror -Wall -pedantic) diff --git a/bugsnag-plugin-android-anr/src/main/java/com/bugsnag/android/AnrPlugin.kt b/bugsnag-plugin-android-anr/src/main/java/com/bugsnag/android/AnrPlugin.kt new file mode 100644 index 0000000000..ef20bb1963 --- /dev/null +++ b/bugsnag-plugin-android-anr/src/main/java/com/bugsnag/android/AnrPlugin.kt @@ -0,0 +1,27 @@ +package com.bugsnag.android + +import java.nio.ByteBuffer + +internal class AnrPlugin : BugsnagPlugin { + + private external fun installAnrDetection(sentinelBuffer: ByteBuffer) + + override fun initialisePlugin(client: Client) { + System.loadLibrary("bugsnag-plugin-android-anr") + val delegate: (Thread) -> Unit = { handleAnr(it, client) } + val monitor = AppNotRespondingMonitor(delegate) + monitor.start() + installAnrDetection(monitor.sentinelBuffer) + Logger.info("Initialised ANR Plugin") + } + + private fun handleAnr(thread: Thread, client: Client) { + val errMsg = "Application did not respond to UI input" + val exc = BugsnagException("ANR", errMsg, thread.stackTrace) + + client.cacheAndNotify( + exc, Severity.ERROR, MetaData(), + HandledState.REASON_ANR, null, thread + ) + } +} diff --git a/sdk/src/main/java/com/bugsnag/android/AppNotRespondingMonitor.java b/bugsnag-plugin-android-anr/src/main/java/com/bugsnag/android/AppNotRespondingMonitor.java similarity index 100% rename from sdk/src/main/java/com/bugsnag/android/AppNotRespondingMonitor.java rename to bugsnag-plugin-android-anr/src/main/java/com/bugsnag/android/AppNotRespondingMonitor.java diff --git a/sdk/src/main/jni/handlers/anr_handler.c b/bugsnag-plugin-android-anr/src/main/jni/anr_handler.c similarity index 96% rename from sdk/src/main/jni/handlers/anr_handler.c rename to bugsnag-plugin-android-anr/src/main/jni/anr_handler.c index 9441a90ea0..111259c403 100644 --- a/sdk/src/main/jni/handlers/anr_handler.c +++ b/bugsnag-plugin-android-anr/src/main/jni/anr_handler.c @@ -3,10 +3,9 @@ #include #include #include +#include -#include "../utils/crash_info.h" -#include "../utils/serializer.h" -#include "../utils/string.h" +#include "utils/string.h" static pthread_t bsg_watchdog_thread; static sigset_t bsg_anr_sigmask; diff --git a/sdk/src/main/jni/handlers/anr_handler.h b/bugsnag-plugin-android-anr/src/main/jni/anr_handler.h similarity index 82% rename from sdk/src/main/jni/handlers/anr_handler.h rename to bugsnag-plugin-android-anr/src/main/jni/anr_handler.h index 18a0a5c244..7a3dfe1c8e 100644 --- a/sdk/src/main/jni/handlers/anr_handler.h +++ b/bugsnag-plugin-android-anr/src/main/jni/anr_handler.h @@ -12,6 +12,11 @@ * * https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/am/AppErrors.java */ +#ifndef BUGSNAG_LOG +#define BUGSNAG_LOG(fmt, ...) \ + __android_log_print(ANDROID_LOG_WARN, "BugsnagANR", fmt, ##__VA_ARGS__) +#endif + #ifdef __cplusplus extern "C" { #endif diff --git a/bugsnag-plugin-android-anr/src/main/jni/bugsnag_anr.c b/bugsnag-plugin-android-anr/src/main/jni/bugsnag_anr.c new file mode 100644 index 0000000000..93fcaff8da --- /dev/null +++ b/bugsnag-plugin-android-anr/src/main/jni/bugsnag_anr.c @@ -0,0 +1,23 @@ +#include "anr_handler.h" +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +JNIEXPORT void JNICALL Java_com_bugsnag_android_AnrPlugin_installAnrDetection( + JNIEnv *env, jobject _this, jobject byteBuffer) { + + if (byteBuffer != NULL) { + bsg_handler_install_anr((*env)->GetDirectBufferAddress(env, byteBuffer)); + BUGSNAG_LOG("Initialization complete!"); + } else { + BUGSNAG_LOG("Failed to initialise ANR detection due to null buffer"); + } +} + +#ifdef __cplusplus +} +#endif diff --git a/bugsnag-plugin-android-anr/src/main/jni/utils/string.c b/bugsnag-plugin-android-anr/src/main/jni/utils/string.c new file mode 100644 index 0000000000..813c7d565f --- /dev/null +++ b/bugsnag-plugin-android-anr/src/main/jni/utils/string.c @@ -0,0 +1,13 @@ +#include "string.h" + +void bsg_strncpy(char *dst, char *src, size_t len) { + int i = 0; + while (i <= len) { + char current = src[i]; + dst[i] = current; + if (current == '\0') { + break; + } + i++; + } +} diff --git a/bugsnag-plugin-android-anr/src/main/jni/utils/string.h b/bugsnag-plugin-android-anr/src/main/jni/utils/string.h new file mode 100644 index 0000000000..3dc7613c0f --- /dev/null +++ b/bugsnag-plugin-android-anr/src/main/jni/utils/string.h @@ -0,0 +1,18 @@ +#ifndef BUGSNAG_UTILS_STRING_H +#define BUGSNAG_UTILS_STRING_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * Copy the contents of src to dst where src is null-terminated + */ +void bsg_strncpy(char *dst, char *src, size_t len); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/sdk/CMakeLists.txt b/bugsnag-plugin-android-ndk/CMakeLists.txt similarity index 100% rename from sdk/CMakeLists.txt rename to bugsnag-plugin-android-ndk/CMakeLists.txt diff --git a/bugsnag-plugin-android-ndk/README.md b/bugsnag-plugin-android-ndk/README.md new file mode 100644 index 0000000000..ae7be5b05b --- /dev/null +++ b/bugsnag-plugin-android-ndk/README.md @@ -0,0 +1,9 @@ +# bugsnag-plugin-android-ndk + +This module detects NDK signals/exceptions and reports them to bugsnag. + +## High-level Overview + +This module installs C signal handlers and a CPP exception handler. When a native crash occurs, +it writes a report to disk. This is then converted to a JVM report on the next app launch, and is +delivered to the error reporting API. diff --git a/bugsnag-plugin-android-ndk/build.gradle b/bugsnag-plugin-android-ndk/build.gradle new file mode 100644 index 0000000000..d3f80f7b91 --- /dev/null +++ b/bugsnag-plugin-android-ndk/build.gradle @@ -0,0 +1,24 @@ +apply plugin: "com.android.library" +apply plugin: "kotlin-android" +apply plugin: "io.gitlab.arturbosch.detekt" + +android { + compileSdkVersion rootProject.ext.compileSdkVersion + + defaultConfig { + minSdkVersion rootProject.ext.minSdkVersion + externalNativeBuild.cmake.arguments "-DANDROID_CPP_FEATURES=exceptions", "-DANDROID_STL=c++_static" + ndk.abiFilters = project.hasProperty("ABI_FILTERS") ? project.ABI_FILTERS.split(",") : + ["arm64-v8a", "armeabi-v7a", "armeabi", "x86", "x86_64"] + } + externalNativeBuild.cmake.path = "CMakeLists.txt" +} + +dependencies { + api project(':bugsnag-android-core') +} + +apply from: "../gradle/dependencies.gradle" +apply from: "../gradle/release.gradle" +apply from: "../gradle/detekt.gradle" +apply from: "../gradle/checkstyle.gradle" diff --git a/bugsnag-plugin-android-ndk/gradle.properties b/bugsnag-plugin-android-ndk/gradle.properties new file mode 100644 index 0000000000..3418220e53 --- /dev/null +++ b/bugsnag-plugin-android-ndk/gradle.properties @@ -0,0 +1,2 @@ +pomName=Bugsnag Android NDK +artefactId=bugsnag-plugin-android-ndk diff --git a/sdk/package.json b/bugsnag-plugin-android-ndk/package.json similarity index 100% rename from sdk/package.json rename to bugsnag-plugin-android-ndk/package.json diff --git a/bugsnag-plugin-android-ndk/proguard-rules.pro b/bugsnag-plugin-android-ndk/proguard-rules.pro new file mode 100644 index 0000000000..7020a10281 --- /dev/null +++ b/bugsnag-plugin-android-ndk/proguard-rules.pro @@ -0,0 +1,3 @@ +-keepattributes LineNumberTable,SourceFile +-keep class com.bugsnag.android.ndk.NativeBridge { *; } +-keep class com.bugsnag.android.NdkPlugin { *; } diff --git a/sdk/src/androidTest/java/com/bugsnag/android/NativeCXXTest.java b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeCXXTest.java similarity index 90% rename from sdk/src/androidTest/java/com/bugsnag/android/NativeCXXTest.java rename to bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeCXXTest.java index b385f95f94..dd2f0b41da 100644 --- a/sdk/src/androidTest/java/com/bugsnag/android/NativeCXXTest.java +++ b/bugsnag-plugin-android-ndk/src/androidTest/java/com/bugsnag/android/ndk/NativeCXXTest.java @@ -1,7 +1,5 @@ package com.bugsnag.android.ndk; -import static org.junit.Assert.assertFalse; - import org.junit.Test; public class NativeCXXTest { diff --git a/bugsnag-plugin-android-ndk/src/main/AndroidManifest.xml b/bugsnag-plugin-android-ndk/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..6d65208857 --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/sdk/src/main/CMakeLists.txt b/bugsnag-plugin-android-ndk/src/main/CMakeLists.txt similarity index 62% rename from sdk/src/main/CMakeLists.txt rename to bugsnag-plugin-android-ndk/src/main/CMakeLists.txt index fc2834f854..b76c9ff1be 100644 --- a/sdk/src/main/CMakeLists.txt +++ b/bugsnag-plugin-android-ndk/src/main/CMakeLists.txt @@ -6,29 +6,28 @@ add_library( # Specifies the name of the library. SHARED # Provides a relative path to your source file(s). - jni/bugsnag_ndk.c - jni/bugsnag.c - jni/metadata.c - jni/report.c - jni/handlers/signal_handler.c - jni/handlers/anr_handler.c - jni/handlers/cpp_handler.cpp - jni/utils/crash_info.c - jni/utils/stack_unwinder.c - jni/utils/stack_unwinder_libunwindstack.cpp - jni/utils/stack_unwinder_libcorkscrew.c - jni/utils/stack_unwinder_libunwind.c - jni/utils/stack_unwinder_simple.c - jni/utils/serializer.c - jni/utils/string.c - jni/deps/parson/parson.c + jni/bugsnag_ndk.c + jni/bugsnag.c + jni/metadata.c + jni/report.c + jni/handlers/signal_handler.c + jni/handlers/cpp_handler.cpp + jni/utils/crash_info.c + jni/utils/stack_unwinder.c + jni/utils/stack_unwinder_libunwindstack.cpp + jni/utils/stack_unwinder_libcorkscrew.c + jni/utils/stack_unwinder_libunwind.c + jni/utils/stack_unwinder_simple.c + jni/utils/serializer.c + jni/utils/string.c + jni/deps/parson/parson.c ) include_directories( - jni/ - jni/deps - jni/external/libunwind/include - jni/external/libunwindstack/include + jni + jni/deps + jni/external/libunwind/include + jni/external/libunwindstack-ndk/include ) target_include_directories(bugsnag-ndk PRIVATE ${BUGSNAG_DIR}/assets/include) @@ -52,7 +51,7 @@ set_target_properties(bugsnag-ndk COMPILE_OPTIONS -Werror -Wall -pedantic) -add_subdirectory(jni/external/libunwindstack/cmake) +add_subdirectory(jni/external/libunwindstack-ndk/cmake) target_link_libraries(bugsnag-ndk unwindstack) if(${ANDROID_ABI} STREQUAL "armeabi" OR ${ANDROID_ABI} STREQUAL "armeabi-v7a") add_library(libunwind STATIC IMPORTED) diff --git a/sdk/src/main/assets/include/bugsnag.h b/bugsnag-plugin-android-ndk/src/main/assets/include/bugsnag.h similarity index 100% rename from sdk/src/main/assets/include/bugsnag.h rename to bugsnag-plugin-android-ndk/src/main/assets/include/bugsnag.h diff --git a/sdk/src/main/assets/include/report.h b/bugsnag-plugin-android-ndk/src/main/assets/include/report.h similarity index 100% rename from sdk/src/main/assets/include/report.h rename to bugsnag-plugin-android-ndk/src/main/assets/include/report.h diff --git a/bugsnag-plugin-android-ndk/src/main/java/com/bugsnag/android/NdkPlugin.kt b/bugsnag-plugin-android-ndk/src/main/java/com/bugsnag/android/NdkPlugin.kt new file mode 100644 index 0000000000..33c9265c8f --- /dev/null +++ b/bugsnag-plugin-android-ndk/src/main/java/com/bugsnag/android/NdkPlugin.kt @@ -0,0 +1,14 @@ +package com.bugsnag.android + +import com.bugsnag.android.ndk.NativeBridge + +internal class NdkPlugin : BugsnagPlugin { + + override fun initialisePlugin(client: Client) { + System.loadLibrary("bugsnag-ndk") + val nativeBridge = NativeBridge() + client.addObserver(nativeBridge) + client.sendNativeSetupNotification() + Logger.info("Initialised NDK Plugin") + } +} diff --git a/sdk/src/main/java/com/bugsnag/android/ndk/NativeBridge.java b/bugsnag-plugin-android-ndk/src/main/java/com/bugsnag/android/ndk/NativeBridge.java similarity index 97% rename from sdk/src/main/java/com/bugsnag/android/ndk/NativeBridge.java rename to bugsnag-plugin-android-ndk/src/main/java/com/bugsnag/android/ndk/NativeBridge.java index 997abcd4a9..3699e11782 100644 --- a/sdk/src/main/java/com/bugsnag/android/ndk/NativeBridge.java +++ b/bugsnag-plugin-android-ndk/src/main/java/com/bugsnag/android/ndk/NativeBridge.java @@ -11,7 +11,6 @@ import android.util.Log; import java.io.File; -import java.nio.ByteBuffer; import java.util.List; import java.util.Observable; import java.util.Observer; @@ -24,9 +23,6 @@ * Observes changes in the Bugsnag environment, propagating them to the native layer */ public class NativeBridge implements Observer { - static { - System.loadLibrary("bugsnag-ndk"); - } private static final int METADATA_SECTION = 0; private static final int METADATA_KEY = 1; @@ -36,8 +32,7 @@ public class NativeBridge implements Observer { private static final AtomicBoolean installed = new AtomicBoolean(false); public static native void install(@NonNull String reportingDirectory, boolean autoNotify, - int apiLevel, boolean is32bit, - @Nullable ByteBuffer anrSentinel); + int apiLevel, boolean is32bit); public static native void deliverReportAtPath(@NonNull String filePath); @@ -238,13 +233,9 @@ private void handleInstallMessage(@NonNull Object arg) { List values = (List)arg; if (values.size() > 0 && values.get(0) instanceof Configuration) { Configuration config = (Configuration)values.get(0); - ByteBuffer anrBuffer = null; - if (values.size() > 1 && values.get(1) instanceof ByteBuffer) { - anrBuffer = (ByteBuffer)values.get(1); - } String reportPath = reportDirectory + UUID.randomUUID().toString() + ".crash"; install(reportPath, config.getDetectNdkCrashes(), Build.VERSION.SDK_INT, - is32bit(), anrBuffer); + is32bit()); installed.set(true); } } else { diff --git a/sdk/src/main/jni/bugsnag.c b/bugsnag-plugin-android-ndk/src/main/jni/bugsnag.c similarity index 100% rename from sdk/src/main/jni/bugsnag.c rename to bugsnag-plugin-android-ndk/src/main/jni/bugsnag.c diff --git a/sdk/src/main/jni/bugsnag_ndk.c b/bugsnag-plugin-android-ndk/src/main/jni/bugsnag_ndk.c similarity index 98% rename from sdk/src/main/jni/bugsnag_ndk.c rename to bugsnag-plugin-android-ndk/src/main/jni/bugsnag_ndk.c index 4073424833..498236fc3a 100644 --- a/sdk/src/main/jni/bugsnag_ndk.c +++ b/bugsnag-plugin-android-ndk/src/main/jni/bugsnag_ndk.c @@ -8,7 +8,6 @@ #include "handlers/signal_handler.h" #include "handlers/cpp_handler.h" -#include "handlers/anr_handler.h" #include "metadata.h" #include "report.h" #include "utils/serializer.h" @@ -45,7 +44,7 @@ bsg_unwinder bsg_configured_unwind_style() { JNIEXPORT void JNICALL Java_com_bugsnag_android_ndk_NativeBridge_install( JNIEnv *env, jobject _this, jstring _report_path, jboolean auto_notify, - jint _api_level, jboolean is32bit, jobject anr_buffer) { + jint _api_level, jboolean is32bit) { bsg_environment *bugsnag_env = calloc(1, sizeof(bsg_environment)); bsg_set_unwind_types((int)_api_level, (bool)is32bit, &bugsnag_env->signal_unwind_style, @@ -60,10 +59,6 @@ JNIEXPORT void JNICALL Java_com_bugsnag_android_ndk_NativeBridge_install( bsg_handler_install_signal(bugsnag_env); bsg_handler_install_cpp(bugsnag_env); } - // Presumes ANR detection is enabled if Buffer exists - if (!(*env)->IsSameObject(env, anr_buffer, NULL)) { - bsg_handler_install_anr((*env)->GetDirectBufferAddress(env, anr_buffer)); - } // populate metadata from Java layer bsg_populate_report(env, &bugsnag_env->next_report); diff --git a/sdk/src/main/jni/bugsnag_ndk.h b/bugsnag-plugin-android-ndk/src/main/jni/bugsnag_ndk.h similarity index 100% rename from sdk/src/main/jni/bugsnag_ndk.h rename to bugsnag-plugin-android-ndk/src/main/jni/bugsnag_ndk.h diff --git a/sdk/src/main/jni/deps/parson/package.json b/bugsnag-plugin-android-ndk/src/main/jni/deps/parson/package.json similarity index 100% rename from sdk/src/main/jni/deps/parson/package.json rename to bugsnag-plugin-android-ndk/src/main/jni/deps/parson/package.json diff --git a/sdk/src/main/jni/deps/parson/parson.c b/bugsnag-plugin-android-ndk/src/main/jni/deps/parson/parson.c similarity index 100% rename from sdk/src/main/jni/deps/parson/parson.c rename to bugsnag-plugin-android-ndk/src/main/jni/deps/parson/parson.c diff --git a/sdk/src/main/jni/deps/parson/parson.h b/bugsnag-plugin-android-ndk/src/main/jni/deps/parson/parson.h similarity index 100% rename from sdk/src/main/jni/deps/parson/parson.h rename to bugsnag-plugin-android-ndk/src/main/jni/deps/parson/parson.h diff --git a/sdk/src/main/jni/external/libunwind/include/__libunwind_config.h b/bugsnag-plugin-android-ndk/src/main/jni/external/libunwind/include/__libunwind_config.h similarity index 100% rename from sdk/src/main/jni/external/libunwind/include/__libunwind_config.h rename to bugsnag-plugin-android-ndk/src/main/jni/external/libunwind/include/__libunwind_config.h diff --git a/sdk/src/main/jni/external/libunwind/include/libunwind.h b/bugsnag-plugin-android-ndk/src/main/jni/external/libunwind/include/libunwind.h similarity index 99% rename from sdk/src/main/jni/external/libunwind/include/libunwind.h rename to bugsnag-plugin-android-ndk/src/main/jni/external/libunwind/include/libunwind.h index 555b1d3b15..29917662a8 100644 --- a/sdk/src/main/jni/external/libunwind/include/libunwind.h +++ b/bugsnag-plugin-android-ndk/src/main/jni/external/libunwind/include/libunwind.h @@ -12,7 +12,7 @@ //===----------------------------------------------------------------------===// #ifndef __LIBUNWIND__ #define __LIBUNWIND__ -#include <__libunwind_config.h> +#include "__libunwind_config.h" #include #include #ifdef __APPLE__ @@ -505,4 +505,4 @@ enum { UNW_OR1K_R30 = 30, UNW_OR1K_R31 = 31, }; -#endif \ No newline at end of file +#endif diff --git a/sdk/src/main/jni/external/libunwindstack b/bugsnag-plugin-android-ndk/src/main/jni/external/libunwindstack-ndk similarity index 100% rename from sdk/src/main/jni/external/libunwindstack rename to bugsnag-plugin-android-ndk/src/main/jni/external/libunwindstack-ndk diff --git a/sdk/src/main/jni/handlers/cpp_handler.cpp b/bugsnag-plugin-android-ndk/src/main/jni/handlers/cpp_handler.cpp similarity index 100% rename from sdk/src/main/jni/handlers/cpp_handler.cpp rename to bugsnag-plugin-android-ndk/src/main/jni/handlers/cpp_handler.cpp diff --git a/sdk/src/main/jni/handlers/cpp_handler.h b/bugsnag-plugin-android-ndk/src/main/jni/handlers/cpp_handler.h similarity index 100% rename from sdk/src/main/jni/handlers/cpp_handler.h rename to bugsnag-plugin-android-ndk/src/main/jni/handlers/cpp_handler.h diff --git a/sdk/src/main/jni/handlers/signal_handler.c b/bugsnag-plugin-android-ndk/src/main/jni/handlers/signal_handler.c similarity index 100% rename from sdk/src/main/jni/handlers/signal_handler.c rename to bugsnag-plugin-android-ndk/src/main/jni/handlers/signal_handler.c diff --git a/sdk/src/main/jni/handlers/signal_handler.h b/bugsnag-plugin-android-ndk/src/main/jni/handlers/signal_handler.h similarity index 100% rename from sdk/src/main/jni/handlers/signal_handler.h rename to bugsnag-plugin-android-ndk/src/main/jni/handlers/signal_handler.h diff --git a/sdk/src/main/jni/metadata.c b/bugsnag-plugin-android-ndk/src/main/jni/metadata.c similarity index 100% rename from sdk/src/main/jni/metadata.c rename to bugsnag-plugin-android-ndk/src/main/jni/metadata.c diff --git a/sdk/src/main/jni/metadata.h b/bugsnag-plugin-android-ndk/src/main/jni/metadata.h similarity index 100% rename from sdk/src/main/jni/metadata.h rename to bugsnag-plugin-android-ndk/src/main/jni/metadata.h diff --git a/sdk/src/main/jni/report.c b/bugsnag-plugin-android-ndk/src/main/jni/report.c similarity index 100% rename from sdk/src/main/jni/report.c rename to bugsnag-plugin-android-ndk/src/main/jni/report.c diff --git a/sdk/src/main/jni/report.h b/bugsnag-plugin-android-ndk/src/main/jni/report.h similarity index 100% rename from sdk/src/main/jni/report.h rename to bugsnag-plugin-android-ndk/src/main/jni/report.h diff --git a/sdk/src/main/jni/utils/build.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/build.h similarity index 100% rename from sdk/src/main/jni/utils/build.h rename to bugsnag-plugin-android-ndk/src/main/jni/utils/build.h diff --git a/sdk/src/main/jni/utils/crash_info.c b/bugsnag-plugin-android-ndk/src/main/jni/utils/crash_info.c similarity index 100% rename from sdk/src/main/jni/utils/crash_info.c rename to bugsnag-plugin-android-ndk/src/main/jni/utils/crash_info.c diff --git a/sdk/src/main/jni/utils/crash_info.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/crash_info.h similarity index 100% rename from sdk/src/main/jni/utils/crash_info.h rename to bugsnag-plugin-android-ndk/src/main/jni/utils/crash_info.h diff --git a/sdk/src/main/jni/utils/migrate.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/migrate.h similarity index 100% rename from sdk/src/main/jni/utils/migrate.h rename to bugsnag-plugin-android-ndk/src/main/jni/utils/migrate.h diff --git a/sdk/src/main/jni/utils/serializer.c b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c similarity index 100% rename from sdk/src/main/jni/utils/serializer.c rename to bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.c diff --git a/sdk/src/main/jni/utils/serializer.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h similarity index 100% rename from sdk/src/main/jni/utils/serializer.h rename to bugsnag-plugin-android-ndk/src/main/jni/utils/serializer.h diff --git a/sdk/src/main/jni/utils/stack_unwinder.c b/bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder.c similarity index 100% rename from sdk/src/main/jni/utils/stack_unwinder.c rename to bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder.c diff --git a/sdk/src/main/jni/utils/stack_unwinder.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder.h similarity index 100% rename from sdk/src/main/jni/utils/stack_unwinder.h rename to bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder.h diff --git a/sdk/src/main/jni/utils/stack_unwinder_libcorkscrew.c b/bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libcorkscrew.c similarity index 99% rename from sdk/src/main/jni/utils/stack_unwinder_libcorkscrew.c rename to bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libcorkscrew.c index 8568cc720f..50da02a02a 100644 --- a/sdk/src/main/jni/utils/stack_unwinder_libcorkscrew.c +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libcorkscrew.c @@ -5,7 +5,7 @@ #include #include -#include "../utils/string.h" +#include "string.h" typedef struct { uintptr_t absolute_pc; diff --git a/sdk/src/main/jni/utils/stack_unwinder_libcorkscrew.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libcorkscrew.h similarity index 100% rename from sdk/src/main/jni/utils/stack_unwinder_libcorkscrew.h rename to bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libcorkscrew.h diff --git a/sdk/src/main/jni/utils/stack_unwinder_libunwind.c b/bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libunwind.c similarity index 99% rename from sdk/src/main/jni/utils/stack_unwinder_libunwind.c rename to bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libunwind.c index 487cef8888..40a84e8aa2 100644 --- a/sdk/src/main/jni/utils/stack_unwinder_libunwind.c +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libunwind.c @@ -1,4 +1,4 @@ -#include "../utils/build.h" +#include "build.h" #include "stack_unwinder_libunwind.h" #include #include diff --git a/sdk/src/main/jni/utils/stack_unwinder_libunwind.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libunwind.h similarity index 100% rename from sdk/src/main/jni/utils/stack_unwinder_libunwind.h rename to bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libunwind.h diff --git a/sdk/src/main/jni/utils/stack_unwinder_libunwindstack.cpp b/bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libunwindstack.cpp similarity index 98% rename from sdk/src/main/jni/utils/stack_unwinder_libunwindstack.cpp rename to bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libunwindstack.cpp index 0298601edc..0c67aaa75c 100644 --- a/sdk/src/main/jni/utils/stack_unwinder_libunwindstack.cpp +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libunwindstack.cpp @@ -1,4 +1,4 @@ -#include "../utils/string.h" +#include "string.h" #include "stack_unwinder_libunwindstack.h" #include #include diff --git a/sdk/src/main/jni/utils/stack_unwinder_libunwindstack.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libunwindstack.h similarity index 100% rename from sdk/src/main/jni/utils/stack_unwinder_libunwindstack.h rename to bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_libunwindstack.h diff --git a/sdk/src/main/jni/utils/stack_unwinder_simple.c b/bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_simple.c similarity index 96% rename from sdk/src/main/jni/utils/stack_unwinder_simple.c rename to bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_simple.c index 83423f2f44..44c716f1fb 100644 --- a/sdk/src/main/jni/utils/stack_unwinder_simple.c +++ b/bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_simple.c @@ -1,4 +1,4 @@ -#include "../utils/string.h" +#include "string.h" #include "stack_unwinder_simple.h" #include #include diff --git a/sdk/src/main/jni/utils/stack_unwinder_simple.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_simple.h similarity index 100% rename from sdk/src/main/jni/utils/stack_unwinder_simple.h rename to bugsnag-plugin-android-ndk/src/main/jni/utils/stack_unwinder_simple.h diff --git a/sdk/src/main/jni/utils/string.c b/bugsnag-plugin-android-ndk/src/main/jni/utils/string.c similarity index 100% rename from sdk/src/main/jni/utils/string.c rename to bugsnag-plugin-android-ndk/src/main/jni/utils/string.c diff --git a/sdk/src/main/jni/utils/string.h b/bugsnag-plugin-android-ndk/src/main/jni/utils/string.h similarity index 100% rename from sdk/src/main/jni/utils/string.h rename to bugsnag-plugin-android-ndk/src/main/jni/utils/string.h diff --git a/sdk/src/test/CMakeLists.txt b/bugsnag-plugin-android-ndk/src/test/CMakeLists.txt similarity index 93% rename from sdk/src/test/CMakeLists.txt rename to bugsnag-plugin-android-ndk/src/test/CMakeLists.txt index f11eb7aa00..cc54c1bf3e 100644 --- a/sdk/src/test/CMakeLists.txt +++ b/bugsnag-plugin-android-ndk/src/test/CMakeLists.txt @@ -1,5 +1,5 @@ include_directories( - ../main/jni/ + ../main/jni ../main/jni/deps cpp cpp/deps diff --git a/sdk/src/test/cpp/deps/greatest/greatest.h b/bugsnag-plugin-android-ndk/src/test/cpp/deps/greatest/greatest.h similarity index 100% rename from sdk/src/test/cpp/deps/greatest/greatest.h rename to bugsnag-plugin-android-ndk/src/test/cpp/deps/greatest/greatest.h diff --git a/sdk/src/test/cpp/deps/greatest/package.json b/bugsnag-plugin-android-ndk/src/test/cpp/deps/greatest/package.json similarity index 100% rename from sdk/src/test/cpp/deps/greatest/package.json rename to bugsnag-plugin-android-ndk/src/test/cpp/deps/greatest/package.json diff --git a/sdk/src/test/cpp/main.c b/bugsnag-plugin-android-ndk/src/test/cpp/main.c similarity index 100% rename from sdk/src/test/cpp/main.c rename to bugsnag-plugin-android-ndk/src/test/cpp/main.c diff --git a/sdk/src/test/cpp/test_breadcrumbs.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_breadcrumbs.c similarity index 100% rename from sdk/src/test/cpp/test_breadcrumbs.c rename to bugsnag-plugin-android-ndk/src/test/cpp/test_breadcrumbs.c diff --git a/sdk/src/test/cpp/test_utils_serialize.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_utils_serialize.c similarity index 99% rename from sdk/src/test/cpp/test_utils_serialize.c rename to bugsnag-plugin-android-ndk/src/test/cpp/test_utils_serialize.c index 00248e7a44..7d107ef64b 100644 --- a/sdk/src/test/cpp/test_utils_serialize.c +++ b/bugsnag-plugin-android-ndk/src/test/cpp/test_utils_serialize.c @@ -3,7 +3,7 @@ #include #include -#define SERIALIZE_TEST_FILE "/data/data/com.bugsnag.android.test/cache/foo.crash" +#define SERIALIZE_TEST_FILE "/data/data/com.bugsnag.android.ndk.test/cache/foo.crash" bugsnag_breadcrumb *init_breadcrumb(const char *name, const char *message, bsg_breadcrumb_t type); diff --git a/sdk/src/test/cpp/test_utils_string.c b/bugsnag-plugin-android-ndk/src/test/cpp/test_utils_string.c similarity index 100% rename from sdk/src/test/cpp/test_utils_string.c rename to bugsnag-plugin-android-ndk/src/test/cpp/test_utils_string.c diff --git a/build.gradle b/build.gradle index 7a44b87f61..b08cbbe9cd 100644 --- a/build.gradle +++ b/build.gradle @@ -1,19 +1,24 @@ +import com.android.build.gradle.LibraryPlugin + buildscript { repositories { + mavenLocal() google() mavenCentral() jcenter() } ext.kotlin_version = "1.3.21" - ext.agpVersion = "3.3.0" + ext.agpVersion = "3.4.2" dependencies { - classpath "com.android.tools.build:gradle:$agpVersion" + classpath "com.android.tools.build:gradle:${agpVersion}" classpath "com.github.dcendents:android-maven-gradle-plugin:2.0" classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4" classpath "org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.2" classpath "com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.5" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.0.0-RC16" + classpath "com.bugsnag:bugsnag-android-gradle-plugin:4.5.2" } } allprojects { @@ -22,8 +27,50 @@ allprojects { mavenCentral() jcenter() } + + gradle.projectsEvaluated { + tasks.withType(JavaCompile) { + options.compilerArgs << "-Xlint:all" << "-Werror" + } + + tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { + kotlinOptions { + allWarningsAsErrors = true + } + } + } +} + +subprojects { proj -> + afterEvaluate { + configureAndroidProject(proj) + } } + +private void configureAndroidProject(Project proj) { + def lintOptions = proj.android.lintOptions + lintOptions.abortOnError = true + lintOptions.warningsAsErrors = true + lintOptions.checkAllWarnings = true + + def defaultConfig = proj.android.defaultConfig + defaultConfig.testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner" + defaultConfig.consumerProguardFiles = ["proguard-rules.pro"] + + proj.android.testOptions.unitTests.all { + testLogging { + events "passed", "skipped", "failed", "standardOut", "standardError" + outputs.upToDateWhen {false} + showStandardStreams = true + info.events = ["passed", "skipped", "failed", "standardOut", "standardError"] + } + } +} + ext { + // Note minSdkVersion must be >=21 for 64 bit architectures + compileSdkVersion = 28 + minSdkVersion = 14 supportLibVersion = "28.0.0" supportTestVersion = "0.5" espressoVersion = "2.2.2" diff --git a/dockerfiles/Dockerfile.android-base b/dockerfiles/Dockerfile.android-base index 4845430430..0ce2789538 100644 --- a/dockerfiles/Dockerfile.android-base +++ b/dockerfiles/Dockerfile.android-base @@ -18,9 +18,14 @@ WORKDIR /app COPY gradlew build.gradle settings.gradle gradle.properties /app/ COPY gradle/ /app/gradle/ -COPY sdk/ sdk/ +COPY bugsnag-android/ bugsnag-android/ +COPY bugsnag-android-ndk/ bugsnag-android-ndk/ +COPY bugsnag-plugin-android-anr/ bugsnag-plugin-android-anr/ +COPY bugsnag-android-core/ bugsnag-android-core/ +COPY bugsnag-plugin-android-ndk/ bugsnag-plugin-android-ndk/ +COPY examples/ examples/ COPY scripts/ scripts/ RUN scripts/install-ndk.sh -RUN ./gradlew \ No newline at end of file +RUN ./gradlew diff --git a/dockerfiles/Dockerfile.android-builder b/dockerfiles/Dockerfile.android-builder index 69e9de01c0..3b456ecc06 100644 --- a/dockerfiles/Dockerfile.android-builder +++ b/dockerfiles/Dockerfile.android-builder @@ -18,7 +18,12 @@ WORKDIR /app COPY gradlew build.gradle settings.gradle gradle.properties /app/ COPY gradle/ /app/gradle/ -COPY sdk/ sdk/ +COPY bugsnag-android/ bugsnag-android/ +COPY bugsnag-android-ndk/ bugsnag-android-ndk/ +COPY bugsnag-plugin-android-anr/ bugsnag-plugin-android-anr/ +COPY bugsnag-android-core/ bugsnag-android-core/ +COPY bugsnag-plugin-android-ndk/ bugsnag-plugin-android-ndk/ +COPY examples/ examples/ COPY scripts/ scripts/ RUN scripts/install-ndk.sh @@ -43,10 +48,10 @@ RUN echo "signing.secretKeyRingFile=/root/.gnupg/secring.gpg" >> ~/.gradle/gradl # Build and upload to the local maven as version 9.9.9 RUN sed -i -e 's/VERSION_NAME=.*/VERSION_NAME=9.9.9/g' gradle.properties -RUN ./gradlew assembleRelease publishSDKPublicationToMavenLocal && ./gradlew assembleRelease publishSDKPublicationToMavenLocal -PreleaseNdkArtefact=true +RUN ./gradlew assembleRelease publishToMavenLocal COPY tests/features/ /app/features WORKDIR /app/features/fixtures/mazerunner -CMD ../../../gradlew assembleRelease && cp build/outputs/apk/release/mazerunner-release.apk /app/build/fixture.apk \ No newline at end of file +CMD ../../../gradlew assembleRelease && cp build/outputs/apk/release/mazerunner-release.apk /app/build/fixture.apk diff --git a/dockerfiles/Dockerfile.android-instrumentation-tests b/dockerfiles/Dockerfile.android-instrumentation-tests index 2623314756..f320706b79 100644 --- a/dockerfiles/Dockerfile.android-instrumentation-tests +++ b/dockerfiles/Dockerfile.android-instrumentation-tests @@ -18,7 +18,12 @@ WORKDIR /app COPY gradlew build.gradle settings.gradle gradle.properties /app/ COPY gradle/ /app/gradle/ -COPY sdk/ sdk/ +COPY bugsnag-android/ bugsnag-android/ +COPY bugsnag-android-ndk/ bugsnag-android-ndk/ +COPY bugsnag-plugin-android-anr/ bugsnag-plugin-android-anr/ +COPY bugsnag-android-core/ bugsnag-android-core/ +COPY bugsnag-plugin-android-ndk/ bugsnag-plugin-android-ndk/ +COPY examples/ examples/ COPY scripts/ scripts/ RUN scripts/install-ndk.sh @@ -26,5 +31,5 @@ RUN scripts/install-ndk.sh RUN ./gradlew # Everything above this point should be derived from android-base -RUN sed --in-place="" --expression='s/"armeabi",//' sdk/build.gradle -CMD ./scripts/build-instrumentation-tests.sh && ./scripts/run-instrumentation-test.sh \ No newline at end of file +RUN sed --in-place="" --expression='s/"armeabi",//' bugsnag-plugin-android-anr/build.gradle bugsnag-plugin-android-ndk/build.gradle +CMD ./scripts/build-instrumentation-tests.sh && ./scripts/run-instrumentation-test.sh diff --git a/dockerfiles/Dockerfile.android-linter b/dockerfiles/Dockerfile.android-linter index bac635825a..b9111d8cc6 100644 --- a/dockerfiles/Dockerfile.android-linter +++ b/dockerfiles/Dockerfile.android-linter @@ -18,7 +18,12 @@ WORKDIR /app COPY gradlew build.gradle settings.gradle gradle.properties /app/ COPY gradle/ /app/gradle/ -COPY sdk/ sdk/ +COPY bugsnag-android/ bugsnag-android/ +COPY bugsnag-android-ndk/ bugsnag-android-ndk/ +COPY bugsnag-plugin-android-anr/ bugsnag-plugin-android-anr/ +COPY bugsnag-android-core/ bugsnag-android-core/ +COPY bugsnag-plugin-android-ndk/ bugsnag-plugin-android-ndk/ +COPY examples/ examples/ COPY scripts/ scripts/ RUN scripts/install-ndk.sh @@ -31,8 +36,11 @@ RUN apt-get install -y cppcheck COPY examples/sdk-app-example/ examples/sdk-app-example/ COPY config/ config/ -RUN sed --in-place="" --expression="s/'armeabi',//" sdk/build.gradle examples/sdk-app-example/build.gradle +RUN sed --in-place="" --expression="s/'armeabi',//" bugsnag-plugin-android-anr/build.gradle \ + bugsnag-plugin-android-ndk/build.gradle examples/sdk-app-example/build.gradle CMD ./gradlew lint checkstyle detekt && \ - cppcheck --enable=warning,performance sdk/src/main/jni -i sdk/src/main/jni/deps -i sdk/src/main/jni/external + cppcheck --enable=warning,performance bugsnag-plugin-android-anr/src/main/jni && \ + cppcheck --enable=warning,performance bugsnag-plugin-android-ndk/src/main/jni -i \ + bugsnag-plugin-android-ndk/src/main/jni/deps -i bugsnag-plugin-android-ndk/src/main/jni/external diff --git a/examples/sdk-app-example/build.gradle b/examples/sdk-app-example/build.gradle index 454da62996..3939fc18c6 100644 --- a/examples/sdk-app-example/build.gradle +++ b/examples/sdk-app-example/build.gradle @@ -1,20 +1,8 @@ -buildscript { - repositories { - google() - mavenCentral() - jcenter() - } - dependencies { - classpath "com.android.tools.build:gradle:$agpVersion" - classpath "com.bugsnag:bugsnag-android-gradle-plugin:4.2.0" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - apply plugin: "com.android.application" apply plugin: "kotlin-android" repositories { + mavenLocal() google() mavenCentral() jcenter() @@ -25,15 +13,15 @@ android { config { keyAlias "password" keyPassword "password" - storeFile file("../../features/fixtures/fakekeys.jks") + storeFile file("fakekeys.jks") storePassword "password" } } - compileSdkVersion 28 + compileSdkVersion rootProject.ext.compileSdkVersion defaultConfig { - minSdkVersion 14 - targetSdkVersion 28 + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.compileSdkVersion testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" signingConfig signingConfigs.config ndk { @@ -47,40 +35,20 @@ android { signingConfig signingConfigs.config } } - lintOptions { - disable "OnClick" - abortOnError true - } - externalNativeBuild { - cmake { - path "CMakeLists.txt" - } - } + externalNativeBuild.cmake.path "CMakeLists.txt" } -// set this value to true if you wish to test with a local artefact -// it will instruct gradle to copy the SO files from the AAR to the correct build directory -def usingLocalArtefact = false +project.afterEvaluate { + project.android.lintOptions.abortOnError = false +} dependencies { - if (usingLocalArtefact) { - implementation project(path: ":sdk", configuration: "default") - } else { - implementation "com.bugsnag:bugsnag-android-ndk:4.15.0" - } + implementation "com.bugsnag:bugsnag-android:+" implementation "com.android.support:appcompat-v7:$supportLibVersion" implementation "com.android.support:support-v4:$supportLibVersion" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } -apply from: "checkstyle.gradle" apply plugin: "com.bugsnag.android.gradle" - -bugsnag { - failOnUploadError false -} - -if (usingLocalArtefact) { - apply from: "ndk_local_setup.gradle" -} +bugsnag.failOnUploadError = false diff --git a/examples/sdk-app-example/checkstyle.gradle b/examples/sdk-app-example/checkstyle.gradle deleted file mode 100644 index 3fbc3b3875..0000000000 --- a/examples/sdk-app-example/checkstyle.gradle +++ /dev/null @@ -1,11 +0,0 @@ -apply plugin: 'checkstyle' - -checkstyle { - toolVersion = "6.16" -} -task("checkstyle", type: Checkstyle) { - configFile rootProject.file("config/checkstyle/checkstyle.xml") - source "src/javaExample/java" - include "**/*.java" - classpath = files() -} diff --git a/examples/sdk-app-example/fakekeys.jks b/examples/sdk-app-example/fakekeys.jks new file mode 100644 index 0000000000..75604b1b5e Binary files /dev/null and b/examples/sdk-app-example/fakekeys.jks differ diff --git a/examples/sdk-app-example/ndk_local_setup.gradle b/examples/sdk-app-example/ndk_local_setup.gradle deleted file mode 100644 index f53fa2bb60..0000000000 --- a/examples/sdk-app-example/ndk_local_setup.gradle +++ /dev/null @@ -1,55 +0,0 @@ - -// Local development settings. Uncomment these if referencing -// local dependencies: -assemble.dependsOn ":ndk:assemble" -/** - * Gradle configuration for unpacking native API for CMake. Only required - * when building against local artifacts. - */ -import org.gradle.api.DefaultTask -import org.gradle.api.tasks.TaskAction - -class BugsnagTestNdkSetupTask extends DefaultTask { - - @TaskAction - void setupNdkProject() { - def artifactFile = findBugsnagNdkArchive() - File dst = new File(project.buildDir, "/intermediates/bugsnag-libs") - - project.copy { - from project.zipTree(artifactFile) - into(project.file(dst)) - } - } - - File findBugsnagNdkArchive() { - for (def config in project.configurations) { - try { - def artifactFile = config.resolvedConfiguration.getFiles().find { - it.toString().contains("bugsnag-android") - } - if (artifactFile && artifactFile.exists()) { - return artifactFile - } - } catch (Exception e) {} // some configurations cannot be directly resolved - } - throw new Exception("SOLUTION: The bugsnag-android-ndk file was not found, please run `./gradlew ndk:assembleRelease`") - } -} - -project.afterEvaluate { - def cleanTasks = project.tasks.findAll { - it.name.startsWith("externalNative") && it.name.contains("Clean") - } - def buildTasks = project.tasks.findAll { - it.name.startsWith("externalNative") && it.name.contains("Build") && !it.name.contains("Clean") - } - - def ndkSetupTask = project.tasks.create("bugsnagInstallAllJniLibsTask", BugsnagTestNdkSetupTask) - - buildTasks.forEach { - ndkSetupTask.mustRunAfter(cleanTasks) - it.dependsOn ndkSetupTask - it.doFirst { ndkSetupTask } - } -} diff --git a/examples/sdk-app-example/src/main/java/com.bugsnag.android/example/ExampleActivity.kt b/examples/sdk-app-example/src/main/java/com.bugsnag.android/example/ExampleActivity.kt index 0076014f89..3d71a20ac0 100644 --- a/examples/sdk-app-example/src/main/java/com.bugsnag.android/example/ExampleActivity.kt +++ b/examples/sdk-app-example/src/main/java/com.bugsnag.android/example/ExampleActivity.kt @@ -50,15 +50,13 @@ class ExampleActivity : AppCompatActivity() { // Add some global metaData Bugsnag.addToTab("user", "age", 31) - - // Mark the following packages as part of your app - Bugsnag.setProjectPackages("com.bugsnag.android.example", "com.bugsnag.android.other") } /** * Throws an unhandled Exception. Bugsnag will automatically capture any uncaught exceptions * in your app and send an error report. */ + @Suppress("UNUSED_PARAMETER") fun crashUnhandled(view: View) { throw CrashyClass.crash("Fatal Crash") } @@ -67,6 +65,7 @@ class ExampleActivity : AppCompatActivity() { * You can call [Bugsnag.notify] to send an error report for exceptions * which are already handled by your app. */ + @Suppress("UNUSED_PARAMETER") fun crashHandled(view: View) { try { throw RuntimeException("Non-Fatal Crash") @@ -80,6 +79,7 @@ class ExampleActivity : AppCompatActivity() { /** * Delivers an error notification from native (C/C++) code */ + @Suppress("UNUSED_PARAMETER") fun notifyNativeHandled(view: View) { notifyFromCXX() } @@ -88,6 +88,7 @@ class ExampleActivity : AppCompatActivity() { * The severity of error reports can be altered. This can be useful for capturing handled * exceptions which occur often but are not visible to the user. */ + @Suppress("UNUSED_PARAMETER") fun crashWithCustomSeverity(view: View) { val e = RuntimeException("Error Report with altered Severity") Bugsnag.notify(e, Severity.INFO) @@ -98,6 +99,7 @@ class ExampleActivity : AppCompatActivity() { * User details can be added globally, which will then appear in all error reports sent * to the Bugsnag dashboard. */ + @Suppress("UNUSED_PARAMETER") fun crashWithUserDetails(view: View) { Bugsnag.setUser("123456", "joebloggs@example.com", "Joe Bloggs") val e = RuntimeException("Error Report with User Info") @@ -110,11 +112,15 @@ class ExampleActivity : AppCompatActivity() { * [Bugsnag.notify], as shown below, or registering a global callback * with [Bugsnag.beforeNotify] that adds metadata to the report. */ + @Suppress("UNUSED_PARAMETER") fun crashWithMetadata(view: View) { val e = RuntimeException("Error report with Additional Metadata") - val metaData = generateUserMetaData() - Bugsnag.notify(e, Severity.ERROR, metaData) + Bugsnag.notify(e) {report -> + val error = report.error + error.severity = Severity.ERROR + error.metaData.addToTab("CustomMetaData", "HasLaunchedGameTutorial", true) + } displayToastNotification() } @@ -123,6 +129,7 @@ class ExampleActivity : AppCompatActivity() { * up to a crash. You can log your own breadcrumbs which will display on the Bugsnag Dashboard - * activity lifecycle callbacks and system intents are also captured automatically. */ + @Suppress("UNUSED_PARAMETER") fun crashWithBreadcrumbs(view: View) { Bugsnag.leaveBreadcrumb("LoginButtonClick") @@ -139,13 +146,14 @@ class ExampleActivity : AppCompatActivity() { * When sending a handled error, a callback can be registered, which allows the Error Report * to be modified before it is sent. */ + @Suppress("UNUSED_PARAMETER") fun crashWithCallback(view: View) { val e = RuntimeException("Customized Error Report") - Bugsnag.notify(e, Callback { report -> + Bugsnag.notify(e) { report -> // modify the report - report.error?.metaData = generateUserMetaData() - }) + report.error.metaData = generateUserMetaData() + } displayToastNotification() } @@ -163,6 +171,7 @@ class ExampleActivity : AppCompatActivity() { } } + @Suppress("UNUSED_PARAMETER") fun readDocs(view: View) { val uri = Uri.parse("https://docs.bugsnag.com/platforms/android/sdk/") val intent = Intent(Intent.ACTION_VIEW, uri) @@ -172,7 +181,7 @@ class ExampleActivity : AppCompatActivity() { private fun generateUserMetaData(): MetaData { val completedLevels = Arrays.asList("Level 1 - The Beginning", "Level 2 - Tower Defence") val userDetails = HashMap() - userDetails.put("playerName", "Joe Bloggs the Invincible") + userDetails["playerName"] = "Joe Bloggs the Invincible" val metaData = MetaData() metaData.addToTab("CustomMetaData", "HasLaunchedGameTutorial", true) @@ -180,8 +189,4 @@ class ExampleActivity : AppCompatActivity() { metaData.addToTab("CustomMetaData", "CompletedLevels", completedLevels) return metaData } - - fun sendErrorWithCallback(callback: Callback) { - Bugsnag.notify(RuntimeException(), callback) - } } diff --git a/features/fixtures/mazerunner/build.gradle b/features/fixtures/mazerunner/build.gradle index fb8a38246c..497746ed00 100644 --- a/features/fixtures/mazerunner/build.gradle +++ b/features/fixtures/mazerunner/build.gradle @@ -1,9 +1,17 @@ repositories { + mavenLocal() google() - mavenCentral() - jcenter() - flatDir { - dirs 'libs' + + // ignore already published artefacts in jcenter/bintray in favour of mavenLocal artefact + mavenCentral() { + content { + excludeModule("com.bugsnag", "bugsnag-android") + } + } + jcenter { + content { + excludeModule("com.bugsnag", "bugsnag-android") + } } } @@ -14,15 +22,11 @@ buildscript { mavenCentral() jcenter() } - ext.kotlin_version = '1.3.10' + ext.kotlin_version = '1.3.21' dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' - classpath 'com.bugsnag:bugsnag-android-gradle-plugin:3.4.2' - classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0' - classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.2' - classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.2' + classpath 'com.android.tools.build:gradle:3.4.2' + classpath 'com.bugsnag:bugsnag-android-gradle-plugin:4.5.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } @@ -68,10 +72,9 @@ android { } dependencies { - implementation(name:'bugsnag-android-ndk', ext:'aar') + implementation "com.bugsnag:bugsnag-android:+" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation "com.facebook.infer.annotation:infer-annotation:0.11.2" - api "com.android.support:support-annotations:27.0.0" + api "com.android.support:support-annotations:28.0.0" } apply plugin: 'com.bugsnag.android.gradle' diff --git a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/MainActivity.kt b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/MainActivity.kt index d129b2666e..eaeaee0d70 100644 --- a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/MainActivity.kt +++ b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/MainActivity.kt @@ -46,7 +46,8 @@ class MainActivity : Activity() { val config = Configuration(intent.getStringExtra("BUGSNAG_API_KEY")) val port = intent.getStringExtra("BUGSNAG_PORT") config.setEndpoints("${findHostname()}:$port", "${findHostname()}:$port") - + config.detectNdkCrashes = true + config.detectAnrs = true return config } diff --git a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AppNotRespondingDisabledScenario.kt b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AppNotRespondingDisabledScenario.kt index f11bc3e96a..d03a634205 100644 --- a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AppNotRespondingDisabledScenario.kt +++ b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AppNotRespondingDisabledScenario.kt @@ -12,6 +12,7 @@ internal class AppNotRespondingDisabledScenario(config: Configuration, context: Context) : Scenario(config, context) { init { config.setAutoCaptureSessions(false) + config.detectAnrs = false } override fun run() { diff --git a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AutoSessionScenario.kt b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AutoSessionScenario.kt index 08c8cfcdf1..6ea6f4b31b 100644 --- a/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AutoSessionScenario.kt +++ b/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/scenarios/AutoSessionScenario.kt @@ -13,16 +13,9 @@ import com.bugsnag.android.mazerunner.SecondActivity internal class AutoSessionScenario(config: Configuration, context: Context) : Scenario(config, context) { - init { - // initial bugsnag init will be discarded - config.setAutoCaptureSessions(false) - } override fun run() { super.run() - config.setAutoCaptureSessions(true) Bugsnag.init(context, config) - Bugsnag.setUser("123", "user@example.com", "Joe Bloggs") - context.startActivity(Intent(context, SecondActivity::class.java)) } } diff --git a/features/session_tracking.feature b/features/session_tracking.feature index 12771ac5fe..422ed7cc35 100644 --- a/features/session_tracking.feature +++ b/features/session_tracking.feature @@ -8,9 +8,7 @@ Scenario: Automatic Session Tracking sends And the "Bugsnag-API-Key" header equals "a35a2a72bd230ac0aa0f52715bbdc6aa" And the payload field "notifier.name" equals "Android Bugsnag Notifier" And the payload field "sessions" is an array with 1 element - And the session "user.id" equals "123" - And the session "user.email" equals "user@example.com" - And the session "user.name" equals "Joe Bloggs" + And the session "user.id" is not null And the session "id" is not null And the session "startedAt" is not null diff --git a/features/support/env.rb b/features/support/env.rb index 9f41b10bfa..3efdfa9262 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -2,22 +2,17 @@ RUNNING_CI = ENV['TRAVIS'] == 'true' # Install latest versions of bugsnag-android -run_required_commands([ - [ - "./gradlew", "sdk:assembleRelease", "-PreleaseNdkArtefact=true", - "-x", "lintVitalRelease", - "-x", "countReleaseDexMethods" - ], - ["cp", "sdk/build/outputs/aar/bugsnag-android-*.aar", - "features/fixtures/mazerunner/libs/bugsnag-android-ndk.aar"], -]) + run_required_commands([ + [ + "./gradlew", "assembleRelease", "publishToMavenLocal", "-x", "lintVitalRelease" + ], + ]) # Build the harness app Dir.chdir('features/fixtures/mazerunner') do run_required_commands([ [ - "../../../gradlew", "assembleRelease", - "-x", "lintVitalRelease" + "../../../gradlew", "assembleRelease", "-x", "lintVitalRelease" ], ]) end diff --git a/gradle.properties b/gradle.properties index 4314cb0ed0..40de93228d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ org.gradle.jvmargs=-Xmx1536m # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=4.16.1 +VERSION_NAME=4.17.0 GROUP=com.bugsnag POM_SCM_URL=https://github.com/bugsnag/bugsnag-android POM_SCM_CONNECTION=scm:git@github.com:bugsnag/bugsnag-android.git diff --git a/gradle/release.gradle b/gradle/release.gradle index fb576cd2ee..2c072c524b 100644 --- a/gradle/release.gradle +++ b/gradle/release.gradle @@ -2,10 +2,8 @@ apply plugin: "maven-publish" apply plugin: "signing" apply plugin: "com.jfrog.bintray" -boolean releaseNdkArtefact = project.hasProperty("releaseNdkArtefact") -String pomName = releaseNdkArtefact ? "Bugsnag Android NDK" : "Bugsnag Android" - -archivesBaseName = releaseNdkArtefact ? "bugsnag-android-ndk" : "bugsnag-android" +String pomName = project.getProperties().get("pomName") +archivesBaseName = project.getProperties().get("artefactId") version = "${project.VERSION_NAME}" group = "${project.GROUP}" @@ -53,7 +51,7 @@ publishing { artifactId archivesBaseName version version artifact(sourceJar) - artifact("$buildDir/outputs/aar/$archivesBaseName-${project.VERSION_NAME}.aar") + artifact("$buildDir/outputs/aar/$archivesBaseName-release.aar") pom.withXml { Node root = asNode() diff --git a/scripts/build-instrumentation-tests.sh b/scripts/build-instrumentation-tests.sh index 99b8f4b354..486b42dc6b 100755 --- a/scripts/build-instrumentation-tests.sh +++ b/scripts/build-instrumentation-tests.sh @@ -1,3 +1,3 @@ ./scripts/install-ndk.sh -./gradlew sdk:assembleAndroidTest --stacktrace +./gradlew assembleAndroidTest --stacktrace diff --git a/sdk/.gitignore b/sdk/.gitignore deleted file mode 100644 index 796b96d1c4..0000000000 --- a/sdk/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/sdk/build.gradle b/sdk/build.gradle deleted file mode 100644 index 146c3645fe..0000000000 --- a/sdk/build.gradle +++ /dev/null @@ -1,90 +0,0 @@ -plugins { - id("io.gitlab.arturbosch.detekt").version("1.0.0-RC14") -} - -apply plugin: "com.android.library" -apply plugin: "kotlin-android" - -repositories { - google() - mavenCentral() - jcenter() -} - -android { - compileSdkVersion Integer.parseInt(project.ANDROID_COMPILE_SDK_VERSION) - - defaultConfig { - // Note minSdkVersion must be >=21 for 64 bit architectures - minSdkVersion Integer.parseInt(project.ANDROID_MIN_SDK_VERSION) - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - consumerProguardFiles "proguard-rules.pro" - - externalNativeBuild { - cmake { - arguments "-DANDROID_CPP_FEATURES=exceptions", - "-DANDROID_STL=c++_static" - } - } - - ndk { - if (project.hasProperty("ABI_FILTERS")) { - abiFilters project.ABI_FILTERS.split(",") - } else { - abiFilters "arm64-v8a", "armeabi-v7a", "armeabi", "x86", "x86_64" - } - } - } - - lintOptions { - abortOnError true - warningsAsErrors true - checkAllWarnings true - baseline file("lint-baseline.xml") - } - - externalNativeBuild { - cmake { - path "CMakeLists.txt" - } - } - - buildTypes { - debug { - testCoverageEnabled = true - } - } - - buildTypes.each { buildType -> - boolean detectNdkCrashes = project.hasProperty("releaseNdkArtefact") - buildType.buildConfigField("boolean", "DETECT_NDK_CRASHES", "$detectNdkCrashes") - } - - testOptions.unitTests.all { - testLogging { - events "passed", "skipped", "failed", "standardOut", "standardError" - outputs.upToDateWhen {false} - showStandardStreams = true - info.events = ["passed", "skipped", "failed", "standardOut", "standardError"] - } - } -} - -gradle.projectsEvaluated { - tasks.withType(JavaCompile) { - options.compilerArgs << "-Xlint:all" << "-Werror" - } -} - -tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { - kotlinOptions { - allWarningsAsErrors = true - } -} - -apply from: "../gradle/dependencies.gradle" -apply from: "../gradle/release.gradle" -apply from: "../gradle/detekt.gradle" -apply from: "../gradle/dexcount.gradle" -apply from: "../gradle/coveralls.gradle" -apply from: "../gradle/checkstyle.gradle" diff --git a/sdk/lint-baseline.xml b/sdk/lint-baseline.xml deleted file mode 100644 index b51ce56bf2..0000000000 --- a/sdk/lint-baseline.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/settings.gradle b/settings.gradle index 6c016998f5..b23ac44433 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,9 @@ -include ":sdk", ":sdkAppExample" +include( + ":bugsnag-android", + ":bugsnag-android-ndk", + ':bugsnag-android-core', + ':bugsnag-plugin-android-anr', + ':bugsnag-plugin-android-ndk', + ":sdkAppExample" +) project(":sdkAppExample").projectDir = new File("examples/sdk-app-example") diff --git a/tests/features/fixtures/mazerunner/build.gradle b/tests/features/fixtures/mazerunner/build.gradle index 13a89a9590..497746ed00 100644 --- a/tests/features/fixtures/mazerunner/build.gradle +++ b/tests/features/fixtures/mazerunner/build.gradle @@ -1,10 +1,17 @@ repositories { - google() mavenLocal() - mavenCentral() - jcenter() - flatDir { - dirs 'libs' + google() + + // ignore already published artefacts in jcenter/bintray in favour of mavenLocal artefact + mavenCentral() { + content { + excludeModule("com.bugsnag", "bugsnag-android") + } + } + jcenter { + content { + excludeModule("com.bugsnag", "bugsnag-android") + } } } @@ -15,15 +22,11 @@ buildscript { mavenCentral() jcenter() } - ext.kotlin_version = '1.3.10' + ext.kotlin_version = '1.3.21' dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' - classpath 'com.bugsnag:bugsnag-android-gradle-plugin:3.4.2' - classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0' - classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.2' - classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.2' + classpath 'com.android.tools.build:gradle:3.4.2' + classpath 'com.bugsnag:bugsnag-android-gradle-plugin:4.5.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } @@ -69,9 +72,8 @@ android { } dependencies { - implementation("com.bugsnag:bugsnag-android-ndk:9.9.9") + implementation "com.bugsnag:bugsnag-android:+" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation "com.facebook.infer.annotation:infer-annotation:0.11.2" api "com.android.support:support-annotations:28.0.0" } diff --git a/tests/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/MainActivity.kt b/tests/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/MainActivity.kt index cea8bd3813..e8fdbb9641 100644 --- a/tests/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/MainActivity.kt +++ b/tests/features/fixtures/mazerunner/src/main/java/com/bugsnag/android/mazerunner/MainActivity.kt @@ -75,8 +75,8 @@ class MainActivity : Activity() { private fun prepareConfig(): Configuration { val config = Configuration("ABCDEFGHIJKLMNOPQRSTUVWXYZ012345") config.setEndpoints("http://bs-local.com:9339", "http://bs-local.com:9339") - config.setAutoCaptureSessions(false) - config.detectAnrs = false + config.detectNdkCrashes = true + config.detectAnrs = true return config } diff --git a/tests/features/steps/android_steps.rb b/tests/features/steps/android_steps.rb index ad0c62a1ff..1de764ebfa 100644 --- a/tests/features/steps/android_steps.rb +++ b/tests/features/steps/android_steps.rb @@ -16,24 +16,9 @@ When("I clear any error dialogue") do sleep(3) - begin - $driver.wait_for_element("android:id/button1", 1) - rescue Selenium::WebDriver::Error::TimeoutError - else - $driver.click_element("android:id/button1") - end - begin - $driver.wait_for_element("android:id/aerr_close", 1) - rescue Selenium::WebDriver::Error::TimeoutError - else - $driver.click_element("android:id/aerr_close") - end - begin - $driver.wait_for_element("android:id/aerr_restart", 1) - rescue Selenium::WebDriver::Error::TimeoutError - else - $driver.click_element("android:id/aerr_restart") - end + $driver.click_element("android:id/button1") if $driver.wait_for_element("android:id/button1", 1) + $driver.click_element("android:id/aerr_close") if $driver.wait_for_element("android:id/aerr_close", 1) + $driver.click_element("android:id/aerr_restart") if $driver.wait_for_element("android:id/aerr_restart", 1) end When("I configure Bugsnag for {string}") do |event_type|