diff --git a/build-logic/ide/src/main/java/com/itsaky/androidide/plugins/AndroidIDEAssetsPlugin.kt b/build-logic/ide/src/main/java/com/itsaky/androidide/plugins/AndroidIDEAssetsPlugin.kt index 8ef04968a..3b1c72ce6 100644 --- a/build-logic/ide/src/main/java/com/itsaky/androidide/plugins/AndroidIDEAssetsPlugin.kt +++ b/build-logic/ide/src/main/java/com/itsaky/androidide/plugins/AndroidIDEAssetsPlugin.kt @@ -18,14 +18,12 @@ package com.itsaky.androidide.plugins import BuildConfig -import FDroidConfig import VersionUtils import com.android.build.api.variant.AndroidComponentsExtension import com.android.build.gradle.BaseExtension -import com.itsaky.androidide.plugins.conf.flavorsAbis import com.itsaky.androidide.plugins.tasks.AddAndroidJarToAssetsTask import com.itsaky.androidide.plugins.tasks.AddFileToAssetsTask -import com.itsaky.androidide.plugins.tasks.DownloadAapt2Task +import com.itsaky.androidide.plugins.tasks.SetupAapt2Task import com.itsaky.androidide.plugins.tasks.GenerateInitScriptTask import com.itsaky.androidide.plugins.tasks.GradleWrapperBuilderTask import com.itsaky.androidide.plugins.util.SdkUtils.getAndroidJar @@ -34,7 +32,6 @@ import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.TaskProvider import org.gradle.configurationcache.extensions.capitalized -import java.io.File /** * Handles asset copying and generation. @@ -61,7 +58,7 @@ class AndroidIDEAssetsPlugin : Plugin { val androidComponentsExtension = extensions.getByType(AndroidComponentsExtension::class.java) val baseExtension = extensions.getByType(BaseExtension::class.java) - val aapt2Tasks = getAapt2DownloadTasks(baseExtension) + val aapt2Tasks = getAapt2SetupTasks(baseExtension) val addAndroidJarTaskProvider = tasks.register("addAndroidJarToAssets", AddAndroidJarToAssetsTask::class.java) { @@ -70,17 +67,12 @@ class AndroidIDEAssetsPlugin : Plugin { androidComponentsExtension.onVariants { variant -> - if (aapt2Tasks.isNotEmpty()) { - val downloadAapt2TaskProvider = aapt2Tasks[variant.flavorName] - ?: throw IllegalStateException( - "'aapt2' task not registered for flavor '${variant.flavorName}'") + val aapt2SetupTaskProvider = aapt2Tasks[variant.flavorName] + ?: throw IllegalStateException( + "'aapt2' task not registered for flavor '${variant.flavorName}'") - variant.sources.assets?.addGeneratedSourceDirectory(downloadAapt2TaskProvider, - DownloadAapt2Task::outputDirectory) - } else { - variant.sources.assets?.addStaticSourceDirectory( - getStaticFDroidAapt2Dir(variant.flavorName!!)) - } + variant.sources.assets?.addGeneratedSourceDirectory(aapt2SetupTaskProvider, + SetupAapt2Task::outputDirectory) val variantNameCapitalized = variant.name.capitalized() @@ -128,53 +120,17 @@ class AndroidIDEAssetsPlugin : Plugin { } } - private fun Project.getStaticFDroidAapt2Dir(flavorName: String): String { - val fdroidArch = FDroidConfig.fDroidBuildArch!! - val fdroidAapt2 = FDroidConfig.fDroidAapt2File!! - - require(fdroidArch in flavorsAbis.keys) { - "F-Droid arch '${fdroidArch}' is not supported!" - } - - - val inFile = File(fdroidAapt2) - require(inFile.exists() && inFile.isFile) { - "F-Droid AAPT2 file does not exist or is not a file: $inFile" - } - - val assetDir = project.layout.buildDirectory.dir("intermediates/fdroid-aapt2-${flavorName}") - .get().asFile - - if (assetDir.exists()) { - assetDir.deleteRecursively() - } - - assetDir.mkdirs() - - val outFile = File(assetDir, "data/$flavorName/aapt2") - outFile.parentFile.mkdirs() - - inFile.copyTo(outFile, overwrite = true) - - return assetDir.absolutePath - } - - private fun Project.getAapt2DownloadTasks( + private fun Project.getAapt2SetupTasks( baseExtension: BaseExtension - ): Map> { + ): Map> { - if (FDroidConfig.isFDroidBuild) { - // Do not download AAPT2 when building for F-Droid - return emptyMap() - } - - val aapt2Tasks = mutableMapOf>() + val aapt2Tasks = mutableMapOf>() baseExtension.productFlavors.forEach { flavor -> val task = tasks.register( - "downloadAapt2${flavor.name.capitalized()}", - DownloadAapt2Task::class.java + "setupAapt2${flavor.name.capitalized()}", + SetupAapt2Task::class.java ) { arch.set(flavor.name) checksum.set(AAPT2_CHECKSUMS[flavor.name] ?: throw IllegalStateException( diff --git a/build-logic/ide/src/main/java/com/itsaky/androidide/plugins/tasks/DownloadAapt2Task.kt b/build-logic/ide/src/main/java/com/itsaky/androidide/plugins/tasks/SetupAapt2Task.kt similarity index 74% rename from build-logic/ide/src/main/java/com/itsaky/androidide/plugins/tasks/DownloadAapt2Task.kt rename to build-logic/ide/src/main/java/com/itsaky/androidide/plugins/tasks/SetupAapt2Task.kt index 9918310a6..035ca4501 100644 --- a/build-logic/ide/src/main/java/com/itsaky/androidide/plugins/tasks/DownloadAapt2Task.kt +++ b/build-logic/ide/src/main/java/com/itsaky/androidide/plugins/tasks/SetupAapt2Task.kt @@ -24,11 +24,12 @@ import org.gradle.api.provider.Property import org.gradle.api.tasks.Input import org.gradle.api.tasks.OutputDirectory import org.gradle.api.tasks.TaskAction +import java.io.File /** * @author Akash Yadav */ -abstract class DownloadAapt2Task : DefaultTask() { +abstract class SetupAapt2Task : DefaultTask() { /** * The CPU architecture for which the `aapt2` should be downloaded. @@ -49,6 +50,12 @@ abstract class DownloadAapt2Task : DefaultTask() { @get:Input abstract val checksum: Property + /** + * The path of the static `aapt2` file which should be used instead of downloading it from GitHub. + */ + @get:Input + abstract val staticAapt2: Property + /** * The output directory. */ @@ -56,24 +63,37 @@ abstract class DownloadAapt2Task : DefaultTask() { abstract val outputDirectory: DirectoryProperty init { + @Suppress("LeakingThis") version.convention(DEFAULT_VERSION) } companion object { private const val DEFAULT_VERSION = "34.0.4" - private val AAPT2_DOWNLOAD_URL = "https://github.com/AndroidIDEOfficial/platform-tools/releases/download/v%1\$s/aapt2-%2\$s" + private const val AAPT2_DOWNLOAD_URL = "https://github.com/AndroidIDEOfficial/platform-tools/releases/download/v%1\$s/aapt2-%2\$s" } @TaskAction - fun downloadAapt2() { + fun setupAapt2() { + val file = outputDirectory.file("data/$arch/aapt2").get().asFile + file.parentFile.deleteRecursively() + file.parentFile.mkdirs() + + if (staticAapt2.isPresent) { + val aapt2 = File(staticAapt2.get()) + + require(aapt2.exists() && aapt2.isFile) { + "F-Droid AAPT2 file does not exist or is not a file: $aapt2" + } + + aapt2.copyTo(file, overwrite = true) + return + } + val arch = this.arch.get() val version = this.version.get() val expectedChecksum = this.checksum.get() - val file = outputDirectory.file("data/$arch/aapt2").get().asFile - file.parentFile.mkdirs() - val remoteUrl = AAPT2_DOWNLOAD_URL.format(version, arch) DownloadUtils.doDownload(file, remoteUrl, expectedChecksum, logger)