<lambda>null1 configurations {
2 create("r8")
3 }
4
<lambda>null5 repositories {
6 mavenCentral()
7 }
8
9 project.configureAar()
10
<lambda>null11 dependencies {
12 configureAarUnpacking()
13
14 compileOnly("com.google.android:android:${version("android")}")
15 compileOnly("androidx.annotation:annotation:${version("androidx_annotation")}")
16
17 testImplementation("com.google.android:android:${version("android")}")
18 testImplementation("org.robolectric:robolectric:${version("robolectric")}")
19 // Required by robolectric
20 testImplementation("androidx.test:core:1.2.0")
21 testImplementation("androidx.test:monitor:1.2.0")
22
23
24 testImplementation("org.smali:baksmali:${version("baksmali")}")
25 "r8"("com.android.tools.build:builder:8.1.0")
26 }
27
28 val optimizedDexDir = layout.buildDirectory.dir("dex-optim/")
29 val unOptimizedDexDir = layout.buildDirectory.dir("dex-unoptim/")
30
<lambda>null31 val optimizedDexFile = optimizedDexDir.map { it.dir("classes.dex") } .get().asFile
<lambda>null32 val unOptimizedDexFile = unOptimizedDexDir.map { it.dir("classes.dex") }.get().asFile
33
<lambda>null34 val runR8 by tasks.registering(RunR8::class) {
35 outputDex = optimizedDexDir.get().asFile
36 inputConfig = file("testdata/r8-test-rules.pro")
37
38 dependsOn("jar")
39 }
40
<lambda>null41 val runR8NoOptim by tasks.registering(RunR8::class) {
42 outputDex = unOptimizedDexDir.get().asFile
43 inputConfig = file("testdata/r8-test-rules-no-optim.pro")
44
45 dependsOn("jar")
46 }
47
<lambda>null48 tasks.test {
49 // Ensure the R8-processed dex is built and supply its path as a property to the test.
50 dependsOn(runR8)
51 dependsOn(runR8NoOptim)
52
53 inputs.files(optimizedDexFile, unOptimizedDexFile)
54
55 systemProperty("dexPath", optimizedDexFile.absolutePath)
56 systemProperty("noOptimDexPath", unOptimizedDexFile.absolutePath)
57
58 // Output custom metric with the size of the optimized dex
59 doLast {
60 println("##teamcity[buildStatisticValue key='optimizedDexSize' value='${optimizedDexFile.length()}']")
61 }
62 }
63
64 externalDocumentationLink(
65 url = "https://developer.android.com/reference/"
66 )
67 /*
68 * Task used by our ui/android tests to test minification results and keep track of size of the binary.
69 */
70 open class RunR8 : JavaExec() {
71
72 @OutputDirectory
73 lateinit var outputDex: File
74
75 @InputFile
76 lateinit var inputConfig: File
77
78 @InputFile
79 val inputConfigCommon: File = File("testdata/r8-test-common.pro")
80
81 @InputFiles
82 val jarFile: File = project.tasks.named<Zip>("jar").get().archiveFile.get().asFile
83
84 init {
85 classpath = project.configurations["r8"]
86 mainClass = "com.android.tools.r8.R8"
87 }
88
execnull89 override fun exec() {
90 // Resolve classpath only during execution
91 val arguments = mutableListOf(
92 "--release",
93 "--no-desugaring",
94 "--min-api", "26",
95 "--output", outputDex.absolutePath,
96 "--pg-conf", inputConfig.absolutePath
97 )
98 arguments.addAll(project.configurations["runtimeClasspath"].files.map { it.absolutePath })
99 arguments.add(jarFile.absolutePath)
100
101 args = arguments
102
103 project.delete(outputDex)
104 outputDex.mkdirs()
105
106 super.exec()
107 }
108 }
109