diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4031e824..7fbccf02 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -86,7 +86,7 @@ jobs: - name: Build release app uses: gradle/gradle-build-action@v2.1.3 with: - arguments: :android:assembleRelease --no-configuration-cache + arguments: collectReleaseApks --no-configuration-cache - name: Clean secrets run: scripts/signing-cleanup.sh diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 870a167c..4702bacd 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -1,6 +1,20 @@ @file:OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class) +import com.android.build.api.artifact.SingleArtifact +import com.android.build.api.variant.BuiltArtifactsLoader +import java.nio.file.Files +import java.nio.file.Paths +import java.nio.file.StandardCopyOption import java.util.Properties +import org.gradle.api.DefaultTask +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.CacheableTask +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.PathSensitive +import org.gradle.api.tasks.PathSensitivity +import org.gradle.api.tasks.TaskAction plugins { id("org.jetbrains.compose") @@ -10,6 +24,30 @@ plugins { id("dagger.hilt.android.plugin") } +@CacheableTask +abstract class CollectApksTask : DefaultTask() { + + @get:InputFiles @get:PathSensitive(PathSensitivity.NONE) abstract val apkFolder: DirectoryProperty + @get:Input abstract val variantName: Property + @get:Internal abstract val builtArtifactsLoader: Property + @get:OutputDirectory abstract val outputDirectory: DirectoryProperty + + @TaskAction + fun taskAction() { + val outputDir = outputDirectory.asFile.get() + outputDir.mkdirs() + val builtArtifacts = + builtArtifactsLoader.get().load(apkFolder.get()) ?: throw RuntimeException("Cannot load APKs") + builtArtifacts.elements.forEach { artifact -> + Files.copy( + Paths.get(artifact.outputFile), + outputDir.resolve("Claw-${variantName.get()}-${artifact.versionName}.apk").toPath(), + StandardCopyOption.REPLACE_EXISTING, + ) + } + } +} + dependencies { kapt(libs.dagger.hilt.compiler) implementation(projects.api) @@ -73,3 +111,14 @@ android { includeInApk = false } } + +androidComponents { + onVariants { variant -> + project.tasks.register("collect${variant.name.capitalize()}Apks") { + variantName.set(variant.name) + apkFolder.set(variant.artifacts.get(SingleArtifact.APK)) + builtArtifactsLoader.set(variant.artifacts.getBuiltArtifactsLoader()) + outputDirectory.set(project.layout.projectDirectory.dir("outputs")) + } + } +}