Skip to content

Commit

Permalink
v5.9.2
Browse files Browse the repository at this point in the history
  • Loading branch information
fractalwrench authored May 12, 2021
2 parents 4719d47 + e813dc0 commit 9eeeee7
Show file tree
Hide file tree
Showing 41 changed files with 512 additions and 217 deletions.
3 changes: 0 additions & 3 deletions .buildkite/pipeline.full.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,6 @@ steps:
- "--fail-fast"
- "--tags"
- "not @Flaky"
- "--appium-version=1.8.0"
concurrency: 9
concurrency_group: 'browserstack-app'
soft_fail:
Expand All @@ -126,7 +125,6 @@ steps:
- "--fail-fast"
- "--tags"
- "not @Flaky"
- "--appium-version=1.8.0"
concurrency: 9
concurrency_group: 'browserstack-app'
soft_fail:
Expand Down Expand Up @@ -403,7 +401,6 @@ steps:
- "--farm=bs"
- "--device=ANDROID_5_0"
- "--tags=@Flaky"
- "--appium-version=1.8.0"
concurrency: 9
concurrency_group: 'browserstack-app'

Expand Down
1 change: 0 additions & 1 deletion .buildkite/pipeline.quick.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ steps:
- "--farm=bs"
- "--device=ANDROID_5_0"
- "--fail-fast"
- "--appium-version=1.8.0"
concurrency: 9
concurrency_group: 'browserstack-app'
soft_fail:
Expand Down
20 changes: 20 additions & 0 deletions .buildkite/pipeline.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
steps:

- label: 'Trigger RN tests for all builds of our next branch'
if: build.branch == "next"
trigger: 'bugsnag-js'
build:
branch: 'next'
message: 'Run RN tests with latest Android next branch'
env:
BUILD_RN_WITH_LATEST_NATIVES: "true"
async: true

# downloads the Android toolchain
- label: ':docker: Build Android base image'
key: "android-common"
Expand Down Expand Up @@ -30,6 +41,15 @@ steps:
push:
- android-ci:855461928731.dkr.ecr.us-west-1.amazonaws.com/android:ci-${BRANCH_NAME}

- label: 'Audit current licenses'
depends_on: "android-ci"
timeout_in_minutes: 30
plugins:
- docker-compose#v3.7.0:
run: android-license-audit
command:
- ./scripts/audit-dependency-licenses.sh

- label: ':android: Build fixture APK r16'
key: "fixture-r16"
depends_on: "android-ci"
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,4 @@ bugsnag_test
*.crash
.cxx/
.project
decisions.yml
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,27 @@
# Changelog

## 5.9.2 (2021-05-12)

### Bug fixes

* Guard against exceptions with null stack traces
[#1239](https://github.com/bugsnag/bugsnag-android/pull/1239)

* Fix bug that terminated the app when multiple ANRs occur
[#1235](https://github.com/bugsnag/bugsnag-android/pull/1235)

* Prevent rare NPE in log message
[#1238](https://github.com/bugsnag/bugsnag-android/pull/1238)

* Prevent rare NPE when capturing thread traces
[#1237](https://github.com/bugsnag/bugsnag-android/pull/1237)

* Catch exceptions thrown by Context.registerReceiver to prevent rare crashes
[#1240](https://github.com/bugsnag/bugsnag-android/pull/1240)

* Fix possible NegativeArraySizeException in crash report deserialization
[#1245](https://github.com/bugsnag/bugsnag-android/pull/1245)

## 5.9.1 (2021-04-22)

### Bug fixes
Expand Down
5 changes: 4 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ source "https://rubygems.org"
#gem 'bugsnag-maze-runner', path: '../maze-runner'

# Or a specific release:
gem 'bugsnag-maze-runner', git: 'https://github.com/bugsnag/maze-runner', tag: 'v4.12.0'
gem 'bugsnag-maze-runner', git: 'https://github.com/bugsnag/maze-runner', tag: 'v5.0.1'


# Or follow master:
#gem 'bugsnag-maze-runner', git: 'https://github.com/bugsnag/maze-runner'

gem "license_finder", "~> 6.13"
23 changes: 17 additions & 6 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
GIT
remote: https://github.com/bugsnag/maze-runner
revision: b590f1c94366349729f1b4413a9e6c050730a9fb
tag: v4.12.0
revision: 9aaf72b51c4f340f9d4901497752af70f526543f
tag: v5.0.1
specs:
bugsnag-maze-runner (4.12.0)
bugsnag-maze-runner (5.0.1)
appium_lib (~> 11.2.0)
boring (~> 0.1.0)
cucumber (~> 3.1.2)
Expand All @@ -24,10 +24,10 @@ GEM
appium_lib_core (~> 4.1)
nokogiri (~> 1.8, >= 1.8.1)
tomlrb (~> 1.1)
appium_lib_core (4.4.1)
appium_lib_core (4.5.0)
faye-websocket (~> 0.11.0)
selenium-webdriver (~> 3.14, >= 3.14.1)
backports (3.20.2)
backports (3.21.0)
boring (0.1.0)
builder (3.2.4)
childprocess (3.0.0)
Expand All @@ -54,11 +54,18 @@ GEM
eventmachine (>= 0.12.0)
websocket-driver (>= 0.5.1)
gherkin (5.1.0)
license_finder (6.13.0)
bundler
rubyzip (>= 1, < 3)
thor (~> 1.0.1)
tomlrb (>= 1.3, < 2.1)
with_env (= 1.1.0)
xml-simple (~> 1.1.5)
mini_portile2 (2.5.0)
minitest (5.14.4)
multi_json (1.15.0)
multi_test (0.1.2)
nokogiri (1.11.1)
nokogiri (1.11.2)
mini_portile2 (~> 2.5.0)
racc (~> 1.4)
optimist (3.0.1)
Expand All @@ -72,16 +79,20 @@ GEM
rubyzip (>= 1.2.2)
test-unit (3.3.9)
power_assert
thor (1.0.1)
tomlrb (1.3.0)
websocket-driver (0.7.3)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
with_env (1.1.0)
xml-simple (1.1.8)

PLATFORMS
ruby

DEPENDENCIES
bugsnag-maze-runner!
license_finder (~> 6.13)

BUNDLED WITH
2.2.13
8 changes: 4 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ test:
./gradlew connectedCheck

remote-test:
ifeq ($(MAZE_DEVICE_FARM_USERNAME),)
@$(error MAZE_DEVICE_FARM_USERNAME is not defined)
ifeq ($(BROWSER_STACK_USERNAME),)
@$(error BROWSER_STACK_USERNAME is not defined)
endif
ifeq ($(MAZE_DEVICE_FARM_ACCESS_KEY),)
@$(error MAZE_DEVICE_FARM_ACCESS_KEY is not defined)
ifeq ($(BROWSER_STACK_ACCESS_KEY),)
@$(error BROWSER_STACK_ACCESS_KEY is not defined)
endif
@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"]' \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ public Unit invoke(String oldOrientation, String newOrientation) {
}
}
);
appContext.registerReceiver(receiver, configFilter);
ContextExtensionsKt.registerReceiverSafe(appContext, receiver, configFilter, logger);
}

void setupNdkPlugin() {
Expand Down Expand Up @@ -923,7 +923,8 @@ EventStore getEventStore() {
protected void finalize() throws Throwable {
if (systemBroadcastReceiver != null) {
try {
appContext.unregisterReceiver(systemBroadcastReceiver);
ContextExtensionsKt.unregisterReceiverSafe(appContext,
systemBroadcastReceiver, logger);
} catch (IllegalArgumentException exception) {
logger.w("Receiver not registered");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@ internal class ConnectivityLegacy(

override fun registerForNetworkChanges() {
val intentFilter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
context.registerReceiver(changeReceiver, intentFilter)
context.registerReceiverSafe(changeReceiver, intentFilter)
}

override fun unregisterForNetworkChanges() = context.unregisterReceiver(changeReceiver)
override fun unregisterForNetworkChanges() = context.unregisterReceiverSafe(changeReceiver)

override fun hasNetworkConnection(): Boolean {
return cm.activeNetworkInfo?.isConnectedOrConnecting ?: false
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.bugsnag.android

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.RemoteException

/**
* Calls [Context.registerReceiver] but swallows [SecurityException] and [RemoteException]
* to avoid terminating the process in rare cases where the registration is unsuccessful.
*/
internal fun Context.registerReceiverSafe(
receiver: BroadcastReceiver?,
filter: IntentFilter?,
logger: Logger? = null
): Intent? {
try {
return registerReceiver(receiver, filter)
} catch (exc: SecurityException) {
logger?.w("Failed to register receiver", exc)
} catch (exc: RemoteException) {
logger?.w("Failed to register receiver", exc)
} catch (exc: IllegalArgumentException) {
logger?.w("Failed to register receiver", exc)
}
return null
}

/**
* Calls [Context.unregisterReceiver] but swallows [SecurityException] and [RemoteException]
* to avoid terminating the process in rare cases where the registration is unsuccessful.
*/
internal fun Context.unregisterReceiverSafe(
receiver: BroadcastReceiver?,
logger: Logger? = null
) {
try {
unregisterReceiver(receiver)
} catch (exc: SecurityException) {
logger?.w("Failed to register receiver", exc)
} catch (exc: RemoteException) {
logger?.w("Failed to register receiver", exc)
} catch (exc: IllegalArgumentException) {
logger?.w("Failed to register receiver", exc)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ internal class DeviceDataCollector(
private fun getBatteryLevel(): Float? {
try {
val ifilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
val batteryStatus = appContext.registerReceiver(null, ifilter)
val batteryStatus = appContext.registerReceiverSafe(null, ifilter, logger)

if (batteryStatus != null) {
return batteryStatus.getIntExtra(
Expand All @@ -151,7 +151,7 @@ internal class DeviceDataCollector(
private fun isCharging(): Boolean? {
try {
val ifilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
val batteryStatus = appContext.registerReceiver(null, ifilter)
val batteryStatus = appContext.registerReceiverSafe(null, ifilter, logger)

if (batteryStatus != null) {
val status = batteryStatus.getIntExtra("status", -1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ internal class ErrorInternal @JvmOverloads internal constructor(

var currentEx: Throwable? = exc
while (currentEx != null) {
val trace = Stacktrace.stacktraceFromJavaTrace(currentEx.stackTrace, projectPackages, logger)
// Somehow it's possible for stackTrace to be null in rare cases
val stacktrace = currentEx.stackTrace ?: arrayOf<StackTraceElement>()
val trace = Stacktrace.stacktraceFromJavaTrace(stacktrace, projectPackages, logger)
errors.add(ErrorInternal(currentEx.javaClass.name, currentEx.localizedMessage, trace))
currentEx = currentEx.cause
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ internal data class EventFilenameInfo(
* is not encoded for the given event
*/
private fun findApiKeyInFilename(file: File, config: ImmutableConfig): String {
val name = file.name.replace("_$STARTUP_CRASH.json".toRegex(), "")
val name = file.name.removeSuffix("_$STARTUP_CRASH.json")
val start = name.indexOf("_") + 1
val end = name.indexOf("_", start)
val apiKey = if (start == 0 || end == -1 || end <= start) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ import java.util.concurrent.atomic.AtomicBoolean
* configuration.launchDurationMillis, after which which the launch period is considered
* complete. If this value is zero, then the user must manually call markLaunchCompleted().
*/
internal class LaunchCrashTracker(config: ImmutableConfig) : BaseObservable() {
internal class LaunchCrashTracker @JvmOverloads constructor(
config: ImmutableConfig,
private val executor: ScheduledThreadPoolExecutor = ScheduledThreadPoolExecutor(1)
) : BaseObservable() {

private val launching = AtomicBoolean(true)
private val executor = ScheduledThreadPoolExecutor(1)
private val logger = config.logger

init {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import java.io.IOException
*/
class Notifier @JvmOverloads constructor(
var name: String = "Android Bugsnag Notifier",
var version: String = "5.9.1",
var version: String = "5.9.2",
var url: String = "https://bugsnag.com"
) : JsonStream.Streamable {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class SystemBroadcastReceiver extends BroadcastReceiver {
}

static SystemBroadcastReceiver register(final Client client,
Logger logger,
final Logger logger,
BackgroundTaskService bgTaskService) {
final SystemBroadcastReceiver receiver = new SystemBroadcastReceiver(client, logger);
if (receiver.getActions().size() > 0) {
Expand All @@ -41,7 +41,9 @@ static SystemBroadcastReceiver register(final Client client,
@Override
public void run() {
IntentFilter intentFilter = receiver.getIntentFilter();
client.appContext.registerReceiver(receiver, intentFilter);
Context context = client.appContext;
ContextExtensionsKt.registerReceiverSafe(context,
receiver, intentFilter, logger);
}
});
} catch (RejectedExecutionException ex) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,16 @@ internal class ThreadState @JvmOverloads constructor(
val currentThreadId = currentThread.id
return stackTraces.keys
.sortedBy { it.id }
.map {
val stacktrace = Stacktrace.stacktraceFromJavaTrace(stackTraces[it]!!, projectPackages, logger)
val errorThread = it.id == currentThreadId
Thread(it.id, it.name, ThreadType.ANDROID, errorThread, stacktrace, logger)
.mapNotNull { thread ->
val trace = stackTraces[thread]

if (trace != null) {
val stacktrace = Stacktrace.stacktraceFromJavaTrace(trace, projectPackages, logger)
val errorThread = thread.id == currentThreadId
Thread(thread.id, thread.name, ThreadType.ANDROID, errorThread, stacktrace, logger)
} else {
null
}
}.toMutableList()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@ class ConnectivityLegacyTest {
fun registerForNetworkChanges() {
val conn = ConnectivityLegacy(context, cm, null)
conn.registerForNetworkChanges()
Mockito.verify(context, times(1)).registerReceiver(any(), any())
Mockito.verify(context, times(1)).registerReceiverSafe(any(), any())
}

@Test
fun unregisterForNetworkChanges() {
val conn = ConnectivityLegacy(context, cm, null)
conn.unregisterForNetworkChanges()
Mockito.verify(context, times(1)).unregisterReceiver(any())
Mockito.verify(context, times(1)).unregisterReceiverSafe(any())
}

@Test
Expand Down
Loading

0 comments on commit 9eeeee7

Please sign in to comment.