blob: 7618c529f75d116ef4c627de5b722901a247229f [file] [log] [blame]
Vsevolod Tolstopyatov0f158122020-04-29 23:35:41 +03001/*
Vsevolod Tolstopyatov41a2e302021-02-04 07:16:48 -08002 * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
Vsevolod Tolstopyatov0f158122020-04-29 23:35:41 +03003 */
4
Steve Elliottca095be2022-07-25 14:26:10 +00005import kotlinx.kover.api.*
6
Vsevolod Tolstopyatov0f158122020-04-29 23:35:41 +03007configurations {
8 create("r8")
9}
10
Vsevolod Tolstopyatovad6211c2021-02-10 00:21:58 -080011repositories {
12 mavenCentral()
Vsevolod Tolstopyatovad6211c2021-02-10 00:21:58 -080013}
Steve Elliottca095be2022-07-25 14:26:10 +000014
15project.configureAar()
16
Vsevolod Tolstopyatov0f158122020-04-29 23:35:41 +030017dependencies {
Steve Elliottca095be2022-07-25 14:26:10 +000018 configureAarUnpacking()
19
Vsevolod Tolstopyatov0f158122020-04-29 23:35:41 +030020 compileOnly("com.google.android:android:${version("android")}")
21 compileOnly("androidx.annotation:annotation:${version("androidx_annotation")}")
22
23 testImplementation("com.google.android:android:${version("android")}")
24 testImplementation("org.robolectric:robolectric:${version("robolectric")}")
Steve Elliottca095be2022-07-25 14:26:10 +000025 // Required by robolectric
26 testImplementation("androidx.test:core:1.2.0")
27 testImplementation("androidx.test:monitor:1.2.0")
Vsevolod Tolstopyatov0f158122020-04-29 23:35:41 +030028
Steve Elliottca095be2022-07-25 14:26:10 +000029
30 testImplementation("org.smali:baksmali:${version("baksmali")}")
Vsevolod Tolstopyatov582086c2021-06-04 16:00:52 +030031 "r8"("com.android.tools.build:builder:7.1.0-alpha01")
Vsevolod Tolstopyatov0f158122020-04-29 23:35:41 +030032}
33
Vsevolod Tolstopyatov0f158122020-04-29 23:35:41 +030034val optimizedDexDir = File(buildDir, "dex-optim/")
35val unOptimizedDexDir = File(buildDir, "dex-unoptim/")
36
37val optimizedDexFile = File(optimizedDexDir, "classes.dex")
38val unOptimizedDexFile = File(unOptimizedDexDir, "classes.dex")
39
Victor Turansky964cd922020-05-02 19:52:56 +030040val runR8 by tasks.registering(RunR8::class) {
Vsevolod Tolstopyatov0f158122020-04-29 23:35:41 +030041 outputDex = optimizedDexDir
42 inputConfig = file("testdata/r8-test-rules.pro")
43
44 dependsOn("jar")
45}
46
Victor Turansky964cd922020-05-02 19:52:56 +030047val runR8NoOptim by tasks.registering(RunR8::class) {
Vsevolod Tolstopyatov0f158122020-04-29 23:35:41 +030048 outputDex = unOptimizedDexDir
49 inputConfig = file("testdata/r8-test-rules-no-optim.pro")
50
51 dependsOn("jar")
52}
53
Vsevolod Tolstopyatov582086c2021-06-04 16:00:52 +030054tasks.test {
55 // Ensure the R8-processed dex is built and supply its path as a property to the test.
56 dependsOn(runR8)
57 dependsOn(runR8NoOptim)
Vsevolod Tolstopyatov0f158122020-04-29 23:35:41 +030058
Vsevolod Tolstopyatov582086c2021-06-04 16:00:52 +030059 inputs.files(optimizedDexFile, unOptimizedDexFile)
60
61 systemProperty("dexPath", optimizedDexFile.absolutePath)
62 systemProperty("noOptimDexPath", unOptimizedDexFile.absolutePath)
63
64 // Output custom metric with the size of the optimized dex
65 doLast {
66 println("##teamcity[buildStatisticValue key='optimizedDexSize' value='${optimizedDexFile.length()}']")
67 }
68}
Vsevolod Tolstopyatov0f158122020-04-29 23:35:41 +030069
Victor Turansky964cd922020-05-02 19:52:56 +030070externalDocumentationLink(
71 url = "https://developer.android.com/reference/"
72)
Vsevolod Tolstopyatov582086c2021-06-04 16:00:52 +030073/*
74 * Task used by our ui/android tests to test minification results and keep track of size of the binary.
75 */
76open class RunR8 : JavaExec() {
77
78 @OutputDirectory
79 lateinit var outputDex: File
80
81 @InputFile
82 lateinit var inputConfig: File
83
84 @InputFile
85 val inputConfigCommon: File = File("testdata/r8-test-common.pro")
86
87 @InputFiles
88 val jarFile: File = project.tasks.named<Zip>("jar").get().archivePath
89
90 init {
91 classpath = project.configurations["r8"]
92 main = "com.android.tools.r8.R8"
93 }
94
95 override fun exec() {
96 // Resolve classpath only during execution
97 val arguments = mutableListOf(
98 "--release",
99 "--no-desugaring",
100 "--min-api", "26",
101 "--output", outputDex.absolutePath,
102 "--pg-conf", inputConfig.absolutePath
103 )
104 arguments.addAll(project.configurations["runtimeClasspath"].files.map { it.absolutePath })
105 arguments.add(jarFile.absolutePath)
106
107 args = arguments
108
109 project.delete(outputDex)
110 outputDex.mkdirs()
111
112 super.exec()
113 }
114}
115
Steve Elliottca095be2022-07-25 14:26:10 +0000116tasks.withType<Test> {
117 extensions.configure<KoverTaskExtension> {
118 excludes = excludes + listOf("com.android.*", "android.*") // Exclude robolectric-generated classes
119 }
120}