Skip to content

Commit

Permalink
Delete the resource rewriting stuff
Browse files Browse the repository at this point in the history
Abandoning this effort
  • Loading branch information
dellisd committed Jul 11, 2023
1 parent 01ddfb9 commit 3f01dc6
Show file tree
Hide file tree
Showing 78 changed files with 0 additions and 3,395 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,17 @@ import app.cash.better.dynamic.features.codegen.AndroidVariant
import app.cash.better.dynamic.features.codegen.TypesafeImplementationsCompilationTask
import app.cash.better.dynamic.features.codegen.TypesafeImplementationsGeneratorTask
import app.cash.better.dynamic.features.codegen.api.KSP_REPORT_DIRECTORY_PREFIX
import app.cash.better.dynamic.features.magic.AaptMagic
import app.cash.better.dynamic.features.magic.MagicRClassFixingTask
import app.cash.better.dynamic.features.magic.MagicRFixingTask
import app.cash.better.dynamic.features.magic.ResourceClashFinderTask
import app.cash.better.dynamic.features.magic.ResourceStyleableMapperTask
import app.cash.better.dynamic.features.tasks.BaseLockfileWriterTask
import app.cash.better.dynamic.features.tasks.CheckExternalResourcesTask
import app.cash.better.dynamic.features.tasks.CheckLockfileTask
import app.cash.better.dynamic.features.tasks.DependencyGraphWriterTask
import app.cash.better.dynamic.features.tasks.DependencyGraphWriterTask.ResolvedComponentResultPair
import app.cash.better.dynamic.features.tasks.GenerateExternalResourcesTask
import com.android.build.api.artifact.ScopedArtifact
import com.android.build.api.artifact.SingleArtifact
import com.android.build.api.attributes.BuildTypeAttr
import com.android.build.api.dsl.ApplicationExtension
import com.android.build.api.variant.AndroidComponentsExtension
import com.android.build.api.variant.ScopedArtifacts
import com.android.build.api.variant.Variant
import com.android.build.gradle.internal.publishing.AndroidArtifacts
import com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask
import com.android.build.gradle.internal.tasks.factory.dependsOn
import com.google.devtools.ksp.gradle.KspTask
import com.google.devtools.ksp.gradle.KspTaskJvm
Expand All @@ -49,7 +40,6 @@ import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.Usage
import org.gradle.api.file.Directory
import org.gradle.api.tasks.TaskProvider
import org.gradle.configurationcache.extensions.capitalized
import org.gradle.process.CommandLineArgumentProvider
Expand Down Expand Up @@ -77,7 +67,6 @@ class BetterDynamicFeaturesPlugin : Plugin<Project> {
}
}

@OptIn(AaptMagic::class)
private fun applyToFeature(project: Project) {
val pluginExtension = project.extensions.create(
"betterDynamicFeatures",
Expand All @@ -87,14 +76,12 @@ class BetterDynamicFeaturesPlugin : Plugin<Project> {
val sharedConfiguration = project.createSharedFeatureConfiguration()

project.setupFeatureDependencyGraphTasks(androidComponents, sharedConfiguration)
project.setupFeatureRMagicTask(androidComponents, pluginExtension)
project.plugins.withId("com.google.devtools.ksp") {
project.dependencies.add("implementation", "app.cash.better.dynamic.features:runtime:$VERSION")
project.setupFeatureKsp(androidComponents)
}
}

@OptIn(AaptMagic::class)
private fun applyToApplication(project: Project) {
val pluginExtension =
project.extensions.create("betterDynamicFeatures", BetterDynamicFeaturesExtension::class.java)
Expand All @@ -118,7 +105,6 @@ class BetterDynamicFeaturesPlugin : Plugin<Project> {
}

project.setupBaseDependencyGraphTasks(androidComponents, featureProjects, sharedConfiguration)
project.setupBaseResourceClashTask(androidComponents, featureProjects)
}

androidComponents.onVariants { variant ->
Expand All @@ -137,8 +123,6 @@ class BetterDynamicFeaturesPlugin : Plugin<Project> {
}
}
}

project.setupBaseResourcesCheckingTasks(androidComponents, pluginExtension)
}

private fun Configuration.getConfigurationArtifactCollection(): ArtifactCollection =
Expand Down Expand Up @@ -285,199 +269,6 @@ class BetterDynamicFeaturesPlugin : Plugin<Project> {
tasks.named("preBuild").dependsOn(checkLockfileTask)
}

@AaptMagic
private fun Project.setupBaseResourcesCheckingTasks(
androidComponents: AndroidComponentsExtension<*, *, *>,
pluginExtension: BetterDynamicFeaturesExtension,
) {
androidComponents.onVariants { variant ->
val generateResourcesTask = tasks.register(
"generate${variant.name.capitalized()}ExternalResources",
GenerateExternalResourcesTask::class.java,
) { task ->
task.outputDirectory.set(layout.buildDirectory.dir("betterDynamicFeatures/resources/${variant.name}"))
task.declarations.set(provider { pluginExtension.externalStyles })
task.group = GROUP
}
variant.sources.res?.addGeneratedSourceDirectory(
generateResourcesTask,
GenerateExternalResourcesTask::outputDirectory,
)

val checkExternalResourcesTask = tasks.register(
"check${variant.name.capitalized()}ExternalResources",
CheckExternalResourcesTask::class.java,
) { task ->
val configuration = project.configurations.named("${variant.name}RuntimeClasspath")

val artifactsProvider = configuration.map {
it.incoming.artifactView { config ->
config.attributes { container ->
container.attribute(
AndroidArtifacts.ARTIFACT_TYPE,
AndroidArtifacts.ArtifactType.SYMBOL_LIST_WITH_PACKAGE_NAME.type,
)
}
}.artifacts
}

task.setIncomingResources(artifactsProvider)
task.incomingResourcesCollection.setFrom(artifactsProvider.map { it.artifactFiles })
task.manifestFile.set(variant.artifacts.get(SingleArtifact.MERGED_MANIFEST))
task.externalDeclarations.set(provider { pluginExtension.externalStyles })
task.result.set(project.layout.buildDirectory.file("betterDynamicFeatures/resourcesCheck/${variant.name}/result.txt"))
variant.sources.res?.all?.let { task.localResources.setFrom(it.map(List<Collection<Directory>>::flatten)) }

task.group = GROUP
}

// Run the check task before the AGP `process[VariantName]Resources` task.
tasks.withType(LinkApplicationAndroidResourcesTask::class.java).configureEach {
if (it.name.contains(variant.name, ignoreCase = true)) {
it.dependsOn(checkExternalResourcesTask)
}
}
}
}

@AaptMagic
private fun Project.setupBaseResourceClashTask(
androidComponents: AndroidComponentsExtension<*, *, *>,
featureProjects: List<Project>,
) {
androidComponents.onVariants { variant ->
afterEvaluate {
tasks.register(
taskName("find", variant, "ResourceClashes"),
ResourceClashFinderTask::class.java,
) { task ->
val linkTask = tasks.named(
taskName("process", variant, "Resources"),
LinkApplicationAndroidResourcesTask::class.java,
)
task.baseSymbolList.set { linkTask.get().getTextSymbolOutputFile()!! }

task.featureSymbolLists.setFrom(
featureProjects.map {
it.buildDir.resolve("intermediates/runtime_symbol_list/${variant.name}/R.txt")
},
)
featureProjects.forEach {
task.dependsOn(it.tasks.named(taskName("process", variant, "Resources")))
}
task.dependsOn(tasks.named(taskName("process", variant, "Resources")))
task.resourceMappingFile.set(buildDir.resolve("betterDynamicFeatures/resource-mapping/${variant.name}/mapping.txt"))
}
}
}
}

@AaptMagic
private fun Project.setupFeatureRMagicTask(
androidComponents: AndroidComponentsExtension<*, *, *>,
pluginExtension: BetterDynamicFeaturesFeatureExtension,
) {
androidComponents.onVariants { variant ->
afterEvaluate {
if (!pluginExtension.enableResourceRewriting.getOrElse(false)) return@afterEvaluate

val baseProject = pluginExtension.baseProject.orNull
require(baseProject != null) {
"""
|A base project has not been set for this feature module! This will result in undefined runtime behaviour.
|Add a reference to your base module in the feature module configuration:
|
|betterDynamicFeatures {
| baseProject.set(project(":app"))
|}
""".trimMargin()
return@afterEvaluate
}

val styleableTask = tasks.register(taskName("extract", variant, "StyleableResources"), ResourceStyleableMapperTask::class.java) { task ->
task.resourceMappingFile.set(
baseProject.tasks.named(
"find${variant.name.capitalized()}ResourceClashes",
ResourceClashFinderTask::class.java,
).flatMap { it.resourceMappingFile },
)
task.styleableArraysFile.set(buildDir.resolve("betterDynamicFeatures/resource-mapping/${variant.name}/styleables.txt"))
val linkTask = tasks.named(
taskName("process", variant, "Resources"),
LinkApplicationAndroidResourcesTask::class.java,
)
task.runtimeSymbolList.set { linkTask.get().getTextSymbolOutputFile()!! }

task.dependsOn(tasks.named(taskName("process", variant, "Resources")))
}

// This task rewrites Android Binary XML files when assembling APKs
val ohNoTask = tasks.register(
"magicRewrite${variant.name.capitalized()}BinaryResources",
MagicRFixingTask::class.java,
) { task ->
task.processedResourceArchive.set { buildDir.resolve("intermediates/processed_res/${variant.name}/out/resources-${variant.name}.ap_") }
task.outputArchive.set { buildDir.resolve("intermediates/processed_res/${variant.name}/out/resources-${variant.name}.ap_") }

// I'm in Spain without the S
task.resourceMappingFile.set(
baseProject.tasks.named(
"find${variant.name.capitalized()}ResourceClashes",
ResourceClashFinderTask::class.java,
).flatMap { it.resourceMappingFile },
)

task.mode.set(MagicRFixingTask.Mode.BinaryXml)
task.dependsOn(styleableTask)
}
tasks.named("assemble${variant.name.capitalized()}").dependsOn(ohNoTask)
tasks.named(taskName("package", variant)).dependsOn(ohNoTask)

// This task rewrites Proto XML files when producing an app bundle
val protohNoTask = tasks.register(
"magicRewrite${variant.name.capitalized()}ProtoResources",
MagicRFixingTask::class.java,
) { task ->
task.processedResourceArchive.set { buildDir.resolve("intermediates/linked_res_for_bundle/${variant.name}/bundled-res.ap_") }
task.outputArchive.set { buildDir.resolve("intermediates/linked_res_for_bundle/${variant.name}/bundled-res.ap_") }

// Bread in French
task.resourceMappingFile.set(
baseProject.tasks.named(
"find${variant.name.capitalized()}ResourceClashes",
ResourceClashFinderTask::class.java,
).flatMap { it.resourceMappingFile },
)

task.mode.set(MagicRFixingTask.Mode.ProtoXml)
task.dependsOn(styleableTask)
task.dependsOn(tasks.named(taskName("bundle", variant, "Resources")))
}
tasks.named(taskName("build", variant, "PreBundle")).dependsOn(protohNoTask)

val rClassTask = tasks.register(taskName("magicRewrite", variant, "RClasses"), MagicRClassFixingTask::class.java) { task ->
task.resourceMappingFile.set(
baseProject.tasks.named(
"find${variant.name.capitalized()}ResourceClashes",
ResourceClashFinderTask::class.java,
).flatMap { it.resourceMappingFile },
)
task.styleableMappingFile.set(styleableTask.flatMap { it.styleableArraysFile })

task.jar.set(buildDir.resolve("intermediates/compile_and_runtime_not_namespaced_r_class_jar/${variant.name}/R.jar"))
task.output.set(buildDir.resolve("intermediates/compile_and_runtime_not_namespaced_r_class_jar/${variant.name}/R.jar"))

task.dependsOn(tasks.named("process${variant.name.capitalized()}Resources"))
}
tasks.withType(KspTask::class.java).configureEach { kspTask ->
if (!kspTaskMatchesVariant(kspTask, variant)) return@configureEach
kspTask.dependsOn(rClassTask)
}
tasks.named(taskName("compile", variant, "JavaWithJavac")).dependsOn(rClassTask)
}
}
}

private fun taskName(vararg args: Any) = args.mapIndexed { index, arg ->
when (arg) {
is Variant -> if (index != 0) arg.name.replaceFirstChar { it.uppercase() } else arg.name
Expand Down

This file was deleted.

Loading

0 comments on commit 3f01dc6

Please sign in to comment.