build: fix build failure when cleaning project and fDroidAapt2File does not exist

This commit is contained in:
Akash Yadav
2024-01-03 12:57:00 +05:30
parent c843a4a143
commit ca8b3fd5f6
2 changed files with 38 additions and 62 deletions
@@ -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<Project> {
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<Project> {
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<Project> {
}
}
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<String, TaskProvider<DownloadAapt2Task>> {
): Map<String, TaskProvider<SetupAapt2Task>> {
if (FDroidConfig.isFDroidBuild) {
// Do not download AAPT2 when building for F-Droid
return emptyMap()
}
val aapt2Tasks = mutableMapOf<String, TaskProvider<DownloadAapt2Task>>()
val aapt2Tasks = mutableMapOf<String, TaskProvider<SetupAapt2Task>>()
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(
@@ -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<String>
/**
* The path of the static `aapt2` file which should be used instead of downloading it from GitHub.
*/
@get:Input
abstract val staticAapt2: Property<String>
/**
* 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)