From 566e1160076d897ae6e587188e43db72f562faed Mon Sep 17 00:00:00 2001 From: bingran Date: Thu, 13 Nov 2025 14:33:41 -0800 Subject: [PATCH 1/2] Refactor the logic of consuming apk built from :wear:watchface --- wear/build.gradle.kts | 60 +++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/wear/build.gradle.kts b/wear/build.gradle.kts index 7d5c3971..91296a37 100644 --- a/wear/build.gradle.kts +++ b/wear/build.gradle.kts @@ -15,6 +15,8 @@ */ import java.io.ByteArrayOutputStream import java.util.regex.Pattern +import org.gradle.api.attributes.Attribute +import java.lang.RuntimeException evaluationDependsOn(":wear:watchface") @@ -66,9 +68,38 @@ configurations { isCanBeConsumed = false isCanBeResolved = true } + + create("watchfaceApkDebug"){ + isCanBeResolved = true + isCanBeConsumed = false + + attributes { + attribute( + Attribute.of(com.android.build.api.attributes.BuildTypeAttr::class.java), + objects.named(com.android.build.api.attributes.BuildTypeAttr::class.java, "debug") + ) + attribute(Attribute.of("artifactType", String::class.java), "apk") + } + } + + create("watchfaceApkRelease") { + isCanBeResolved = true + isCanBeConsumed = false + + attributes { + attribute( + Attribute.of(com.android.build.api.attributes.BuildTypeAttr::class.java), + objects.named(com.android.build.api.attributes.BuildTypeAttr::class.java, "release") + ) + attribute(Attribute.of("artifactType", String::class.java), "apk") + } + } } dependencies { + configurations.getByName("watchfaceApkDebug").dependencies.add(project(":wear:watchface")) + configurations.getByName("watchfaceApkRelease").dependencies.add(project(":wear:watchface")) + implementation(projects.wear.common) implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.wear.compose.foundation) @@ -93,29 +124,29 @@ dependencies { androidComponents.onVariants { variant -> val capsVariant = variant.name.replaceFirstChar { it.uppercase() } - val copyTaskProvider = tasks.register("copyWatchface${capsVariant}Output") { - val wfTask = project(":wear:watchface").tasks.named("assemble$capsVariant") - dependsOn(wfTask) - val buildDir = project(":wear:watchface").layout.buildDirectory.asFileTree.matching { - include("**/${variant.name}/**/*.apk") - exclude("**/*androidTest*") + val watchfaceApkConfig = when (variant.name) { + "release" -> configurations.getByName("watchfaceApkRelease") + "debug" -> configurations.getByName("watchfaceApkDebug") + else -> throw RuntimeException("Cannot find watchface apk configuration") + } + + val copyWatchfaceApkTask = tasks.register("copyWatchface${capsVariant}ApkToAssets") { + from(watchfaceApkConfig) { + // the resolved directory contains apk and output-metadata.json + include("*.apk") } - from(buildDir) into(layout.buildDirectory.dir("intermediates/watchfaceAssets/${variant.name}")) - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - eachFile { path = "default_watchface.apk" } + duplicatesStrategy = DuplicatesStrategy.EXCLUDE includeEmptyDirs = false } - val tokenTask = tasks.register("generateToken${capsVariant}Res") { val tokenFile = layout.buildDirectory.file("generated/wfTokenRes/${variant.name}/res/values/wf_token.xml") - - inputFile.from(copyTaskProvider.map { it.outputs.files.singleFile }) + inputFile.from(copyWatchfaceApkTask.map { it.outputs.files.singleFile }) outputFile.set(tokenFile) cliToolClasspath.set(project.configurations["cliToolConfiguration"]) } @@ -143,7 +174,8 @@ abstract class ProcessFilesTask : DefaultTask() { @TaskAction fun taskAction() { - val apkFile = inputFile.singleFile.resolve("default_watchface.apk") + val apkDirectory = inputFile.singleFile + val apkFile = apkDirectory.resolve("default_watchface.apk") val stdOut = ByteArrayOutputStream() val stdErr = ByteArrayOutputStream() @@ -189,4 +221,4 @@ abstract class ProcessFilesTask : DefaultTask() { ) } } -} \ No newline at end of file +} From ec8a352c3772641eabc49f98337c9dc4d9ca6c6e Mon Sep 17 00:00:00 2001 From: bingran Date: Tue, 18 Nov 2025 11:02:08 -0800 Subject: [PATCH 2/2] Improve readability --- wear/build.gradle.kts | 66 ++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 39 deletions(-) diff --git a/wear/build.gradle.kts b/wear/build.gradle.kts index 91296a37..a3df535a 100644 --- a/wear/build.gradle.kts +++ b/wear/build.gradle.kts @@ -16,9 +16,7 @@ import java.io.ByteArrayOutputStream import java.util.regex.Pattern import org.gradle.api.attributes.Attribute -import java.lang.RuntimeException - -evaluationDependsOn(":wear:watchface") +import com.android.build.api.attributes.BuildTypeAttr plugins { alias(libs.plugins.android.application) @@ -69,36 +67,26 @@ configurations { isCanBeResolved = true } - create("watchfaceApkDebug"){ - isCanBeResolved = true - isCanBeConsumed = false - - attributes { - attribute( - Attribute.of(com.android.build.api.attributes.BuildTypeAttr::class.java), - objects.named(com.android.build.api.attributes.BuildTypeAttr::class.java, "debug") - ) - attribute(Attribute.of("artifactType", String::class.java), "apk") - } - } - - create("watchfaceApkRelease") { - isCanBeResolved = true - isCanBeConsumed = false - - attributes { - attribute( - Attribute.of(com.android.build.api.attributes.BuildTypeAttr::class.java), - objects.named(com.android.build.api.attributes.BuildTypeAttr::class.java, "release") - ) - attribute(Attribute.of("artifactType", String::class.java), "apk") + listOf("debug", "release").forEach { buildType -> + create("watchfaceApk${buildType.replaceFirstChar { it.uppercase() }}") { + isCanBeResolved = true + isCanBeConsumed = false + + attributes { + attribute( + Attribute.of(BuildTypeAttr::class.java), + objects.named(BuildTypeAttr::class.java, buildType) + ) + attribute(Attribute.of("artifactType", String::class.java), "apk") + } } } } dependencies { - configurations.getByName("watchfaceApkDebug").dependencies.add(project(":wear:watchface")) - configurations.getByName("watchfaceApkRelease").dependencies.add(project(":wear:watchface")) + configurations.matching { it.name.startsWith("watchfaceApk") }.all { + dependencies.add(project(":wear:watchface")) + } implementation(projects.wear.common) implementation(platform(libs.androidx.compose.bom)) @@ -123,12 +111,7 @@ dependencies { androidComponents.onVariants { variant -> val capsVariant = variant.name.replaceFirstChar { it.uppercase() } - - val watchfaceApkConfig = when (variant.name) { - "release" -> configurations.getByName("watchfaceApkRelease") - "debug" -> configurations.getByName("watchfaceApkDebug") - else -> throw RuntimeException("Cannot find watchface apk configuration") - } + val watchfaceApkConfig = configurations.getByName("watchfaceApk$capsVariant") val copyWatchfaceApkTask = tasks.register("copyWatchface${capsVariant}ApkToAssets") { from(watchfaceApkConfig) { @@ -146,7 +129,13 @@ androidComponents.onVariants { variant -> val tokenTask = tasks.register("generateToken${capsVariant}Res") { val tokenFile = layout.buildDirectory.file("generated/wfTokenRes/${variant.name}/res/values/wf_token.xml") - inputFile.from(copyWatchfaceApkTask.map { it.outputs.files.singleFile }) + + apkDirectory.set( + layout.dir( copyWatchfaceApkTask.map { + it.destinationDir + }) + ) + outputFile.set(tokenFile) cliToolClasspath.set(project.configurations["cliToolConfiguration"]) } @@ -159,8 +148,8 @@ androidComponents.onVariants { variant -> } abstract class ProcessFilesTask : DefaultTask() { - @get:InputFiles - abstract val inputFile: ConfigurableFileCollection + @get:InputDirectory + abstract val apkDirectory: DirectoryProperty @get:OutputFile abstract val outputFile: RegularFileProperty @@ -174,8 +163,7 @@ abstract class ProcessFilesTask : DefaultTask() { @TaskAction fun taskAction() { - val apkDirectory = inputFile.singleFile - val apkFile = apkDirectory.resolve("default_watchface.apk") + val apkFile = apkDirectory.asFile.get().resolve("default_watchface.apk") val stdOut = ByteArrayOutputStream() val stdErr = ByteArrayOutputStream()