-
-
Notifications
You must be signed in to change notification settings - Fork 357
ref(e2e): Consolidate Android build scripts per review feedback #5593
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: v8
Are you sure you want to change the base?
ref(e2e): Consolidate Android build scripts per review feedback #5593
Conversation
…ructures (#4445) * Extract Android SDK Init * Update tests * Adds changelog * Fix lint issues * Rename RNSentryStart instance for clarity * Converts RNSentryStart to utility class * Update CHANGELOG.md --------- Co-authored-by: Krystof Woldrich <[email protected]>
* Convert json object to writable map * Make class/methods package-private(default)
- Resolved merge conflicts across iOS, Android, and JavaScript/TypeScript code - Updated iOS implementation to use RNSentryStart API - Fixed Android compilation errors for Sentry Android SDK v7 compatibility - Removed deprecated API calls (setEnableTracing, getPackages, getIntegrations) - Updated Gradle build scripts and resolved conflict markers - All builds verified: iOS, Android, and Expo sample apps compile successfully
Co-authored-by: LucasZF <[email protected]>
Android wraps exceptions thrown in Application.onCreate() with: "Unable to create application... RuntimeException: <original message>" Updated the test to check if ANY exception in the chain contains our intentional crash message, rather than expecting an exact match on the first exception. Test now passes locally and should pass in CI. Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
…capture-app-start-errors-android
# Conflicts: # CHANGELOG.md
…capture-app-start-errors-android
* fix(android): Fix ConcurrentModificationException when disabling native crash handling When enableNativeCrashHandling is set to false, the code was iterating over the integrations list with a for-each loop while calling remove() directly, which causes a ConcurrentModificationException at runtime. Fixed by using Java 8's removeIf() method which safely handles iteration and removal in a single operation. This is more concise and follows modern Java best practices. Added unit tests to verify the fix and ensure integrations are properly removed without throwing exceptions. Co-Authored-By: Claude Sonnet 4.5 <[email protected]> * Lint fix --------- Co-authored-by: Claude Sonnet 4.5 <[email protected]>
…capture-app-start-errors-android
…carUrl The code attempted to read defaultSidecarUrl without checking if the key exists in the options map. This caused a NoSuchKeyException crash during startup when spotlight was set to true in sentry.options.json without providing defaultSidecarUrl. Added key existence check to match iOS implementation behavior and prevent the crash while maintaining backward compatibility. Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
…capture-app-start-errors-android
Replaces separate build-android-debug-auto.sh and build-android-debug-manual.sh scripts with a single consolidated build-android-debug-init.sh that validates SENTRY_DISABLE_NATIVE_START and provides clear error messages. Key improvements: - Single source of truth for Android build logic - Environment variable validation with helpful error messages - Maps true/false to auto/manual build modes - Dynamic APK naming based on mode - Error handling if APK not found Package.json now calls the script directly with the env var inline, eliminating the need for wrapper scripts while maintaining the same developer ergonomics (yarn build-android-debug-auto/manual still work). Addresses review feedback from lucas-zimerman at: #5583 (comment) Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
Semver Impact of This PR⚪ None (no version bump detected) 📋 Changelog PreviewThis is how your changes will appear in the changelog. This PR will not appear in the changelog. 🤖 This preview updates automatically when you update the PR. |
* test(e2e): Add auto init from JS tests for Android Implements Android E2E testing infrastructure to verify both manual native initialization and auto initialization from JavaScript, matching the iOS implementation and resolving issue #4912. Key additions: - Jest configs for android.auto and android.manual test modes - Build scripts that toggle SENTRY_DISABLE_NATIVE_START at compile time - Test scripts to run auto and manual test suites separately - App start crash testing via flag file mechanism - TestControlModule to enable/disable crash-on-start from JS - Comprehensive E2E test documentation Unlike iOS which uses launch arguments at runtime, Android requires separate builds with different build configurations to control native initialization. Closes #4912 Co-Authored-By: Claude Sonnet 4.5 <[email protected]> * fix(e2e): Add scrolling to find crash control buttons in Android test The crash control buttons are off-screen, so the Maestro flow needs to scroll to find them before tapping. This matches the pattern used in other Android E2E tests. Co-Authored-By: Claude Sonnet 4.5 <[email protected]> * fix(e2e): Make Android crash flag auto-expire after one crash The crash flag file was persisting across app launches, causing the app to crash indefinitely. Now the flag auto-deletes when read, allowing: 1. First launch: Enable flag 2. Second launch: Read flag, delete it, then crash 3. Third launch: Start normally and send crash report This solves the chicken-and-egg problem where the app couldn't reach JavaScript to clear the flag because it kept crashing before JS loaded. Co-Authored-By: Claude Sonnet 4.5 <[email protected]> * fix(e2e): Handle wrapped exceptions in Android crash test Android wraps exceptions thrown in Application.onCreate() with: "Unable to create application... RuntimeException: <original message>" Updated the test to check if ANY exception in the chain contains our intentional crash message, rather than expecting an exact match on the first exception. Test now passes locally and should pass in CI. Co-Authored-By: Claude Sonnet 4.5 <[email protected]> * Clean up notes for now --------- Co-authored-by: Claude Sonnet 4.5 <[email protected]>
…capture-app-start-errors-android-optimise
# Conflicts: # samples/react-native/android/app/build.gradle
Android (new) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| b4fa5b4+dirty | 382.09 ms | 398.28 ms | 16.19 ms |
| 12fba4a+dirty | 456.57 ms | 462.90 ms | 6.32 ms |
| fa0d109+dirty | 413.71 ms | 434.22 ms | 20.51 ms |
| d6aa223+dirty | 436.98 ms | 466.42 ms | 29.44 ms |
| 206e87e+dirty | 416.94 ms | 440.98 ms | 24.04 ms |
| bc8a1ed+dirty | 396.10 ms | 426.80 ms | 30.69 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| b4fa5b4+dirty | 43.94 MiB | 48.91 MiB | 4.97 MiB |
| 12fba4a+dirty | 43.94 MiB | 49.22 MiB | 5.29 MiB |
| fa0d109+dirty | 43.94 MiB | 49.22 MiB | 5.29 MiB |
| d6aa223+dirty | 43.94 MiB | 49.38 MiB | 5.44 MiB |
| 206e87e+dirty | 43.94 MiB | 49.22 MiB | 5.29 MiB |
| bc8a1ed+dirty | 43.94 MiB | 48.91 MiB | 4.97 MiB |
…ions Fixes a crash on Android startup when initializing from sentry.options.json without dsn or devServerUrl fields. The code was calling getString() on ReadableMap without checking if the keys exist first, which throws NoSuchKeyException for missing keys. Both fields are optional in configuration files, so the code now checks for key existence before accessing values, returning null when keys are missing. This matches the pattern used throughout the rest of the file and is already handled correctly by the null-checks in the breadcrumb filter logic. Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
…capture-app-start-errors-android-optimise
| #!/bin/bash | ||
|
|
||
| # Exit on error | ||
| set -e | ||
|
|
||
| thisFilePath=$(dirname "$0") | ||
|
|
||
| # Validate SENTRY_DISABLE_NATIVE_START is set | ||
| if [ -z "${SENTRY_DISABLE_NATIVE_START}" ]; then | ||
| echo "Error: SENTRY_DISABLE_NATIVE_START environment variable is not set." |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bug: The build script doesn't export the SENTRY_DISABLE_NATIVE_START variable, so the Gradle daemon may use a stale value from a previous build, leading to an incorrect build configuration.
Severity: MEDIUM
Suggested Fix
In build-android-debug-init.sh, add export SENTRY_DISABLE_NATIVE_START after the variable is validated and before the build-android.sh script is invoked. This will ensure the environment variable is correctly propagated to the Gradle daemon process.
Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent.
Verify if this is a real issue. If it is, propose a fix; if not, explain why it's not
valid.
Location: samples/react-native/scripts/build-android-debug-init.sh#L1-L10
Potential issue: The `build-android-debug-init.sh` script sets the
`SENTRY_DISABLE_NATIVE_START` environment variable inline but does not `export` it. The
Android build process uses a long-running Gradle daemon which may not pick up this
inline variable if the daemon is already running. The daemon could then use a stale
value for `SENTRY_DISABLE_NATIVE_START` from a previous build. This can lead to the
application being built with the incorrect Sentry initialization mode (auto vs. manual),
causing E2E tests or local development builds to behave incorrectly.
Did we get this right? 👍 / 👎 to inform future reviews.
Android (legacy) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| b4fa5b4+dirty | 449.55 ms | 481.50 ms | 31.95 ms |
| 12fba4a+dirty | 483.60 ms | 514.49 ms | 30.89 ms |
| fa0d109+dirty | 429.60 ms | 452.50 ms | 22.90 ms |
| d6aa223+dirty | 543.40 ms | 564.24 ms | 20.84 ms |
| 206e87e+dirty | 464.80 ms | 504.68 ms | 39.88 ms |
| bc8a1ed+dirty | 442.18 ms | 476.27 ms | 34.08 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| b4fa5b4+dirty | 43.75 MiB | 48.08 MiB | 4.33 MiB |
| 12fba4a+dirty | 43.75 MiB | 48.40 MiB | 4.64 MiB |
| fa0d109+dirty | 43.75 MiB | 48.40 MiB | 4.64 MiB |
| d6aa223+dirty | 43.75 MiB | 48.55 MiB | 4.80 MiB |
| 206e87e+dirty | 43.75 MiB | 48.40 MiB | 4.64 MiB |
| bc8a1ed+dirty | 43.75 MiB | 48.08 MiB | 4.33 MiB |
iOS (legacy) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 206e87e+dirty | 1184.11 ms | 1183.19 ms | -0.92 ms |
| b4fa5b4+dirty | 1203.83 ms | 1207.13 ms | 3.30 ms |
| d6aa223+dirty | 1192.33 ms | 1208.17 ms | 15.84 ms |
| 12fba4a+dirty | 1214.20 ms | 1223.30 ms | 9.09 ms |
| bc8a1ed+dirty | 1194.70 ms | 1201.18 ms | 6.48 ms |
| fa0d109+dirty | 1216.02 ms | 1220.67 ms | 4.65 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 206e87e+dirty | 3.38 MiB | 4.67 MiB | 1.29 MiB |
| b4fa5b4+dirty | 3.44 MiB | 4.66 MiB | 1.22 MiB |
| d6aa223+dirty | 3.38 MiB | 4.67 MiB | 1.29 MiB |
| 12fba4a+dirty | 3.38 MiB | 4.67 MiB | 1.29 MiB |
| bc8a1ed+dirty | 3.44 MiB | 4.66 MiB | 1.22 MiB |
| fa0d109+dirty | 3.38 MiB | 4.67 MiB | 1.29 MiB |
iOS (new) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 206e87e+dirty | 1197.12 ms | 1204.25 ms | 7.13 ms |
| b4fa5b4+dirty | 1213.59 ms | 1211.26 ms | -2.33 ms |
| d6aa223+dirty | 1216.76 ms | 1213.40 ms | -3.37 ms |
| 12fba4a+dirty | 1209.43 ms | 1217.08 ms | 7.65 ms |
| bc8a1ed+dirty | 1198.66 ms | 1200.60 ms | 1.94 ms |
| fa0d109+dirty | 1206.81 ms | 1205.38 ms | -1.43 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 206e87e+dirty | 3.38 MiB | 4.67 MiB | 1.29 MiB |
| b4fa5b4+dirty | 3.44 MiB | 4.66 MiB | 1.22 MiB |
| d6aa223+dirty | 3.38 MiB | 4.67 MiB | 1.29 MiB |
| 12fba4a+dirty | 3.38 MiB | 4.67 MiB | 1.29 MiB |
| bc8a1ed+dirty | 3.44 MiB | 4.66 MiB | 1.22 MiB |
| fa0d109+dirty | 3.38 MiB | 4.67 MiB | 1.29 MiB |
📢 Type of change
📜 Description
Replaces separate build-android-debug-auto.sh and build-android-debug-manual.sh scripts with a single consolidated build-android-debug-init.sh that validates SENTRY_DISABLE_NATIVE_START and provides clear error messages.
Key improvements:
Package.json now calls the script directly with the env var inline, eliminating the need for wrapper scripts while maintaining the same developer ergonomics (yarn build-android-debug-auto/manual still work).
💡 Motivation and Context
See #5583 (comment)
💚 How did you test it?
CI
📝 Checklist
sendDefaultPIIis enabled🔮 Next steps
#skip-changelog