From b8b9dce0c26c02978e56d2c4f11d5a5f481160d7 Mon Sep 17 00:00:00 2001 From: Alexey Karimov Date: Thu, 27 Aug 2026 01:33:00 +0500 Subject: [PATCH 1/2] docs(android): release notes for SDK 7.1.4 and Gradle plugin 4.0.6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SDK 7.1.4 — the headline is that injected Bugsee calls no longer break local unit test runs. AGP feeds ASM-rewritten bytecode to testDebugUnitTest as well as to the device, and off-device the injected code hit stubbed framework APIs, surfacing as a failure inside an ordinary method of the consumer's own. Also covers the log-call containment and three crashes reachable in a host app: the report screen reopening after process death, a theme change with a notification-triggered report open, and the blank notification icon on the Huawei/API<=23 fallback path. Plus the snapshot de-duplication fallback on filesystems that refuse symlinks. Gradle plugin 4.0.6 — leads with the variant-scoping fix: a `debugImplementation` SDK dependency previously instrumented release bytecode too, which either failed the build under R8 or, with the -dontwarn rule R8 itself suggests, shipped an app that died at launch before any consumer code ran. Also the Compose null-Modifier launch crash (paired with the 7.1.4 runtime change, noted as a version requirement), the thread VerifyError, and the operation-End-on-throw fix. Also backfills 7.1.3, which shipped without notes. Its single change is documented from the release's actual contents rather than left as a gap in the version history. Verified with a full `npm run build`; the two SSG warnings it reports are pre-existing on the dotnet and xamarin network pages. Change-Id: I36773b69043f27bcfa53d2e9d47f5e9a945f5ae9 --- docs/sdk/android/gradle-plugin/releases.mdx | 33 ++++++++++++++++++ docs/sdk/android/release-notes.md | 38 +++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/docs/sdk/android/gradle-plugin/releases.mdx b/docs/sdk/android/gradle-plugin/releases.mdx index 09abc2d..e2ee451 100644 --- a/docs/sdk/android/gradle-plugin/releases.mdx +++ b/docs/sdk/android/gradle-plugin/releases.mdx @@ -9,6 +9,39 @@ slug: "/sdk/android/gradle-plugin/releases" ## 4.x (SDK 7.x) +### 4.0.6 (August 2026) + +Stops instrumentation leaking into build variants that do not carry the SDK, and fixes three +injection bugs that could break a build or crash an app at launch. Recommended for everyone; +essential if you declare Bugsee for some variants only. + +- **Variants that do not include the SDK are no longer instrumented.** Detection previously looked + at the whole project rather than the variant being built, so declaring the SDK with + `debugImplementation` — Bugsee in debug builds, absent from release — still injected Bugsee calls + into release bytecode. The result was either an R8 `Missing class` build failure, or, if you + applied the `-dontwarn` rule R8's own `missing_rules.txt` suggests, an app that compiled and then + died at launch with `NoClassDefFoundError` before any of your code ran. Detection is now scoped to + the configurations that feed the variant, and covers build-type, flavor and full-variant + declarations. Projects that declare Bugsee with plain `implementation` are unaffected. + +- **Fixes a launch crash from Compose instrumentation.** A `Modifier` receiver arriving as `null` at + an injected `bugseeTag` call site crashed the app on startup with "Parameter specified as non-null + is null". Requires **Bugsee Android SDK 7.1.4** or newer, which ships the matching runtime change. + +- **Fixes a `VerifyError` from thread instrumentation.** Certain method shapes produced bytecode the + verifier rejected, failing the app at runtime. + +- **Operation timing is now reported when a guarded call throws.** An instrumented I/O or database + call that raised an exception reported its start but never its end, leaving an operation that + never appeared to finish. Exception handling in your own code is unchanged. + +- **Extension-provider stripping is gated on the SDK version.** The optimization that removes + extension init providers from the merged manifest is applied only when the SDK on the classpath + supports it, instead of being applied unconditionally. + +- **Already-minified classes are skipped.** Third-party code that arrives R8-minified is no longer + rewritten. + ### 4.0.5 (August 2026) Restores Jetpack Compose instrumentation on Kotlin 2.2, 2.3 and 2.4. Upgrade if your project uses diff --git a/docs/sdk/android/release-notes.md b/docs/sdk/android/release-notes.md index 1030a76..06a28ca 100644 --- a/docs/sdk/android/release-notes.md +++ b/docs/sdk/android/release-notes.md @@ -7,6 +7,44 @@ slug: "/sdk/android/release-notes" Release history for Bugsee Android SDK 7.x. Looking for the previous major version? See the [6.x release notes](/sdk/android/v6/release-notes). See the [migration guide](/sdk/android/migration) when planning your upgrade from 6.x. +## 7.1.4 + +A patch release focused on staying out of your way: instrumented calls no longer break local unit +test runs, and three crashes that could surface inside your own app are fixed. + +- **Injected Bugsee calls no longer fail local unit tests.** The Gradle plugin rewrites call sites in + your code, and AGP feeds that rewritten bytecode to `testDebugUnitTest` as well as to the device. + On the JVM the Android framework is stubbed, so calls the injected code relies on — such as + `Looper.getMainLooper()` — either return `null` or throw, and that surfaced as a failure inside an + ordinary method of yours, from a line that only read `PreferenceManager.getDefaultSharedPreferences(…)`. + Every injected entry point now degrades to a no-op off-device. If you disabled + `mainThreadMisuse`, `log`, `thread` or `operationDispatch` instrumentation to get a green test + run, you can turn them back on. + +- **Capture failures can no longer escape into your own logging call.** Work performed on Bugsee's + behalf inside a rewritten `Log.x()` is now fully contained, so a failure in the capture pipeline + cannot propagate out of a logging statement in your code. + +- **Fixes a crash when the report screen is reopened.** Reporting an issue could crash with a + `NullPointerException` if the screen ran before its fields were ready — for example when Android + restored it after the process had been killed in the background. + +- **Fixes a crash when the theme changes while a notification-triggered report is open.** Switching + the device between light and dark mode with that screen in the foreground crashed the host app. + +- **The notification's small icon renders again on devices that need the fallback.** On Huawei + devices running Android 6.0 and older, Bugsee draws its icon into a bitmap; that bitmap was blank, + so the workaround did nothing on exactly the devices it was written for. + +- **Screenshots are no longer lost when de-duplication cannot link a file.** On storage that refuses + symbolic links, a failed link aborted the whole snapshot instead of falling back to a copy. + +## 7.1.3 + +- **Reports opened from the Bugsee notification are attributed correctly.** A report started by + tapping the notification was recorded as if it had been triggered from code, which made + notification-initiated reports indistinguishable from `Bugsee.showReportDialog()` ones. + ## 7.1.2 A patch release for native crash reporting. Crashes in the first moments of a launch — a window that From e389859dced1dcda56daa786ac0223560798cbc0 Mon Sep 17 00:00:00 2001 From: Alexey Karimov Date: Thu, 27 Aug 2026 01:37:14 +0500 Subject: [PATCH 2/2] docs(android): rewrite 7.1.4 and 4.0.6 notes for readers, not implementers Drops build-tool internals (ASM/AGP/R8, bytecode, VerifyError, dontwarn, missing_rules.txt, symlinks) in favour of what the reader actually observes and what they should do about it. Keeps the parts that are decision-relevant: which dependency setup is affected, which instrumentation flags can be re-enabled, and the SDK 7.1.4 requirement for the Compose fix. 7.1.3 gains a proper entry with a lead line, matching the surrounding format. Change-Id: Id40d8c334196fb1b503c5631037cf02c66d2846b --- docs/sdk/android/gradle-plugin/releases.mdx | 52 +++++++++------------ docs/sdk/android/release-notes.md | 48 +++++++++---------- 2 files changed, 44 insertions(+), 56 deletions(-) diff --git a/docs/sdk/android/gradle-plugin/releases.mdx b/docs/sdk/android/gradle-plugin/releases.mdx index e2ee451..d023de8 100644 --- a/docs/sdk/android/gradle-plugin/releases.mdx +++ b/docs/sdk/android/gradle-plugin/releases.mdx @@ -11,36 +11,28 @@ slug: "/sdk/android/gradle-plugin/releases" ### 4.0.6 (August 2026) -Stops instrumentation leaking into build variants that do not carry the SDK, and fixes three -injection bugs that could break a build or crash an app at launch. Recommended for everyone; -essential if you declare Bugsee for some variants only. - -- **Variants that do not include the SDK are no longer instrumented.** Detection previously looked - at the whole project rather than the variant being built, so declaring the SDK with - `debugImplementation` — Bugsee in debug builds, absent from release — still injected Bugsee calls - into release bytecode. The result was either an R8 `Missing class` build failure, or, if you - applied the `-dontwarn` rule R8's own `missing_rules.txt` suggests, an app that compiled and then - died at launch with `NoClassDefFoundError` before any of your code ran. Detection is now scoped to - the configurations that feed the variant, and covers build-type, flavor and full-variant - declarations. Projects that declare Bugsee with plain `implementation` are unaffected. - -- **Fixes a launch crash from Compose instrumentation.** A `Modifier` receiver arriving as `null` at - an injected `bugseeTag` call site crashed the app on startup with "Parameter specified as non-null - is null". Requires **Bugsee Android SDK 7.1.4** or newer, which ships the matching runtime change. - -- **Fixes a `VerifyError` from thread instrumentation.** Certain method shapes produced bytecode the - verifier rejected, failing the app at runtime. - -- **Operation timing is now reported when a guarded call throws.** An instrumented I/O or database - call that raised an exception reported its start but never its end, leaving an operation that - never appeared to finish. Exception handling in your own code is unchanged. - -- **Extension-provider stripping is gated on the SDK version.** The optimization that removes - extension init providers from the merged manifest is applied only when the SDK on the classpath - supports it, instead of being applied unconditionally. - -- **Already-minified classes are skipped.** Third-party code that arrives R8-minified is no longer - rewritten. +Stops Bugsee being added to build variants that do not include the SDK, and fixes two crashes and a +build failure. Recommended for everyone; essential if you include Bugsee in some build variants +only. + +- **Build variants without Bugsee are left alone.** If you add Bugsee for some variants only — for + example with `debugImplementation`, so it is in your debug builds but not in release — your + release builds were still being wired up to call an SDK that was not there. Depending on your + setup that either failed the release build, or produced an app that crashed the moment it was + opened. Release builds are now left untouched unless Bugsee is genuinely part of them. Flavors are + handled the same way. If you declare Bugsee with plain `implementation`, nothing changes for you. + +- **Fixes a crash on launch in apps using Compose.** Requires **Bugsee Android SDK 7.1.4** or newer, + which ships the matching runtime change. + +- **Fixes a crash in apps using thread instrumentation.** + +- **Failed operations are now timed.** A database or file operation that ended in an exception was + left looking as though it had never finished. Exception handling in your own code is unchanged. + +- **Manifest optimization is applied only when your SDK version supports it.** + +- **Third-party libraries that arrive already minified are left as they are.** ### 4.0.5 (August 2026) diff --git a/docs/sdk/android/release-notes.md b/docs/sdk/android/release-notes.md index 06a28ca..617c619 100644 --- a/docs/sdk/android/release-notes.md +++ b/docs/sdk/android/release-notes.md @@ -9,41 +9,37 @@ Release history for Bugsee Android SDK 7.x. Looking for the previous major versi ## 7.1.4 -A patch release focused on staying out of your way: instrumented calls no longer break local unit -test runs, and three crashes that could surface inside your own app are fixed. +A patch release that keeps Bugsee out of your test runs and fixes three crashes that could reach +your users. -- **Injected Bugsee calls no longer fail local unit tests.** The Gradle plugin rewrites call sites in - your code, and AGP feeds that rewritten bytecode to `testDebugUnitTest` as well as to the device. - On the JVM the Android framework is stubbed, so calls the injected code relies on — such as - `Looper.getMainLooper()` — either return `null` or throw, and that surfaced as a failure inside an - ordinary method of yours, from a line that only read `PreferenceManager.getDefaultSharedPreferences(…)`. - Every injected entry point now degrades to a no-op off-device. If you disabled - `mainThreadMisuse`, `log`, `thread` or `operationDispatch` instrumentation to get a green test - run, you can turn them back on. +- **Your local unit tests pass again.** Bugsee could cause failures in ordinary JVM unit tests — in + your own code, on lines that had nothing to do with Bugsee. Tests now run unaffected. If you + turned off `mainThreadMisuse`, `log`, `thread` or `operationDispatch` instrumentation to get a + green test run, you can turn them back on. -- **Capture failures can no longer escape into your own logging call.** Work performed on Bugsee's - behalf inside a rewritten `Log.x()` is now fully contained, so a failure in the capture pipeline - cannot propagate out of a logging statement in your code. +- **Trouble inside Bugsee can no longer surface from your logging calls.** Logging statements in + your app are now unaffected by anything that happens while Bugsee is capturing. -- **Fixes a crash when the report screen is reopened.** Reporting an issue could crash with a - `NullPointerException` if the screen ran before its fields were ready — for example when Android - restored it after the process had been killed in the background. +- **Fixes a crash when the report screen is reopened.** Reporting an issue could crash if Android + restored the screen after your app had been dropped from memory in the background. -- **Fixes a crash when the theme changes while a notification-triggered report is open.** Switching - the device between light and dark mode with that screen in the foreground crashed the host app. +- **Fixes a crash when the theme changes while a report is open.** Switching the device between + light and dark mode with a notification-opened report on screen crashed the app. -- **The notification's small icon renders again on devices that need the fallback.** On Huawei - devices running Android 6.0 and older, Bugsee draws its icon into a bitmap; that bitmap was blank, - so the workaround did nothing on exactly the devices it was written for. +- **The notification icon appears again on devices that need the fallback.** On Huawei devices + running Android 6.0 and older, Bugsee's notification showed no small icon. -- **Screenshots are no longer lost when de-duplication cannot link a file.** On storage that refuses - symbolic links, a failed link aborted the whole snapshot instead of falling back to a copy. +- **Screenshots are no longer lost on some storage configurations.** Where the device restricted how + Bugsee stores identical screenshots, the screenshot was dropped from the report instead of being + saved another way. ## 7.1.3 -- **Reports opened from the Bugsee notification are attributed correctly.** A report started by - tapping the notification was recorded as if it had been triggered from code, which made - notification-initiated reports indistinguishable from `Bugsee.showReportDialog()` ones. +A single fix for how notification-initiated reports are labelled. + +- **Reports opened from the Bugsee notification are attributed correctly.** They were recorded as if + they had been started from code, so they could not be told apart from reports opened with + `Bugsee.showReportDialog()`. ## 7.1.2