22
33package io.deepmedia.tools.grease
44
5- import com.android.build.api.component.analytics.AnalyticsEnabledLibraryVariant
65import com.android.build.api.component.analytics.AnalyticsEnabledVariant
76import com.android.build.api.variant.AndroidComponentsExtension
87import com.android.build.api.variant.Variant
@@ -31,12 +30,13 @@ import com.android.ide.common.resources.CopyToOutputDirectoryResourceCompilation
3130import com.android.manifmerger.ManifestMerger2
3231import com.android.manifmerger.ManifestProvider
3332import com.android.utils.StdLogger
34- import com.github.jengelman.gradle.plugins.shadow.relocation.SimpleRelocator
33+ import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator
3534import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
3635import org.gradle.api.Plugin
3736import org.gradle.api.Project
3837import org.gradle.api.artifacts.Configuration
39- import org.gradle.kotlin.dsl.get
38+ import org.gradle.api.publish.maven.internal.publication.DefaultMavenPublication
39+ import org.gradle.api.publish.maven.tasks.PublishToMavenRepository
4040import org.gradle.kotlin.dsl.support.unzipTo
4141import org.gradle.kotlin.dsl.support.zipTo
4242import java.io.File
@@ -56,40 +56,39 @@ open class GreasePlugin : Plugin<Project> {
5656
5757 @Suppress(" NAME_SHADOWING" )
5858 override fun apply (target : Project ) {
59- require(target.plugins.hasPlugin(" com.android.library" )) {
60- " Grease must be applied after the com.android.library plugin."
61- }
62- val log = Logger (target, " grease" )
63- val android = target.extensions[" android" ] as LibraryExtension
64- val androidComponents = target.extensions.getByType(AndroidComponentsExtension ::class .java)
65- val greaseExtension = target.extensions.create(" grease" , GreaseExtension ::class .java)
66-
67- debugGreasyConfigurationHierarchy(target, log)
68-
69- // Create the configurations.
70- fun createConfigurations (isTransitive : Boolean ) {
71- target.createRootConfiguration(isTransitive, log)
72- target.createProductFlavorConfigurations(androidComponents, isTransitive, log)
73- target.createBuildTypeConfigurations(android.buildTypes, isTransitive, log)
74- target.createVariantConfigurations(androidComponents, isTransitive, log)
75- }
76- createConfigurations(false )
77- createConfigurations(true )
78-
79- fun configure (variant : Variant , vararg configurations : Configuration ) {
80- configureVariantManifest(target, variant, configurations, log)
81- configureVariantJniLibs(target, variant, configurations, log)
82- configureVariantResources(target, variant, configurations, log)
83- configureVariantSources(target, variant, configurations, greaseExtension, log)
84- configureVariantAssets(target, variant, configurations, log)
85- configureVariantProguardFiles(target, variant, configurations, log)
86- }
87- // Configure all variants.
88- androidComponents.onVariants { variant ->
89- val log = log.child(" configureVariant" )
90- log.d { " Configuring variant ${variant.name} ..." }
91- target.afterEvaluate {
92- configure(variant, target.greaseOf(variant), target.greaseOf(variant, true ))
59+ target.plugins.withId(" com.android.library" ) {
60+ val log = Logger (target, " grease" )
61+ val android = target.extensions.getByType(LibraryExtension ::class .java)
62+ val androidComponents = target.extensions.getByType(AndroidComponentsExtension ::class .java)
63+ val greaseExtension = target.extensions.create(" grease" , GreaseExtension ::class .java)
64+
65+ debugGreasyConfigurationHierarchy(target, log)
66+
67+ // Create the configurations.
68+ fun createConfigurations (isTransitive : Boolean ) {
69+ target.createRootConfiguration(isTransitive, log)
70+ target.createProductFlavorConfigurations(androidComponents, isTransitive, log)
71+ target.createBuildTypeConfigurations(android.buildTypes, isTransitive, log)
72+ target.createVariantConfigurations(androidComponents, isTransitive, log)
73+ }
74+ createConfigurations(false )
75+ createConfigurations(true )
76+
77+ fun configure (variant : Variant , vararg configurations : Configuration ) {
78+ configureVariantManifest(target, variant, configurations, log)
79+ configureVariantJniLibs(target, variant, configurations, log)
80+ configureVariantResources(target, variant, configurations, log)
81+ configureVariantSources(target, variant, configurations, greaseExtension, log)
82+ configureVariantAssets(target, variant, configurations, log)
83+ configureVariantProguardFiles(target, variant, configurations, log)
84+ }
85+ // Configure all variants.
86+ androidComponents.onVariants { variant ->
87+ val log = log.child(" configureVariant" )
88+ log.d { " Configuring variant ${variant.name} ..." }
89+ target.afterEvaluate {
90+ configure(variant, target.greaseOf(variant), target.greaseOf(variant, true ))
91+ }
9392 }
9493 }
9594 }
@@ -432,7 +431,7 @@ open class GreasePlugin : Plugin<Project> {
432431
433432 fun injectClasses (inputJar : File ) {
434433 log.d { " Processing inputJar=$inputJar outputDir=${jarExtractWorkdir} ..." }
435- val inputFiles = target.zipTree(inputJar).matching { include(" **/*.class" ) }
434+ val inputFiles = target.zipTree(inputJar).matching { include(" **/*.class" , " **/*.kotlin_module " ) }
436435 target.copy {
437436 from(inputFiles)
438437 into(jarExtractWorkdir)
@@ -466,7 +465,7 @@ open class GreasePlugin : Plugin<Project> {
466465 destinationDirectory.set(greaseShadowDir)
467466
468467 from(greaseProcessTask.get().outputs)
469- val packagesToReplace = mutableMapOf< String , String >()
468+ val addedPackagesNames = mutableSetOf< String >()
470469
471470 doFirst {
472471 target.delete(greaseShadowDir)
@@ -487,52 +486,35 @@ open class GreasePlugin : Plugin<Project> {
487486 .asSequence()
488487 .flatMap { inputFile -> inputFile.packageNames }
489488 .distinct()
490- .forEach { packageName ->
491- val newPackageName = " ${relocationPrefix} .$packageName "
489+ .map { packageName -> packageName to " ${relocationPrefix} .$packageName " }
490+ .distinct()
491+ .filterNot { (packageName, _) -> addedPackagesNames.any(packageName::contains) }
492+ .forEach { (packageName, newPackageName) ->
492493 log.d { " Relocate package from $packageName to $newPackageName " }
493494 relocate(packageName, newPackageName)
494- packagesToReplace[packageName] = newPackageName
495+ addedPackagesNames + = packageName
495496 }
496497 }
497498
498- greaseExtension.relocators.get().forEach { relocator ->
499- relocate(relocator)
500- if (relocator is SimpleRelocator ) {
501- packagesToReplace[relocator.pattern] = relocator.shadedPattern
502- }
503- }
504-
499+ greaseExtension.relocators.get().forEach<Relocator ?>(::relocate)
505500 greaseExtension.transformers.get().forEach(::transform)
501+ transform(KotlinModuleShadowTransformer (logger.child(" kotlin_module" )))
506502 }
507503
508504 doLast {
509505 val shadowJar = greaseShadowDir.file(jarFileName).asFile
510- val shadowManifest = greaseShadowDir.file(" AndroidManifest.xml" ).asFile
511506 log.d { " Copy shaded inputJar=${shadowJar} outputDir=$aarExtractWorkdir ..." }
512507 target.copy {
513508 from(shadowJar)
514509 into(aarExtractWorkdir)
515510 }
516511
517- val manifestWriter = shadowManifest.bufferedWriter()
518- val manifestReader = aarExtractWorkdir.file(" AndroidManifest.xml" ).asFile.bufferedReader()
519-
520- manifestReader.useLines { strings ->
521- strings
522- .map { string ->
523- packagesToReplace.entries.fold(string) { acc, (from, to) ->
524- acc.replace(from, to)
525- }
526- }.forEach {
527- manifestWriter.write(it)
528- manifestWriter.newLine()
529- }
530- }
531- manifestWriter.close()
532- target.copy {
533- from(shadowManifest)
534- into(aarExtractWorkdir)
535- }
512+ replacePackagesInFile(
513+ aarExtractWorkdir.file(" AndroidManifest.xml" ).asFile,
514+ greaseShadowDir.file(" AndroidManifest.xml" ).asFile,
515+ relocators,
516+ target,
517+ )
536518
537519 val oldArchive = bundleAar.archiveFile.get().asFile
538520 val archiveParent = oldArchive.parentFile
@@ -543,16 +525,48 @@ open class GreasePlugin : Plugin<Project> {
543525 }
544526
545527 bundleLibraryTask?.configure {
546- finalizedBy(greaseExpandTask)
528+ outputs.upToDateWhen { false }
529+ finalizedBy(greaseShadowTask)
547530 }
548531 greaseExpandTask.configure {
532+ mustRunAfter(bundleLibraryTask)
549533 finalizedBy(greaseProcessTask)
550534 }
551535 greaseProcessTask.configure {
536+ mustRunAfter(bundleLibraryTask)
552537 finalizedBy(greaseShadowTask)
553538 }
554539 }
555540
541+ private fun replacePackagesInFile (
542+ input : File ,
543+ output : File ,
544+ relocators : List <Relocator >,
545+ target : Project ,
546+ ) {
547+ val reader = input.bufferedReader()
548+ val writer = output.bufferedWriter()
549+ reader.useLines { strings ->
550+ strings
551+ .map { string ->
552+ relocators
553+ .filterNot { it is RClassRelocator }
554+ .fold(string) { acc, relocator ->
555+ relocator.applyToSourceContent(acc)
556+ }
557+ }.forEach {
558+ writer.write(it)
559+ writer.newLine()
560+ }
561+ }
562+ writer.close()
563+
564+ target.copy {
565+ from(output)
566+ into(input.parentFile)
567+ }
568+ }
569+
556570 /* *
557571 * Interesting tasks:
558572 * 1. generate<>Assets: See [MutableTaskContainer].
0 commit comments