/* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ configurations { create("r8") } repositories { mavenCentral() jcenter() // https://youtrack.jetbrains.com/issue/IDEA-261387 } dependencies { compileOnly("com.google.android:android:${version("android")}") compileOnly("androidx.annotation:annotation:${version("androidx_annotation")}") testImplementation("com.google.android:android:${version("android")}") testImplementation("org.robolectric:robolectric:${version("robolectric")}") testImplementation("org.smali:baksmali:${version("baksmali")}") "r8"("com.android.tools.build:builder:7.1.0-alpha01") } val optimizedDexDir = File(buildDir, "dex-optim/") val unOptimizedDexDir = File(buildDir, "dex-unoptim/") val optimizedDexFile = File(optimizedDexDir, "classes.dex") val unOptimizedDexFile = File(unOptimizedDexDir, "classes.dex") val runR8 by tasks.registering(RunR8::class) { outputDex = optimizedDexDir inputConfig = file("testdata/r8-test-rules.pro") dependsOn("jar") } val runR8NoOptim by tasks.registering(RunR8::class) { outputDex = unOptimizedDexDir inputConfig = file("testdata/r8-test-rules-no-optim.pro") dependsOn("jar") } tasks.test { // Ensure the R8-processed dex is built and supply its path as a property to the test. dependsOn(runR8) dependsOn(runR8NoOptim) inputs.files(optimizedDexFile, unOptimizedDexFile) systemProperty("dexPath", optimizedDexFile.absolutePath) systemProperty("noOptimDexPath", unOptimizedDexFile.absolutePath) // Output custom metric with the size of the optimized dex doLast { println("##teamcity[buildStatisticValue key='optimizedDexSize' value='${optimizedDexFile.length()}']") } } externalDocumentationLink( url = "https://developer.android.com/reference/" ) /* * Task used by our ui/android tests to test minification results and keep track of size of the binary. */ open class RunR8 : JavaExec() { @OutputDirectory lateinit var outputDex: File @InputFile lateinit var inputConfig: File @InputFile val inputConfigCommon: File = File("testdata/r8-test-common.pro") @InputFiles val jarFile: File = project.tasks.named("jar").get().archivePath init { classpath = project.configurations["r8"] main = "com.android.tools.r8.R8" } override fun exec() { // Resolve classpath only during execution val arguments = mutableListOf( "--release", "--no-desugaring", "--min-api", "26", "--output", outputDex.absolutePath, "--pg-conf", inputConfig.absolutePath ) arguments.addAll(project.configurations["runtimeClasspath"].files.map { it.absolutePath }) arguments.add(jarFile.absolutePath) args = arguments project.delete(outputDex) outputDex.mkdirs() super.exec() } }