Skip to content

Commit 9dc9c8c

Browse files
committed
Support Splits/Multi-APKs and universal APK modes.
1 parent 1659593 commit 9dc9c8c

File tree

6 files changed

+142
-18
lines changed

6 files changed

+142
-18
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Change Log
22

3+
## Unreleased
4+
5+
- Support Splits/Multi-APKs and universal APK modes.
6+
37
## 1.3.2
48

59
### Changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ dependencies {
9393
compileOnly(libs.agp.common)
9494
testImplementation(libs.junit)
9595
testImplementation(libs.truth)
96+
testImplementation(libs.testParameterInjector)
9697
fixtureClasspath(libs.agp.build.flatMap { dependency ->
9798
fixtureAgpVersion.map { version ->
9899
"${dependency.group}:${dependency.name}:$version"

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ detekt = "1.23.7"
77
mavenPublish = "0.29.0"
88
junit = "4.13.2"
99
truth = "1.1.3"
10+
testParameterInjector = "1.18"
1011
toolchainsResolver = "0.9.0"
1112

1213
[libraries]
@@ -16,6 +17,7 @@ agp-build = { module = "com.android.tools.build:gradle", version.ref = "agp" }
1617
agp-common = { module = "com.android.tools:common", version.ref = "agp-common" }
1718
junit = { module = "junit:junit", version.ref = "junit" }
1819
truth = { module = "com.google.truth:truth", version.ref = "truth" }
20+
testParameterInjector = { group = "com.google.testparameterinjector", name = "test-parameter-injector", version.ref = "testParameterInjector" }
1921

2022
[plugins]
2123
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }

src/functionalTest/kotlin/io/github/reactivecircus/appversioning/AppVersioningPluginIntegrationTest.kt

Lines changed: 82 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
package io.github.reactivecircus.appversioning
44

55
import com.google.common.truth.Truth.assertThat
6+
import com.google.testing.junit.testparameterinjector.TestParameter
7+
import com.google.testing.junit.testparameterinjector.TestParameterInjector
68
import io.github.reactivecircus.appversioning.fixtures.AppProjectTemplate
79
import io.github.reactivecircus.appversioning.fixtures.LibraryProjectTemplate
810
import io.github.reactivecircus.appversioning.fixtures.withFixtureRunner
@@ -13,8 +15,10 @@ import org.gradle.testkit.runner.TaskOutcome
1315
import org.junit.Rule
1416
import org.junit.Test
1517
import org.junit.rules.TemporaryFolder
18+
import org.junit.runner.RunWith
1619
import java.io.File
1720

21+
@RunWith(TestParameterInjector::class)
1822
class AppVersioningPluginIntegrationTest {
1923

2024
@get:Rule
@@ -65,13 +69,15 @@ class AppVersioningPluginIntegrationTest {
6569
}
6670

6771
@Test
68-
fun `plugin tasks are registered for Android App project with product flavors`() {
72+
fun `plugin tasks are registered for Android App project with product flavors`(
73+
@TestParameter useKts: Boolean
74+
) {
6975
GitClient.initialize(fixtureDir.root)
7076

7177
val flavors = listOf("mock", "prod")
7278
withFixtureRunner(
7379
fixtureDir = fixtureDir,
74-
subprojects = listOf(AppProjectTemplate(flavors = flavors))
80+
subprojects = listOf(AppProjectTemplate(useKts = useKts, flavors = flavors))
7581
).runAndCheckResult(
7682
"tasks",
7783
"--group=versioning"
@@ -199,15 +205,87 @@ class AppVersioningPluginIntegrationTest {
199205
}
200206

201207
@Test
202-
fun `plugin generates versionCode and versionName for the assembled APK when assemble task is run`() {
208+
fun `plugin generates versionCode and versionName for the assembled APK when assemble task is run`(
209+
@TestParameter useKts: Boolean
210+
) {
203211
GitClient.initialize(fixtureDir.root).apply {
204212
val commitId = commit(message = "1st commit.")
205213
tag(name = "1.2.3", message = "1st tag", commitId = commitId)
206214
}
207215

208216
withFixtureRunner(
209217
fixtureDir = fixtureDir,
210-
subprojects = listOf(AppProjectTemplate())
218+
subprojects = listOf(AppProjectTemplate(useKts = useKts))
219+
).runAndCheckResult(
220+
"assembleRelease"
221+
) {
222+
val versionCodeFileContent = File(
223+
fixtureDir.root,
224+
"app/build/outputs/app_versioning/release/version_code.txt"
225+
).readText()
226+
val versionNameFileContent = File(
227+
fixtureDir.root,
228+
"app/build/outputs/app_versioning/release/version_name.txt"
229+
).readText()
230+
231+
assertThat(task(":app:generateAppVersionInfoForRelease")?.outcome).isEqualTo(TaskOutcome.SUCCESS)
232+
assertThat(task(":app:assembleRelease")?.outcome).isEqualTo(TaskOutcome.SUCCESS)
233+
234+
assertThat(output).contains("Generated app version code: 10203.")
235+
assertThat(output).contains("Generated app version name: \"1.2.3\".")
236+
237+
assertThat(versionCodeFileContent).isEqualTo("10203")
238+
assertThat(versionNameFileContent).isEqualTo("1.2.3")
239+
}
240+
}
241+
242+
@Test
243+
fun `plugin generates versionCode and versionName for the assembled APKs when splits-APKs is enabled`(
244+
@TestParameter useKts: Boolean
245+
) {
246+
GitClient.initialize(fixtureDir.root).apply {
247+
val commitId = commit(message = "1st commit.")
248+
tag(name = "1.2.3", message = "1st tag", commitId = commitId)
249+
}
250+
251+
withFixtureRunner(
252+
fixtureDir = fixtureDir,
253+
subprojects = listOf(AppProjectTemplate(useKts = useKts, splitsApks = true))
254+
).runAndCheckResult(
255+
"assembleRelease"
256+
) {
257+
val versionCodeFileContent = File(
258+
fixtureDir.root,
259+
"app/build/outputs/app_versioning/release/version_code.txt"
260+
).readText()
261+
val versionNameFileContent = File(
262+
fixtureDir.root,
263+
"app/build/outputs/app_versioning/release/version_name.txt"
264+
).readText()
265+
266+
assertThat(task(":app:generateAppVersionInfoForRelease")?.outcome).isEqualTo(TaskOutcome.SUCCESS)
267+
assertThat(task(":app:assembleRelease")?.outcome).isEqualTo(TaskOutcome.SUCCESS)
268+
269+
assertThat(output).contains("Generated app version code: 10203.")
270+
assertThat(output).contains("Generated app version name: \"1.2.3\".")
271+
272+
assertThat(versionCodeFileContent).isEqualTo("10203")
273+
assertThat(versionNameFileContent).isEqualTo("1.2.3")
274+
}
275+
}
276+
277+
@Test
278+
fun `plugin generates versionCode and versionName for the assembled APKs when splits-APKs is enabled and universal mode is on`(
279+
@TestParameter useKts: Boolean
280+
) {
281+
GitClient.initialize(fixtureDir.root).apply {
282+
val commitId = commit(message = "1st commit.")
283+
tag(name = "1.2.3", message = "1st tag", commitId = commitId)
284+
}
285+
286+
withFixtureRunner(
287+
fixtureDir = fixtureDir,
288+
subprojects = listOf(AppProjectTemplate(useKts = useKts, splitsApks = true, universalApk = true))
211289
).runAndCheckResult(
212290
"assembleRelease"
213291
) {

src/functionalTest/kotlin/io/github/reactivecircus/appversioning/fixtures/ProjectTemplates.kt

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,16 @@ fun gradlePropertiesFileContent(enableConfigurationCache: Boolean): String {
4343
""".trimIndent()
4444
}
4545

46-
abstract class AndroidProjectTemplate {
46+
sealed class AndroidProjectTemplate {
4747
abstract val projectName: String
4848
abstract val pluginExtension: String?
4949
abstract val useKts: Boolean
5050
abstract val flavors: List<String>
51-
abstract val isAppProject: Boolean
5251

5352
val buildFileContent: String get() = if (useKts) ktsBuildFileContent else groovyBuildFileContent
5453

54+
private val isAppProject = this is AppProjectTemplate
55+
5556
private val ktsBuildFileContent: String
5657
get() {
5758
val flavorConfigs = if (flavors.isNotEmpty()) {
@@ -64,6 +65,24 @@ abstract class AndroidProjectTemplate {
6465
} else {
6566
""
6667
}
68+
val abiConfigs = if (this is AppProjectTemplate) {
69+
if (splitsApks) {
70+
"""
71+
splits {
72+
abi {
73+
isEnable = true
74+
reset()
75+
include("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
76+
isUniversalApk = $universalApk
77+
}
78+
}
79+
""".trimIndent()
80+
} else {
81+
""
82+
}
83+
} else {
84+
""
85+
}
6786
return """
6887
plugins {
6988
id("com.android.${if (isAppProject) "application" else "library"}")
@@ -84,6 +103,8 @@ abstract class AndroidProjectTemplate {
84103
lintOptions.isCheckReleaseBuilds = false
85104
86105
$flavorConfigs
106+
107+
$abiConfigs
87108
}
88109
""".trimIndent()
89110
}
@@ -100,6 +121,24 @@ abstract class AndroidProjectTemplate {
100121
} else {
101122
""
102123
}
124+
val abiConfigs = if (this is AppProjectTemplate) {
125+
if (splitsApks) {
126+
"""
127+
splits {
128+
abi {
129+
enable true
130+
reset()
131+
include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
132+
universalApk $universalApk
133+
}
134+
}
135+
""".trimIndent()
136+
} else {
137+
""
138+
}
139+
} else {
140+
""
141+
}
103142
return """
104143
plugins {
105144
id 'com.android.${if (isAppProject) "application" else "library"}'
@@ -122,6 +161,8 @@ abstract class AndroidProjectTemplate {
122161
}
123162
124163
$flavorConfigs
164+
165+
$abiConfigs
125166
}
126167
""".trimIndent()
127168
}
@@ -141,16 +182,14 @@ class AppProjectTemplate(
141182
override val projectName: String = "app",
142183
override val pluginExtension: String? = null,
143184
override val useKts: Boolean = true,
144-
override val flavors: List<String> = emptyList()
145-
) : AndroidProjectTemplate() {
146-
override val isAppProject: Boolean = true
147-
}
185+
override val flavors: List<String> = emptyList(),
186+
val splitsApks: Boolean = false,
187+
val universalApk: Boolean = false,
188+
) : AndroidProjectTemplate()
148189

149190
class LibraryProjectTemplate(
150191
override val projectName: String = "library",
151192
override val pluginExtension: String? = null,
152193
override val useKts: Boolean = true,
153194
override val flavors: List<String> = emptyList()
154-
) : AndroidProjectTemplate() {
155-
override val isAppProject: Boolean = false
156-
}
195+
) : AndroidProjectTemplate()

src/main/kotlin/io/github/reactivecircus/appversioning/AppVersioningPlugin.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package io.github.reactivecircus.appversioning
33
import com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION
44
import com.android.build.api.variant.ApplicationAndroidComponentsExtension
55
import com.android.build.api.variant.ApplicationVariant
6-
import com.android.build.api.variant.VariantOutputConfiguration
76
import com.android.build.gradle.AppPlugin
87
import io.github.reactivecircus.appversioning.tasks.GenerateAppVersionInfo
98
import io.github.reactivecircus.appversioning.tasks.PrintAppVersionInfo
@@ -15,7 +14,7 @@ import org.gradle.kotlin.dsl.withType
1514
import org.gradle.language.nativeplatform.internal.BuildType
1615
import java.io.File
1716
import java.lang.module.ModuleDescriptor.Version
18-
import java.util.Locale
17+
import java.util.*
1918
import java.util.concurrent.atomic.AtomicBoolean
2019

2120
/**
@@ -60,9 +59,10 @@ class AppVersioningPlugin : Plugin<Project> {
6059

6160
project.registerPrintAppVersionInfoTask(variantName = variant.name)
6261

63-
val mainOutput = variant.outputs.single { it.outputType == VariantOutputConfiguration.OutputType.SINGLE }
64-
mainOutput.versionCode.set(generatedVersionCode)
65-
mainOutput.versionName.set(generatedVersionName)
62+
variant.outputs.forEach { output ->
63+
output.versionCode.set(generatedVersionCode)
64+
output.versionName.set(generatedVersionName)
65+
}
6666
}
6767
}
6868
}

0 commit comments

Comments
 (0)