Project Guide

Complete guide to the Datadog MAUI SDK project - architecture, structure, and current status.


Quick Navigation


Current Status

Project Created: January 15, 2026 SDK Version: 3.5.0 .NET Targets: 8, 9, 10 Platforms: iOS (12.0+), Android (API 21+)

βœ… Completed

Android Bindings: 13/13 packages building successfully

  • Core: dd-sdk-android-internal, dd-sdk-android-core
  • Features: logs, rum, trace, ndk, session-replay, webview, flags
  • Integrations: okhttp, trace-otel, okhttp-otel, gradle-plugin

Build System: Complete automation

  • Multi-framework targeting (net9.0/net10.0-android)
  • GitHub Actions workflows
  • Package combination scripts
  • Version management tools

Documentation: Comprehensive guides

  • Android dependency management
  • Build scripts and workflows
  • iOS binding strategy
  • Integration packages

🚧 In Progress

iOS Bindings: Scaffolded, implementing minimal manual bindings

  • Objective Sharpie generated 684 API types
  • Creating clean user-facing bindings (~250 lines vs 7,199)
  • Following opt-in approach

Unified API: Cross-platform MAUI plugin

  • Design complete ()
  • Implementation pending iOS bindings

🎯 Next Steps

  1. Complete iOS minimal bindings
  2. Implement cross-platform MAUI plugin wrapper
  3. Expand sample app to demonstrate all features
  4. NuGet package publishing

Architecture

High-Level Design

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         Datadog.MAUI (Main Plugin - Future)       β”‚
β”‚  - Cross-platform interfaces (IDatadogSdk)        β”‚
β”‚  - Configuration (DatadogConfiguration)           β”‚
β”‚  - Static entry point (DatadogSdk)                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚                 β”‚
      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”
      β”‚  Android       β”‚  β”‚  iOS          β”‚
      β”‚  Platform      β”‚  β”‚  Platform     β”‚
      β”‚  (13 packages) β”‚  β”‚  (In progress)β”‚
      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Component Breakdown

1. Android Bindings (Datadog.MAUI.Android.Binding)

Modular Architecture: 13 separate NuGet packages

Core Packages (2):

  • Datadog.MAUI.Android.Internal - Internal utilities
  • Datadog.MAUI.Android.Core - Core SDK functionality, initialization

Feature Packages (7):

  • Datadog.MAUI.Android.Logs - Logging functionality
  • Datadog.MAUI.Android.RUM - Real User Monitoring
  • Datadog.MAUI.Android.Trace - APM tracing
  • Datadog.MAUI.Android.NDK - Native crash reporting
  • Datadog.MAUI.Android.SessionReplay - Session replay
  • Datadog.MAUI.Android.WebView - WebView tracking
  • Datadog.MAUI.Android.Flags - Feature flags

Integration Packages (4):

  • Datadog.MAUI.Android.OkHttp - OkHttp instrumentation
  • Datadog.MAUI.Android.Trace.OpenTelemetry - OTel integration
  • Datadog.MAUI.Android.OkHttp.OpenTelemetry - OkHttp + OTel
  • Datadog.MAUI.Android.GradlePlugin - Build-time tools

Dependency Pattern: Centralized core

  • Core provides shared dependencies (Gson, Kotlin, AndroidX)
  • Features reference core via ProjectReference
  • Features declare AndroidIgnoredJavaDependency for shared deps

2. iOS Bindings (Datadog.MAUI.iOS.Binding)

Status: In progress - implementing minimal manual bindings

Approach: Opt-in (expose only user-facing APIs)

  • Generated bindings: 7,199 lines (294 interfaces)
  • Manual bindings: ~250 lines (3 essential interfaces)
  • Covers 100% of user needs with 97% less code

Frameworks (8):

  • DatadogCore - SDK initialization
  • DatadogRUM - RUM monitoring
  • DatadogLogs - Logging
  • DatadogTrace - Tracing
  • DatadogSessionReplay - Session replay
  • DatadogCrashReporting - Crash reports
  • DatadogWebViewTracking - WebView tracking
  • DatadogInternal - Internal utilities

3. Main Plugin (Datadog.MAUI.Plugin)

Status: Design complete, implementation pending

Purpose: Cross-platform abstraction layer

Features:

  • Unified API across iOS and Android
  • Dependency injection support
  • Configuration builder pattern
  • Platform-specific implementations

Directory Structure

dd-sdk-maui/
β”œβ”€β”€ Datadog.MAUI.Android.Binding/   # Android native bindings (13 packages)
β”‚   β”œβ”€β”€ dd-sdk-android-internal/
β”‚   β”œβ”€β”€ dd-sdk-android-core/
β”‚   β”œβ”€β”€ dd-sdk-android-logs/
β”‚   β”œβ”€β”€ dd-sdk-android-rum/
β”‚   β”œβ”€β”€ dd-sdk-android-trace/
β”‚   β”œβ”€β”€ dd-sdk-android-ndk/
β”‚   β”œβ”€β”€ dd-sdk-android-session-replay/
β”‚   β”œβ”€β”€ dd-sdk-android-webview/
β”‚   β”œβ”€β”€ dd-sdk-android-flags/
β”‚   β”œβ”€β”€ dd-sdk-android-okhttp/        # Integration packages
β”‚   β”œβ”€β”€ dd-sdk-android-trace-otel/
β”‚   β”œβ”€β”€ dd-sdk-android-okhttp-otel/
β”‚   β”œβ”€β”€ dd-sdk-android-gradle-plugin/
β”‚   └── Datadog.MAUI.Android.Binding.csproj  # Meta-package
β”‚
β”œβ”€β”€ Datadog.MAUI.iOS.Binding/       # iOS native bindings (in progress)
β”‚   β”œβ”€β”€ DatadogCore/
β”‚   β”œβ”€β”€ DatadogRUM/
β”‚   β”œβ”€β”€ DatadogLogs/
β”‚   β”œβ”€β”€ DatadogTrace/
β”‚   β”œβ”€β”€ DatadogSessionReplay/
β”‚   β”œβ”€β”€ DatadogCrashReporting/
β”‚   └── DatadogWebViewTracking/
β”‚
β”œβ”€β”€ Datadog.MAUI.Plugin/            # Cross-platform plugin (planned)
β”‚   β”œβ”€β”€ Datadog.MAUI.Plugin.csproj
β”‚   β”œβ”€β”€ IDatadogSdk.cs
β”‚   β”œβ”€β”€ DatadogConfiguration.cs
β”‚   β”œβ”€β”€ Platforms/
β”‚   β”‚   β”œβ”€β”€ Android/
β”‚   β”‚   └── iOS/
β”‚   └── README.md
β”‚
β”œβ”€β”€ samples/DatadogMauiSample/      # Sample application
β”‚   β”œβ”€β”€ DatadogMauiSample.csproj
β”‚   β”œβ”€β”€ MauiProgram.cs
β”‚   β”œβ”€β”€ Platforms/
β”‚   β”‚   β”œβ”€β”€ Android/
β”‚   β”‚   └── iOS/
β”‚   └── README.md
β”‚
β”œβ”€β”€ scripts/                        # Build and automation scripts
β”‚   β”œβ”€β”€ pack.sh                    # Master build script
β”‚   β”œβ”€β”€ map-maven-to-nuget.sh     # Dependency mapping
β”‚   β”œβ”€β”€ validate-android-artifacts.sh
β”‚   β”œβ”€β”€ check-nuget-versions.sh
β”‚   └── update-sdk-version.sh
β”‚
β”œβ”€β”€ .github/workflows/              # CI/CD pipelines
β”‚   β”œβ”€β”€ build-all.yml              # Master workflow
β”‚   β”œβ”€β”€ build-android.yml          # Android-specific
β”‚   β”œβ”€β”€ build-ios.yml              # iOS-specific
β”‚   β”œβ”€β”€ publish-to-nuget.yml       # Package publishing
β”‚   └── check-sdk-updates.yml      # Version monitoring
β”‚
β”œβ”€β”€ docs/                           # Documentation
β”‚   β”œβ”€β”€ README.md                  # Documentation index
β”‚   β”œβ”€β”€ PROJECT_GUIDE.md           # This file
β”‚   β”œβ”€β”€ ANDROID_DEPENDENCIES.md    # Android dependency guide
β”‚   β”œβ”€β”€ ANDROID_INTEGRATION_PACKAGES.md
β”‚   β”œβ”€β”€ IOS_BINDING_STRATEGY.md
β”‚   β”œβ”€β”€ SCRIPTS_OVERVIEW.md
β”‚   β”œβ”€β”€ WORKFLOW_ARCHITECTURE.md
β”‚   β”œβ”€β”€ PACKAGING_ARCHITECTURE.md
β”‚   └── _reference/                # Historical docs
β”‚
β”œβ”€β”€ Directory.Build.props           # Centralized MSBuild properties
β”œβ”€β”€ Directory.Packages.props        # Centralized NuGet versions
β”œβ”€β”€ global.json                     # .NET SDK version pinning
β”œβ”€β”€ NuGet.Config                    # NuGet configuration
└── README.md                       # Main project README

Build System

Package Structure

3-Tier Architecture:

  1. Module Packages - Individual binding packages
  2. Meta Packages - Dependency-only packages (Datadog.MAUI.Android.Binding)
  3. Main Plugin - Cross-platform wrapper (future)

Build Process

Local Build:

./scripts/pack.sh

What happens:

  1. Builds all Android modules in dependency order
  2. Packs into NuGet packages (.nupkg)
  3. Places in ./artifacts/ directory
  4. Supports multi-framework targeting

CI/CD Pipeline:

  1. build-android.yml - Builds Android packages
    • Separate builds for net9.0-android and net10.0-android
    • Combines into multi-framework packages
    • Tests with sample app
  2. build-ios.yml - Builds iOS packages (planned)
  3. build-all.yml - Master orchestrator
  4. publish-to-nuget.yml - Publishes to NuGet.org

Version Management

Centralized in Directory.Build.props:

<DatadogSdkVersion>3.5.0</DatadogSdkVersion>
<PackageVersion>3.5.0</PackageVersion>

Centralized in Directory.Packages.props:

<PackageVersion Include="Xamarin.Kotlin.StdLib" Version="2.3.0.1" />
<PackageVersion Include="GoogleGson" Version="2.11.0" />

Update Process:

./scripts/update-sdk-version.sh 3.6.0

Technical Decisions

1. Modular Package Architecture

Decision: Create separate NuGet packages for each feature

Rationale:

  • Users opt-in to features they need
  • Smaller app size (no unused code)
  • Matches upstream SDK structure
  • Easier to maintain and update

Alternative Considered: Single β€œfat” package with everything

Why Not: Bloats app size, forces users to include unused features


2. AndroidMavenLibrary vs Manual AARs

Decision: Use AndroidMavenLibrary for automatic Maven downloads

Rationale:

  • Automatic transitive dependency resolution
  • No manual AAR management
  • Easier to update versions
  • Standard .NET Android approach

Alternative Considered: Manually download and embed AARs

Why Not: Manual process, harder to maintain, no dependency resolution


3. Centralized Dependency Management

Decision: Core provides shared dependencies, features consume

Rationale:

  • Prevents duplicate Java classes
  • Single source of truth for versions
  • Transitive via ProjectReference
  • Avoids D8/R8 compilation errors

Alternative Considered: Each module manages its own dependencies

Why Not: Causes duplicate class errors, version conflicts


4. Directory.Packages.props for Versions

Decision: Central Package Management (CPM) for all NuGet versions

Rationale:

  • Single file for all version numbers
  • Prevents version conflicts
  • Easier to audit and update
  • MSBuild best practice

Alternative Considered: Versions in each .csproj

Why Not: Hard to maintain consistency, prone to conflicts


5. iOS Minimal Manual Bindings

Decision: Create clean user-facing bindings, not fix all generated code

Rationale:

  • 97% less code (250 lines vs 7,199)
  • Exposes only what users need
  • Easier to document and maintain
  • Follows opt-in philosophy

Alternative Considered: Fix all 42 errors in Objective Sharpie output

Why Not: Exposes 97% internal APIs, high maintenance burden


Key Metrics

Android Bindings

  • Packages: 13 (2 core + 7 features + 4 integrations)
  • Target Frameworks: net9.0-android, net10.0-android
  • Build Status: 0 errors, 0 warnings (critical)
  • Maven Artifacts: Automatically downloaded
  • Shared Dependencies: 3 (Gson, Kotlin, Annotations)

iOS Bindings

  • Frameworks: 8 (Core, RUM, Logs, Trace, SessionReplay, CrashReporting, WebView, Internal)
  • Target Frameworks: net8.0-ios, net9.0-ios, net10.0-ios (planned)
  • Generated Code: 684 types (7,199 lines) β†’ Manual: 3 types (~250 lines)
  • Coverage: 100% of user-facing APIs

Build System

  • Scripts: 10 automation scripts
  • Workflows: 6 GitHub Actions workflows
  • Build Time: ~5 minutes (first), ~2 minutes (cached)
  • Artifacts: .nupkg packages in ./artifacts/


Last Updated: 2026-01-20