Skip to content

Commit 8e1324f

Browse files
authored
Merge 99c7d4e into 956edd1
2 parents 956edd1 + 99c7d4e commit 8e1324f

File tree

3 files changed

+46
-15
lines changed

3 files changed

+46
-15
lines changed

buildSrc/src/main/java/com/google/firebase/gradle/plugins/VendorPlugin.kt

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,31 @@ import org.gradle.api.Plugin
3333
import org.gradle.api.Project
3434
import org.gradle.api.artifacts.Configuration
3535
import org.gradle.api.logging.Logger
36+
import org.gradle.api.provider.Property
37+
import org.gradle.api.provider.Provider
3638
import org.gradle.kotlin.dsl.apply
39+
import org.gradle.kotlin.dsl.create
40+
41+
abstract class VendorExtension {
42+
/** Controls dead code elimination, enabled if true. */
43+
abstract val optimize: Property<Boolean>
44+
45+
init {
46+
optimize.convention(true)
47+
}
48+
}
3749

3850
class VendorPlugin : Plugin<Project> {
3951
override fun apply(project: Project) {
52+
val vendorConfig = project.extensions.create<VendorExtension>("vendor")
4053
project.plugins.all {
4154
when (this) {
42-
is LibraryPlugin -> configureAndroid(project)
55+
is LibraryPlugin -> configureAndroid(project, vendorConfig)
4356
}
4457
}
4558
}
4659

47-
fun configureAndroid(project: Project) {
60+
fun configureAndroid(project: Project, vendorConfig: VendorExtension) {
4861
project.apply(plugin = "LicenseResolverPlugin")
4962

5063
val vendor = project.configurations.create("vendor")
@@ -71,7 +84,8 @@ class VendorPlugin : Plugin<Project> {
7184
},
7285
jarJarProvider = { jarJar.resolve() },
7386
project = project,
74-
logger = project.logger
87+
logger = project.logger,
88+
optimize = vendorConfig.optimize
7589
),
7690
logger = project.logger
7791
)
@@ -80,19 +94,35 @@ class VendorPlugin : Plugin<Project> {
8094
}
8195

8296
interface JarTransformer {
83-
fun transform(inputJar: File, outputJar: File, packagesToVendor: Set<String>)
97+
fun transform(
98+
inputJar: File,
99+
outputJar: File,
100+
ownPackages: Set<String>,
101+
packagesToVendor: Set<String>
102+
)
84103
}
85104

86105
class JarJarTransformer(
87106
private val parentPackageProvider: () -> String,
88107
private val jarJarProvider: () -> Collection<File>,
89108
private val project: Project,
90-
private val logger: Logger
109+
private val logger: Logger,
110+
private val optimize: Provider<Boolean>
91111
) : JarTransformer {
92-
override fun transform(inputJar: File, outputJar: File, packagesToVendor: Set<String>) {
112+
override fun transform(
113+
inputJar: File,
114+
outputJar: File,
115+
ownPackages: Set<String>,
116+
packagesToVendor: Set<String>
117+
) {
93118
val parentPackage = parentPackageProvider()
94119
val rulesFile = File.createTempFile(parentPackage, ".jarjar")
95120
rulesFile.printWriter().use {
121+
if (optimize.get()) {
122+
for (packageName in ownPackages) {
123+
it.println("keep $packageName.**")
124+
}
125+
}
96126
for (externalPackageName in packagesToVendor) {
97127
it.println("rule $externalPackageName.** $parentPackage.@0")
98128
}
@@ -227,7 +257,7 @@ class VendorTransform(
227257
zipAll(unzippedDir, jar)
228258
val outputJar = File(workDir, "output.jar")
229259

230-
jarTransformer.transform(jar, outputJar, externalPackageNames)
260+
jarTransformer.transform(jar, outputJar, ownPackageNames, externalPackageNames)
231261
return outputJar
232262
}
233263

buildSrc/src/test/kotlin/com/google/firebase/gradle/plugins/VendorTests.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,11 @@ class VendorPluginTests {
8686
)
8787

8888
// ImmutableList is not used, so it should be stripped out.
89-
assertThat(classes).doesNotContain("com/google/common/collect/ImmutableList.class")
89+
assertThat(classes).doesNotContain("com/example/com/google/common/collect/ImmutableList.class")
9090
}
9191

9292
@Test
93-
fun `vendor dagger excluding javax transitive deps and not using it should include dagger`() {
93+
fun `vendor dagger excluding javax transitive deps and not using it should not include dagger`() {
9494
val classes =
9595
buildWith(
9696
"""
@@ -113,12 +113,7 @@ class VendorPluginTests {
113113
)
114114
)
115115
// expected classes
116-
assertThat(classes)
117-
.containsAtLeast(
118-
"com/example/Hello.class",
119-
"com/example/BuildConfig.class",
120-
"com/example/dagger/Lazy.class"
121-
)
116+
assertThat(classes).containsExactly("com/example/Hello.class", "com/example/BuildConfig.class")
122117
}
123118

124119
@Test

transport/transport-runtime/transport-runtime.gradle

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ firebaseLibrary {
6767
}
6868
}
6969

70+
vendor {
71+
// Integration tests use dagger classes that are not used in the main SDK,
72+
// so we disable dead code elimination to ensure those classes are preserved.
73+
optimize = false
74+
}
75+
7076
android {
7177
compileSdkVersion project.targetSdkVersion
7278
defaultConfig {

0 commit comments

Comments
 (0)