diff --git a/coin/provisioning/common/shared/gradle/project/README.md b/coin/provisioning/common/shared/gradle/project/README.md
index e0f82ba6..e4841622 100644
--- a/coin/provisioning/common/shared/gradle/project/README.md
+++ b/coin/provisioning/common/shared/gradle/project/README.md
@@ -7,6 +7,7 @@ which use `--offline`.
Caches dependencies for:
- `com.android.application`: used by Qt test/example APK builds
- `com.android.library`: used by Qt JAR builds
+- `android.dynamic.feature`: used by Feature Delivery tests
- `org.jetbrains.kotlin.android`: used by some Qt modules
- AndroidX: used by app builds
diff --git a/coin/provisioning/common/shared/gradle/project/app/build.gradle b/coin/provisioning/common/shared/gradle/project/app/build.gradle
index 6cd28bc8..3f35c318 100644
--- a/coin/provisioning/common/shared/gradle/project/app/build.gradle
+++ b/coin/provisioning/common/shared/gradle/project/app/build.gradle
@@ -10,11 +10,14 @@ android {
applicationId 'org.qtproject.qt.gradlecache.app'
minSdk = 28
}
+
+ dynamicFeatures = [':feature']
}
dependencies {
implementation libs.core
implementation libs.appcompat
implementation libs.material
+ implementation libs.play.feature.delivery
testImplementation libs.junit
}
diff --git a/coin/provisioning/common/shared/gradle/project/app/src/main/res/values/strings.xml b/coin/provisioning/common/shared/gradle/project/app/src/main/res/values/strings.xml
new file mode 100644
index 00000000..521b5538
--- /dev/null
+++ b/coin/provisioning/common/shared/gradle/project/app/src/main/res/values/strings.xml
@@ -0,0 +1,4 @@
+
+
+ Feature
+
diff --git a/coin/provisioning/common/shared/gradle/project/build.gradle b/coin/provisioning/common/shared/gradle/project/build.gradle
index 9c5ba578..e4017cff 100644
--- a/coin/provisioning/common/shared/gradle/project/build.gradle
+++ b/coin/provisioning/common/shared/gradle/project/build.gradle
@@ -1,4 +1,5 @@
plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.library) apply false
+ alias(libs.plugins.android.dynamic.feature) apply false
}
diff --git a/coin/provisioning/common/shared/gradle/project/feature/build.gradle b/coin/provisioning/common/shared/gradle/project/feature/build.gradle
new file mode 100644
index 00000000..52c898bb
--- /dev/null
+++ b/coin/provisioning/common/shared/gradle/project/feature/build.gradle
@@ -0,0 +1,17 @@
+plugins {
+ alias(libs.plugins.android.dynamic.feature)
+}
+
+android {
+ namespace = 'org.qtproject.qt.gradlecache.feature'
+ compileSdk = 36
+
+ defaultConfig {
+ minSdk = 28
+ }
+}
+
+dependencies {
+ implementation project(':app')
+ implementation libs.play.feature.delivery
+}
diff --git a/coin/provisioning/common/shared/gradle/project/feature/src/main/AndroidManifest.xml b/coin/provisioning/common/shared/gradle/project/feature/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..bea6d055
--- /dev/null
+++ b/coin/provisioning/common/shared/gradle/project/feature/src/main/AndroidManifest.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
diff --git a/coin/provisioning/common/shared/gradle/project/feature/src/main/kotlin/org/qtproject/qt/gradlecache/feature/Feature.kt b/coin/provisioning/common/shared/gradle/project/feature/src/main/kotlin/org/qtproject/qt/gradlecache/feature/Feature.kt
new file mode 100644
index 00000000..066ec9ef
--- /dev/null
+++ b/coin/provisioning/common/shared/gradle/project/feature/src/main/kotlin/org/qtproject/qt/gradlecache/feature/Feature.kt
@@ -0,0 +1,5 @@
+package org.qtproject.qt.gradlecache.feature
+
+object Feature {
+ fun hello(): String = "hello"
+}
diff --git a/coin/provisioning/common/shared/gradle/project/gradle/libs.versions.toml b/coin/provisioning/common/shared/gradle/project/gradle/libs.versions.toml
index 3ce8fec0..f0277579 100644
--- a/coin/provisioning/common/shared/gradle/project/gradle/libs.versions.toml
+++ b/coin/provisioning/common/shared/gradle/project/gradle/libs.versions.toml
@@ -4,13 +4,16 @@ core = "1.17.0"
appcompat = "1.7.1"
material = "1.13.0"
junit = "4.13.2"
+play-feature-delivery = "2.1.0"
[libraries]
core = { group = "androidx.core", name = "core", version.ref = "core" }
appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
+play-feature-delivery = { module = "com.google.android.play:feature-delivery", version.ref = "play-feature-delivery" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
android-library = { id = "com.android.library", version.ref = "agp" }
+android-dynamic-feature = { id = "com.android.dynamic-feature", version.ref = "agp" }
diff --git a/coin/provisioning/common/shared/gradle/project/settings.gradle b/coin/provisioning/common/shared/gradle/project/settings.gradle
index d1ede288..2153d7ae 100644
--- a/coin/provisioning/common/shared/gradle/project/settings.gradle
+++ b/coin/provisioning/common/shared/gradle/project/settings.gradle
@@ -14,4 +14,4 @@ dependencyResolutionManagement {
}
rootProject.name = 'gradlecache'
-include ':app', ':lib'
+include ':app', ':lib', ':feature'