From 4b6551d94f2cf303ac374d9ed9442e11f6d17832 Mon Sep 17 00:00:00 2001 From: luyi Date: Mon, 22 Sep 2025 15:39:30 +0200 Subject: [PATCH] RUM-11830: Create profiling module --- CONTRIBUTING.md | 1 + ci/pipelines/default-pipeline.yml | 18 ++++ features/dd-sdk-android-profiling/.gitignore | 18 ++++ .../dd-sdk-android-profiling/build.gradle.kts | 91 +++++++++++++++++++ .../datadog/android/profiling/Profiling.kt | 14 +++ local_ci.sh | 1 + settings.gradle.kts | 1 + 7 files changed, 144 insertions(+) create mode 100644 features/dd-sdk-android-profiling/.gitignore create mode 100644 features/dd-sdk-android-profiling/build.gradle.kts create mode 100644 features/dd-sdk-android-profiling/src/main/java/com/datadog/android/profiling/Profiling.kt diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 32a585dc05..589a7c825f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,6 +37,7 @@ This project hosts the following modules: - `features/dd-sdk-android-trace-internal`: a library containing internal classes for the Trace library; - `features/dd-sdk-android-trace-otel`: an extension of Trace library to integrate with [OpenTelemetry](https://opentelemetry.io/); - `features/dd-sdk-android-webview`: a library to forward logs and RUM events captured in a webview to be linked with the mobile session; + - `features/dd-sdk-android-profiling`: a library to record application performance profiles; - `integrations/***`: a set of libraries integrating Datadog products in third party libraries: - `integrations/dd-sdk-android-coil`: a lightweight library providing a bridge integration between Datadog SDK and [Coil](https://coil-kt.github.io/coil/); - `integrations/dd-sdk-android-compose`: a lightweight library providing a bridge integration between Datadog SDK and [Jetpack Compose](https://developer.android.com/jetpack/compose); diff --git a/ci/pipelines/default-pipeline.yml b/ci/pipelines/default-pipeline.yml index 5b4d41d096..34e4f34bc9 100644 --- a/ci/pipelines/default-pipeline.yml +++ b/ci/pipelines/default-pipeline.yml @@ -112,6 +112,7 @@ analysis:detekt-custom: - ./gradlew :features:dd-sdk-android-trace:customDetektRules - ./gradlew :features:dd-sdk-android-trace-otel:customDetektRules - ./gradlew :features:dd-sdk-android-webview:customDetektRules + - ./gradlew :features:dd-sdk-android-profiling:customDetektRules - ./gradlew :integrations:dd-sdk-android-coil:customDetektRules - ./gradlew :integrations:dd-sdk-android-compose:customDetektRules - ./gradlew :integrations:dd-sdk-android-fresco:customDetektRules @@ -714,6 +715,22 @@ publish:release-webview: paths: - features/dd-sdk-android-webview/verification-metadata.xml +publish:release-profiling: + tags: [ "arch:amd64" ] + only: + - tags + - develop + image: $CI_IMAGE_DOCKER + stage: publish + timeout: 30m + script: + - !reference [.snippets, set-publishing-credentials] + - ./gradlew :features:dd-sdk-android-profiling:publishToSonatype closeSonatypeStagingRepository --stacktrace --no-daemon + artifacts: + when: on_success + expire_in: 7 days + paths: + - features/dd-sdk-android-profiling/verification-metadata.xml # endregion # region Publish integrations/* @@ -1051,6 +1068,7 @@ notify:merge-verification-metadata: - publish:release-session-replay-material - publish:release-session-replay-compose - publish:release-webview + - publish:release-profiling - publish:release-coil - publish:release-compose - publish:release-fresco diff --git a/features/dd-sdk-android-profiling/.gitignore b/features/dd-sdk-android-profiling/.gitignore new file mode 100644 index 0000000000..e5614b9871 --- /dev/null +++ b/features/dd-sdk-android-profiling/.gitignore @@ -0,0 +1,18 @@ +# Built application files +*.apk +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +build/ diff --git a/features/dd-sdk-android-profiling/build.gradle.kts b/features/dd-sdk-android-profiling/build.gradle.kts new file mode 100644 index 0000000000..f7ca4aa7e1 --- /dev/null +++ b/features/dd-sdk-android-profiling/build.gradle.kts @@ -0,0 +1,91 @@ +import com.datadog.gradle.config.androidLibraryConfig +import com.datadog.gradle.config.dependencyUpdateConfig +import com.datadog.gradle.config.detektCustomConfig +import com.datadog.gradle.config.javadocConfig +import com.datadog.gradle.config.junitConfig +import com.datadog.gradle.config.kotlinConfig +import com.datadog.gradle.config.publishingConfig +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + // Build + id("com.android.library") + kotlin("android") + id("com.google.devtools.ksp") + + // Publish + `maven-publish` + signing + id("org.jetbrains.dokka-javadoc") + + // Analysis tools + id("com.github.ben-manes.versions") + + // Tests + id("de.mobilej.unmock") + id("org.jetbrains.kotlinx.kover") + + // Internal Generation + id("com.datadoghq.dependency-license") + id("apiSurface") + id("transitiveDependencies") + id("verificationXml") + id("binary-compatibility-validator") +} + +android { + namespace = "com.datadog.android.profiling" +} + +dependencies { + api(project(":dd-sdk-android-core")) + implementation(libs.kotlin) + + // Generate NoOp implementations + ksp(project(":tools:noopfactory")) + + testImplementation(project(":tools:unit")) { + attributes { + attribute( + com.android.build.api.attributes.ProductFlavorAttr.of("platform"), + objects.named("jvm") + ) + } + } + + testImplementation(libs.bundles.jUnit5) + testImplementation(libs.bundles.testTools) + unmock(libs.robolectric) +} + +unMock { + keep("android.os.BaseBundle") + keep("android.os.Bundle") + keep("android.os.Parcel") + keepStartingWith("com.android.internal.util.") + keepStartingWith("android.util.") + keep("android.content.ComponentName") + keep("android.content.ContentProvider") + keep("android.content.IContentProvider") + keep("android.content.ContentProviderNative") + keep("android.net.Uri") + keep("android.os.Handler") + keep("android.os.IMessenger") + keep("android.os.Looper") + keep("android.os.Message") + keep("android.os.MessageQueue") + keep("android.os.SystemProperties") + keep("android.view.DisplayEventReceiver") + keepStartingWith("org.json") +} + +kotlinConfig(jvmBytecodeTarget = JvmTarget.JVM_11) +androidLibraryConfig() +junitConfig() +javadocConfig() +dependencyUpdateConfig() +publishingConfig( + "The Profiling feature to use with the Datadog monitoring " + + "library for Android applications." +) +detektCustomConfig() diff --git a/features/dd-sdk-android-profiling/src/main/java/com/datadog/android/profiling/Profiling.kt b/features/dd-sdk-android-profiling/src/main/java/com/datadog/android/profiling/Profiling.kt new file mode 100644 index 0000000000..c33cf7c93b --- /dev/null +++ b/features/dd-sdk-android-profiling/src/main/java/com/datadog/android/profiling/Profiling.kt @@ -0,0 +1,14 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2016-Present Datadog, Inc. + */ + +package com.datadog.android.profiling + +/** + * An entry point to Datadog Profiling feature. + */ +object Profiling { + // TODO RUM-11831: Integrate Perfetto Profiling Manager API +} diff --git a/local_ci.sh b/local_ci.sh index 1aa4816048..dbbd1649f6 100755 --- a/local_ci.sh +++ b/local_ci.sh @@ -107,6 +107,7 @@ if [[ $CLEANUP == 1 ]]; then rm -rf features/dd-sdk-android-trace/build/ rm -rf features/dd-sdk-android-trace-otel/build/ rm -rf features/dd-sdk-android-webview/build/ + rm -rf features/dd-sdk-android-profiling/build/ rm -rf integrations/dd-sdk-android-coil/build/ rm -rf integrations/dd-sdk-android-compose/build/ rm -rf integrations/dd-sdk-android-fresco/build/ diff --git a/settings.gradle.kts b/settings.gradle.kts index 943e3fb541..c356dd964c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -20,6 +20,7 @@ include(":features:dd-sdk-android-session-replay") include(":features:dd-sdk-android-session-replay-compose") include(":features:dd-sdk-android-session-replay-material") include(":features:dd-sdk-android-trace-otel") +include(":features:dd-sdk-android-profiling") // INTEGRATION LIBRARIES include(":integrations:dd-sdk-android-coil")