Skip to content

[Android] TTID (Time to Initial Display) is never emitted on Android despite native initialization and v3 SDK upgrade #1314

Open

Description

@nht-spect

Describe the bug

After upgrading @datadog/mobile-react-native from 2.14.1 to 3.5.1 (which embeds dd-sdk-android:3.10.0) to unlock Mobile Vitals/TTID metrics, Android TTID (time_to_initial_display) is completely missing / never emitted.

iOS TTID works flawlessly out of the box. On Android, while initial native views (ApplicationLaunch + MainActivity) are correctly created and other mobile vitals like slow_frames / frozen_frames are streaming normally, the core time_to_initial_display attribute remains persistently absent.

Reproduction steps

  1. Setup an Expo project using SDK 51+ with @datadog/mobile-react-native v3.5.1.
  2. Initialize the Datadog SDK natively inside MainApplication.onCreate using an Expo Config Plugin before the React Native bridge starts.
  3. Configure Datadog with nativeViewTracking: true and the new V3 FileBasedConfiguration.
  4. Build the Android app locally or via EAS (eas build --profile production --platform android --local).
  5. Open the app on an Android device, trigger initial views, and inspect the RUM Explorer via Datadog dashboard.

SDK logs

Expected behavior

According to the Datadog documentation, once native initialization is properly configured before the RN runtime starts, the Android SDK should capture the application launch lifecycle and emit the time_to_initial_display metric for the initial view.

Affected SDK versions

3.5.1

Latest working SDK version

None (Upgraded from 2.14.1 which did not support this feature)

Did you confirm if the latest SDK version fixes the bug?

Yes

Integration Methods

NPM

React Native Version

0.85.3

Package.json Contents

{
"name": "x-mobile",
"version": "0.1.44",
"private": true,
"main": "expo-router/entry",
"dependencies": {
"@datadog/mobile-react-native": "3.5.1",
"expo": "56.0.8",
"expo-router": "56.2.8",
"react": "19.2.3",
"react-native": "0.85.3"
},
"packageManager": "pnpm@11.1.2"
}

iOS Setup

Android Setup

Using Expo Managed Workflow. The native setup is dynamically injected via a custom Expo Config Plugin (withDatadogNativeInit.ts) that adds the required Datadog native initialization code directly into MainApplication.onCreate before the React Native host starts.

Device Information

  • Device: Samsung Galaxy S25 Ultra (SM-S938B)
  • OS Version: Android 15
  • Network State: Wifi / Cellular

Other relevant information

Summary of the current behavior observed via Datadog RUM (MCP):

Category iOS Android
View Tracking (ApplicationLaunch / MainActivity) ✅ Success ✅ Success
Mobile Vitals (slow_frames / frozen_frames) ✅ Success ✅ Success
time_to_initial_display (TTID) ✅ Success ❌ Never Emitted

Additional Findings:

We noticed that while the underlying dd-sdk-android (v3.10.0) contains multiple upstream TTID fixes (such as #2921, #3031, #3173, #3199), the issue seems to stem from how the React Native wrapper layer interacts with or consumes these native events during startup in a modern React 19 / architecture context.

This looks highly related to the auto-closed issue #1214 where a similar gap was reported but closed due to inactivity without explicit confirmation of a fix.

Activity

  1. sbarrio commented on Jun 22, 2026

    @sbarrio
    Collaborator

    Hi @nht-spect, thanks for reaching out.

    TTID and TTFD are not yet officially supported on the Datadog RN SDK. TTID works on iOS by default as it is due to how it operates on the native iOS SDK, but the SDK is not yet prepared to support it on Android when initializing the SDK from JS/TS.
    This feature is already in our pipeline and actively being worked on, so it will be added to the SDK shortly.

    However, it should work when initializing the SDK natively as you mention. Can you please share a bit more about your setup?, or perhaps a minimum reproduction sample app?, it would be particularly interesting to see how and when you are performing the native initialization.

    Thanks again 🙇

  2. hoangman1108 commented on Jun 22, 2026

    @hoangman1108

    @sbarrio, is there any legacy version that supports TTID and TTFD for android devices?

  3. sbarrio commented on Jun 22, 2026

    @sbarrio
    Collaborator

    @sbarrio, is there any legacy version that supports TTID and TTFD for android devices?

    No, TTID and TTFD is a new feature for v3 only. Since it was recently added to the native SDKs the RN SDK is still playing catch up.

  4. binhnguyen-moonbase commented on Jun 22, 2026

    @binhnguyen-moonbase

    Hi @sbarrio, we're seeing the same Android TTID gap on @datadog/mobile-react-native@3.5.1 (bundled natives: iOS 3.11.0, Android 3.10.0), RN 0.85.3, Expo 56.

    Native init (Android): Expo config plugin injects DdSdkNativeInitialization.initFromNative(this.applicationContext) right after super.onCreate() in MainApplication, and writes datadog-configuration.json to app assets at prebuild. JS uses FileBasedConfiguration with the same config, including nativeViewTracking: true. iOS is JS-only (TTID works there).

    Observed in RUM:

    • ✅ ApplicationLaunch / MainActivity views on Android
    • ✅ slow_frames / frozen_frames on Android
    • ❌ @vital.name:time_to_initial_display never emitted on Android (works on iOS)

    Questions:

    1. When JS init runs after native init, does the second datadog.initialize() + Rum.enable() discard the TTID measurement from process launch?
    2. Is Android TTID expected to work on 3.5.1 with native init, or is RN-wrapper support still pending?

    Any guidance on whether this is a known RN-wrapper limitation vs. something misconfigured on our side would be very helpful. Thanks 🙇!

  5. sbarrio commented on Jun 23, 2026

    @sbarrio
    Collaborator

    Hi @binhnguyen-moonbase,

    Again, and as mentioned above, TTID and TTFD are not yet supported by the RN SDK. We are currently implementing it and will be released in a future release soon. What you are seeing is the native iOS/Android SDKs reporting their own TTID calculations, which show up on iOS but not on Android (unless native initialization of the RN SDK takes place early enough). This is not the expected

    When JS init runs after native init, does the second datadog.initialize() + Rum.enable() discard the TTID measurement from process launch?

    The JS layer and the RN SDK do not alter the TTID calculation in any way at the moment. What you see is being tracked by the native SDK alone.

    Is Android TTID expected to work on 3.5.1 with native init, or is RN-wrapper support still pending?
    No, it will be supported properly in the near future.

  6. binhnguyen-moonbase commented on Jun 23, 2026

    @binhnguyen-moonbase

    Hi @sbarrio, thanks for the response!

    However, it should work when initializing the SDK natively as you mention. Can you please share a bit more about your setup?,

    I'm a bit confused by this comment. My understanding is that you're saying it should work on Android if the SDK is initialized natively, even when using the React Native SDK. That's actually how we're currently setting it up, as I described above.

    No, it will be supported properly in the near future.

    Above comment seems to contradict your latest reply here.

    Are you saying that it should work today only if we use the native Android SDK directly and initialize it ourselves, rather than using the React Native SDK and initilizing it natively? Or should it already work with the React Native SDK as long as the native initialization is done correctly?

  7. sbarrio commented on Jun 23, 2026

    @sbarrio
    Collaborator

    Hi @sbarrio, thanks for the response!

    However, it should work when initializing the SDK natively as you mention. Can you please share a bit more about your setup?,

    I'm a bit confused by this comment. My understanding is that you're saying it should work on Android if the SDK is initialized natively, even when using the React Native SDK. That's actually how we're currently setting it up, as I described above.

    No, it will be supported properly in the near future.

    Above comment seems to contradict your latest reply here.

    Are you saying that it should work today only if we use the native Android SDK directly and initialize it ourselves, rather than using the React Native SDK and initilizing it natively? Or should it already work with the React Native SDK as long as the native initialization is done correctly?

    Sorry, I may not have been clear enough before.

    So, TTID and TTFD are not yet officially supported on React Native apps using the Datadog RN SDK.

    However, the native Datadog SDKs already introduced this, and as every other metric tracked by them it is being reported for React Native apps, and being shown on the Datadog Dashboard whenever available.

    The problem here is that this was not properly linked with React Native, so the support is inconsistent on React Native apps at the moment, and not how this feature will look like once we properly support the feature at RN level.

    On iOS, due to how the feature is built it works without any other tweak nor specific configuration from RN.
    On Android, for most apps initializing from JS it should not report the metric, as this feature relies on the SDK being initialized very early on the app lifecycle, which most apps using JS instrumentation on RN won't do. However, if for some reason the host app integrating the SDK relies on native initialization (as you have reported happens on your apps), and such initialization is carried early enough, TTID may be being tracked through the native SDK's normal flow. Since this is known to work, and since you were reporting problems on that specific scenario I was asking for more information on your specific issue, to be able to debug it properly.

    So, in summary, the feature is not yet properly supported on RN. IMHO it should still not even be reported on the Dashboard to avoid confusion, but since there's a specific case on which it does report values on Android I wanted to get the full picture to better understand the situation, as it may suppose a real problem on Expo-based apps which will affect the real implementation of the feature on RN.

    Hope that made it a bit more clear 🙇

  8. binhnguyen-moonbase commented on Jun 23, 2026

    @binhnguyen-moonbase

    Thanks @sbarrio for clarifying. Would you be able to share a rough ETA (or target release) for proper TTID/TTFD support in this React Native sdk, especially on Android? Even a quarter-level estimate would help us decide whether to wait for the official RN integration or invest further in workaround metrics on our side.

  9. sbarrio commented on Jun 24, 2026

    @sbarrio
    Collaborator

    @binhnguyen-moonbase We can't share anything too specific, but the aim is to release this at some point during Q3.

  10. added
    enhancementNew feature or request
    and removed
    bugSomething isn't working
    on Jul 13, 2026
  11. szarbartosz commented on Aug 18, 2026

    @szarbartosz

    Hey @sbarrio, just checking if DataDog/dd-sdk-android#3635 is the PR for Android TTID metric support discussed here? (Wanted to reference it here to track the RN SDK release date.)

  12. sbarrio commented on Aug 31, 2026

    @sbarrio
    Collaborator

    Hi @szarbartosz Indeed, that's the PR that will enable TTID reporting for the RN SDK. We'll need to get that merged (and released) first, and then this PR will enable the feature on the React Native SDK side.

    We'll keep you posted as soon as it releases, thanks for your patience 🙇

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions