Skip to content

Feature/jrc 4201.api.to.check.previous.anr.2#8110

Closed
jrodiz wants to merge 2 commits into
mainfrom
feature/jrc--4201.API.to.check.previous.ANR.2
Closed

Feature/jrc 4201.api.to.check.previous.anr.2#8110
jrodiz wants to merge 2 commits into
mainfrom
feature/jrc--4201.API.to.check.previous.ANR.2

Conversation

@jrodiz
Copy link
Copy Markdown
Contributor

@jrodiz jrodiz commented May 7, 2026

Add didANRKillOnPreviousExecution() to FirebaseCrashlytics

Implements #4201.

Background

Crashlytics already detects ANRs and files reports for them, and developers have long been able to call didCrashOnPreviousExecution() to gate logic that should only run after a fatal crash. However, there was no equivalent API for ANRs: developers who want to adapt their app's behavior after an ANR (e.g., disable a heavy feature on the next cold start, log a custom key, or show a recovery dialog) had no supported way to do so.

didCrashOnPreviousExecution() works by reading a marker file written at crash time. ANRs cannot use that mechanism because the main thread is frozen and the crash handler never runs. Instead, the new method uses ApplicationExitInfo (API 30+), which records process-exit reasons at the OS level — the same source already queried internally by SessionReportingCoordinator when filing ANR reports. The new API delegates to that existing infrastructure rather than introducing a separate detection path.

Risk

  • API surface: one new public method on FirebaseCrashlytics (didANRKillOnPreviousExecution()). No existing method signatures changed.
  • Behavior on API < 30: always returns false; no ApplicationExitInfo access attempted.
  • Behavior on API 30+: reads getHistoricalProcessExitReasons once at startup on the background thread with a bounded timeout. This is the sameActivityManager call already made by the ANR-reporting path; no new system service is introduced.
  • No dependency bumps, no public API removals, no migration required.

jrodiz added 2 commits May 7, 2026 15:08
Implements firebase-android-sdk#4201 by exposing a new public API method
that detects whether the app was killed by an ANR in the previous run,
mirroring the existing didCrashOnPreviousExecution() pattern.

On Android API 30+ the method queries ApplicationExitInfo (already used
internally for ANR session reporting) against the previous session's start
timestamp. On older API levels it always returns false.
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize the Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counterproductive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

@jrodiz
Copy link
Copy Markdown
Contributor Author

jrodiz commented May 7, 2026

/gemini review

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 7, 2026

📝 PRs merging into main branch

Our main branch should always be in a releasable state. If you are working on a larger change, or if you don't want this change to see the light of the day just yet, consider using a feature branch first, and only merge into the main branch when the code complete and ready to be released.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request adds the didANRKillOnPreviousExecution() method to FirebaseCrashlytics, allowing apps on Android API 30+ to detect if the previous run ended in an ANR. The implementation queries ActivityManager for historical process exit reasons during initialization. Reviewers suggested adding a null check for the ActivityManager service and logging exceptions during the ANR check to improve robustness and diagnosability.

Comment on lines +956 to +957
ActivityManager activityManager =
(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The getSystemService call can return null. It is safer to perform a null check on activityManager before calling getHistoricalProcessExitReasons to avoid a potential NullPointerException.

    ActivityManager activityManager =
        (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    if (activityManager == null) {
      return false;
    }
    List<ApplicationExitInfo> applicationExitInfoList =

Comment on lines +517 to +520
} catch (Exception ignored) {
didANROnPreviousExecution = false;
return;
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

While ignoring the exception is consistent with checkForPreviousCrash, it is generally better to log the error (at least at a verbose or debug level) to help diagnose why the ANR check might have failed or timed out.

Suggested change
} catch (Exception ignored) {
didANROnPreviousExecution = false;
return;
}
} catch (Exception ex) {
Logger.getLogger().v("Error checking for previous ANR: " + ex.getMessage());
didANROnPreviousExecution = false;
return;
}

@jrodiz jrodiz closed this May 7, 2026
jrodiz added a commit to jrodiz/firebase-android-sdk that referenced this pull request May 18, 2026
… log ANR check failures

- Add null guard on ActivityManager from getSystemService() before
  calling getHistoricalProcessExitReasons() to avoid potential NPE.
- Log exceptions in checkForPreviousAnr() at verbose level instead of
  silently ignoring them, to aid diagnosability.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant