From 69cdd2e60a30b3fd0abaf2febd162a5a5c03fbda Mon Sep 17 00:00:00 2001 From: Kohei Date: Sat, 28 Feb 2026 20:04:15 +0900 Subject: [PATCH] feat: add product flavors (termux/embedded) with loader-noop module and FlavorModule DI Introduce Gradle product flavors to separate termux and embedded build variants. Each flavor provides its own FlavorModule for DI wiring. CI workflows updated to build termuxRelease specifically. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/android-build.yml | 4 ++-- .github/workflows/release.yml | 8 ++++---- android/app/build.gradle.kts | 14 ++++++++++++++ .../java/io/clawdroid/di/FlavorModule.kt | 10 ++++++++++ .../src/main/java/io/clawdroid/ClawDroidApp.kt | 3 ++- .../termux/java/io/clawdroid/di/FlavorModule.kt | 9 +++++++++ android/backend/loader-noop/build.gradle.kts | 17 +++++++++++++++++ .../loader-noop/src/main/AndroidManifest.xml | 2 ++ android/settings.gradle.kts | 1 + 9 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 android/app/src/embedded/java/io/clawdroid/di/FlavorModule.kt create mode 100644 android/app/src/termux/java/io/clawdroid/di/FlavorModule.kt create mode 100644 android/backend/loader-noop/build.gradle.kts create mode 100644 android/backend/loader-noop/src/main/AndroidManifest.xml diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index 07d116950..533a6a714 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -51,10 +51,10 @@ jobs: EOF - name: Build release APK - run: ./gradlew assembleRelease + run: ./gradlew assembleTermuxRelease - name: Upload APK uses: actions/upload-artifact@v4 with: name: clawdroid-release-apk - path: android/app/build/outputs/apk/release/*.apk + path: android/app/build/outputs/apk/termuxRelease/*.apk diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4caec1b20..51257fd4b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -120,16 +120,16 @@ jobs: EOF - name: Build release APK - run: ./gradlew assembleRelease + run: ./gradlew assembleTermuxRelease - name: Rename APK with version run: | - mv app/build/outputs/apk/release/app-release.apk \ - app/build/outputs/apk/release/clawdroid-${{ inputs.tag }}.apk + mv app/build/outputs/apk/termuxRelease/app-termux-release.apk \ + app/build/outputs/apk/termuxRelease/clawdroid-${{ inputs.tag }}.apk - name: Upload APK to release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | gh release upload "${{ inputs.tag }}" \ - app/build/outputs/apk/release/clawdroid-${{ inputs.tag }}.apk + app/build/outputs/apk/termuxRelease/clawdroid-${{ inputs.tag }}.apk diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index d84906d3c..24407a23c 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -49,8 +49,20 @@ android { } } + flavorDimensions += "variant" + productFlavors { + create("termux") { dimension = "variant" } + create("embedded") { dimension = "variant" } + } + buildFeatures { compose = true + buildConfig = true + } + + sourceSets { + getByName("termux") { java.srcDirs("src/termux/java") } + getByName("embedded") { java.srcDirs("src/embedded/java") } } compileOptions { @@ -67,6 +79,8 @@ dependencies { implementation(project(":backend:api")) implementation(project(":backend:config")) + "termuxImplementation"(project(":backend:loader-noop")) + implementation(platform(libs.compose.bom)) implementation(libs.compose.ui) implementation(libs.compose.material3) diff --git a/android/app/src/embedded/java/io/clawdroid/di/FlavorModule.kt b/android/app/src/embedded/java/io/clawdroid/di/FlavorModule.kt new file mode 100644 index 000000000..0eda7f92e --- /dev/null +++ b/android/app/src/embedded/java/io/clawdroid/di/FlavorModule.kt @@ -0,0 +1,10 @@ +package io.clawdroid.di + +import io.clawdroid.backend.api.BackendLifecycle +import io.clawdroid.backend.api.NoopBackendLifecycle +import org.koin.dsl.module + +val flavorModule = module { + // Step 13 で EmbeddedBackendLifecycle に差し替え予定 + single { NoopBackendLifecycle() } +} diff --git a/android/app/src/main/java/io/clawdroid/ClawDroidApp.kt b/android/app/src/main/java/io/clawdroid/ClawDroidApp.kt index f8d1f1d4a..718f7fa86 100644 --- a/android/app/src/main/java/io/clawdroid/ClawDroidApp.kt +++ b/android/app/src/main/java/io/clawdroid/ClawDroidApp.kt @@ -7,6 +7,7 @@ import io.clawdroid.backend.config.ConfigApiClient import io.clawdroid.backend.config.configModule import io.clawdroid.core.data.remote.WebSocketClient import io.clawdroid.di.appModule +import io.clawdroid.di.flavorModule import io.clawdroid.receiver.NotificationHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.distinctUntilChanged @@ -23,7 +24,7 @@ class ClawDroidApp : Application() { super.onCreate() val koinApp = startKoin { androidContext(this@ClawDroidApp) - modules(appModule, configModule) + modules(appModule, flavorModule, configModule) } NotificationHelper.createNotificationChannel(this) diff --git a/android/app/src/termux/java/io/clawdroid/di/FlavorModule.kt b/android/app/src/termux/java/io/clawdroid/di/FlavorModule.kt new file mode 100644 index 000000000..126f50cea --- /dev/null +++ b/android/app/src/termux/java/io/clawdroid/di/FlavorModule.kt @@ -0,0 +1,9 @@ +package io.clawdroid.di + +import io.clawdroid.backend.api.BackendLifecycle +import io.clawdroid.backend.api.NoopBackendLifecycle +import org.koin.dsl.module + +val flavorModule = module { + single { NoopBackendLifecycle() } +} diff --git a/android/backend/loader-noop/build.gradle.kts b/android/backend/loader-noop/build.gradle.kts new file mode 100644 index 000000000..346428e1e --- /dev/null +++ b/android/backend/loader-noop/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + alias(libs.plugins.android.library) +} + +android { + namespace = "io.clawdroid.backend.loader.noop" + compileSdk = libs.versions.android.compileSdk.get().toInt() + defaultConfig { minSdk = libs.versions.android.minSdk.get().toInt() } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } +} + +dependencies { + implementation(project(":backend:api")) +} diff --git a/android/backend/loader-noop/src/main/AndroidManifest.xml b/android/backend/loader-noop/src/main/AndroidManifest.xml new file mode 100644 index 000000000..8072ee00d --- /dev/null +++ b/android/backend/loader-noop/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index 70700201d..b34dcf446 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -20,3 +20,4 @@ include(":core:data") include(":core:ui") include(":backend:api") include(":backend:config") +include(":backend:loader-noop")