1*cd0cc2e3SAndroid Build Coastguard Workerbuildscript { 2*cd0cc2e3SAndroid Build Coastguard Worker repositories { 3*cd0cc2e3SAndroid Build Coastguard Worker google() 4*cd0cc2e3SAndroid Build Coastguard Worker mavenCentral() 5*cd0cc2e3SAndroid Build Coastguard Worker } 6*cd0cc2e3SAndroid Build Coastguard Worker dependencies { 7*cd0cc2e3SAndroid Build Coastguard Worker classpath libs.android.tools 8*cd0cc2e3SAndroid Build Coastguard Worker } 9*cd0cc2e3SAndroid Build Coastguard Worker} 10*cd0cc2e3SAndroid Build Coastguard Worker 11*cd0cc2e3SAndroid Build Coastguard Workerdescription = 'Conscrypt: Android Benchmarks' 12*cd0cc2e3SAndroid Build Coastguard Worker 13*cd0cc2e3SAndroid Build Coastguard Workerext { 14*cd0cc2e3SAndroid Build Coastguard Worker androidHome = "$System.env.ANDROID_HOME" 15*cd0cc2e3SAndroid Build Coastguard Worker androidSdkInstalled = file("$androidHome").exists() 16*cd0cc2e3SAndroid Build Coastguard Worker androidVersionCode = 1 17*cd0cc2e3SAndroid Build Coastguard Worker androidVersionName = "$version" 18*cd0cc2e3SAndroid Build Coastguard Worker androidMinSdkVersion = 26 19*cd0cc2e3SAndroid Build Coastguard Worker androidTargetSdkVersion = 26 20*cd0cc2e3SAndroid Build Coastguard Worker} 21*cd0cc2e3SAndroid Build Coastguard Worker 22*cd0cc2e3SAndroid Build Coastguard Workerif (androidSdkInstalled) { 23*cd0cc2e3SAndroid Build Coastguard Worker apply plugin: 'com.android.library' 24*cd0cc2e3SAndroid Build Coastguard Worker 25*cd0cc2e3SAndroid Build Coastguard Worker android { 26*cd0cc2e3SAndroid Build Coastguard Worker namespace "org.conscrypt" 27*cd0cc2e3SAndroid Build Coastguard Worker compileSdkVersion androidTargetSdkVersion 28*cd0cc2e3SAndroid Build Coastguard Worker 29*cd0cc2e3SAndroid Build Coastguard Worker defaultConfig { 30*cd0cc2e3SAndroid Build Coastguard Worker minSdkVersion androidMinSdkVersion 31*cd0cc2e3SAndroid Build Coastguard Worker targetSdkVersion androidTargetSdkVersion 32*cd0cc2e3SAndroid Build Coastguard Worker versionCode androidVersionCode 33*cd0cc2e3SAndroid Build Coastguard Worker versionName androidVersionName 34*cd0cc2e3SAndroid Build Coastguard Worker } 35*cd0cc2e3SAndroid Build Coastguard Worker lintOptions { 36*cd0cc2e3SAndroid Build Coastguard Worker // Some Caliper classes reference packages that don't exist on Android 37*cd0cc2e3SAndroid Build Coastguard Worker disable 'InvalidPackage' 38*cd0cc2e3SAndroid Build Coastguard Worker } 39*cd0cc2e3SAndroid Build Coastguard Worker sourceSets.main { 40*cd0cc2e3SAndroid Build Coastguard Worker java { 41*cd0cc2e3SAndroid Build Coastguard Worker srcDirs = [ 42*cd0cc2e3SAndroid Build Coastguard Worker "src/main/java" 43*cd0cc2e3SAndroid Build Coastguard Worker ] 44*cd0cc2e3SAndroid Build Coastguard Worker } 45*cd0cc2e3SAndroid Build Coastguard Worker } 46*cd0cc2e3SAndroid Build Coastguard Worker } 47*cd0cc2e3SAndroid Build Coastguard Worker 48*cd0cc2e3SAndroid Build Coastguard Worker configurations { 49*cd0cc2e3SAndroid Build Coastguard Worker // For the depsJar task, we need to create a config we can pull libraries from to 50*cd0cc2e3SAndroid Build Coastguard Worker // make the complete JAR. Some we do not want the transitive dependencies because 51*cd0cc2e3SAndroid Build Coastguard Worker // they are already included on the Android system. 52*cd0cc2e3SAndroid Build Coastguard Worker depsJarApi 53*cd0cc2e3SAndroid Build Coastguard Worker depsJarApi.transitive = true 54*cd0cc2e3SAndroid Build Coastguard Worker 55*cd0cc2e3SAndroid Build Coastguard Worker depsJarImplementation 56*cd0cc2e3SAndroid Build Coastguard Worker depsJarImplementation.transitive = false 57*cd0cc2e3SAndroid Build Coastguard Worker 58*cd0cc2e3SAndroid Build Coastguard Worker implementation.extendsFrom(depsJarApi) 59*cd0cc2e3SAndroid Build Coastguard Worker implementation.extendsFrom(depsJarImplementation) 60*cd0cc2e3SAndroid Build Coastguard Worker } 61*cd0cc2e3SAndroid Build Coastguard Worker 62*cd0cc2e3SAndroid Build Coastguard Worker dependencies { 63*cd0cc2e3SAndroid Build Coastguard Worker depsJarApi project(path: ':conscrypt-android'), 64*cd0cc2e3SAndroid Build Coastguard Worker libs.bouncycastle.provider, 65*cd0cc2e3SAndroid Build Coastguard Worker libs.bouncycastle.apis 66*cd0cc2e3SAndroid Build Coastguard Worker 67*cd0cc2e3SAndroid Build Coastguard Worker depsJarImplementation project(':conscrypt-benchmark-base'), 68*cd0cc2e3SAndroid Build Coastguard Worker project(path: ":conscrypt-testing", configuration: "shadow"), 69*cd0cc2e3SAndroid Build Coastguard Worker project(':conscrypt-libcore-stub') 70*cd0cc2e3SAndroid Build Coastguard Worker 71*cd0cc2e3SAndroid Build Coastguard Worker implementation libs.caliper 72*cd0cc2e3SAndroid Build Coastguard Worker } 73*cd0cc2e3SAndroid Build Coastguard Worker 74*cd0cc2e3SAndroid Build Coastguard Worker // This task bundles up everything we're going to send to the device into a single jar. 75*cd0cc2e3SAndroid Build Coastguard Worker // We need to include all the Conscrypt code plus the Bouncy Castle jar because the platform 76*cd0cc2e3SAndroid Build Coastguard Worker // version of Bouncy Castle is jarjared. 77*cd0cc2e3SAndroid Build Coastguard Worker // 78*cd0cc2e3SAndroid Build Coastguard Worker // Since we're examining the contents of the archive files, we need to prevent evaluation of 79*cd0cc2e3SAndroid Build Coastguard Worker // the .aar and .jar contents before the actual archives are built. To do this we create a 80*cd0cc2e3SAndroid Build Coastguard Worker // configure task where the "from" contents is set inside a doLast stanza to ensure it is run 81*cd0cc2e3SAndroid Build Coastguard Worker // after the execution phase of the "assemble" task. 82*cd0cc2e3SAndroid Build Coastguard Worker def configureDepsJar = tasks.register("configureDepsJar") { 83*cd0cc2e3SAndroid Build Coastguard Worker dependsOn assemble, \ 84*cd0cc2e3SAndroid Build Coastguard Worker configurations.depsJarApi.artifacts, \ 85*cd0cc2e3SAndroid Build Coastguard Worker configurations.depsJarImplementation.artifacts 86*cd0cc2e3SAndroid Build Coastguard Worker doLast { 87*cd0cc2e3SAndroid Build Coastguard Worker depsJar.from { 88*cd0cc2e3SAndroid Build Coastguard Worker [ 89*cd0cc2e3SAndroid Build Coastguard Worker configurations.depsJarApi, 90*cd0cc2e3SAndroid Build Coastguard Worker configurations.depsJarImplementation, 91*cd0cc2e3SAndroid Build Coastguard Worker configurations.archives.artifacts.file 92*cd0cc2e3SAndroid Build Coastguard Worker ].collect { config -> 93*cd0cc2e3SAndroid Build Coastguard Worker config.findResults { archive -> 94*cd0cc2e3SAndroid Build Coastguard Worker // For Android library archives (.aar), we need to expand the classes.jar 95*cd0cc2e3SAndroid Build Coastguard Worker // inside as well as including all the jni libraries. 96*cd0cc2e3SAndroid Build Coastguard Worker if (archive.name.endsWith(".aar")) { 97*cd0cc2e3SAndroid Build Coastguard Worker [ 98*cd0cc2e3SAndroid Build Coastguard Worker zipTree(archive).matching { 99*cd0cc2e3SAndroid Build Coastguard Worker include 'classes.jar' 100*cd0cc2e3SAndroid Build Coastguard Worker }.collect { file -> 101*cd0cc2e3SAndroid Build Coastguard Worker zipTree(file) 102*cd0cc2e3SAndroid Build Coastguard Worker }, 103*cd0cc2e3SAndroid Build Coastguard Worker zipTree(archive).matching { 104*cd0cc2e3SAndroid Build Coastguard Worker include '**/*.so' 105*cd0cc2e3SAndroid Build Coastguard Worker } 106*cd0cc2e3SAndroid Build Coastguard Worker ] 107*cd0cc2e3SAndroid Build Coastguard Worker } else if (archive.name.endsWith(".jar")) { 108*cd0cc2e3SAndroid Build Coastguard Worker // Bouncy Castle signs their jar, which causes our combined jar to fail 109*cd0cc2e3SAndroid Build Coastguard Worker // to verify. Just strip out the signature files. 110*cd0cc2e3SAndroid Build Coastguard Worker zipTree(archive).matching { 111*cd0cc2e3SAndroid Build Coastguard Worker exclude 'META-INF/*.SF' 112*cd0cc2e3SAndroid Build Coastguard Worker exclude 'META-INF/*.DSA' 113*cd0cc2e3SAndroid Build Coastguard Worker exclude 'META-INF/*.EC' 114*cd0cc2e3SAndroid Build Coastguard Worker exclude 'META-INF/*.RSA' 115*cd0cc2e3SAndroid Build Coastguard Worker } 116*cd0cc2e3SAndroid Build Coastguard Worker } 117*cd0cc2e3SAndroid Build Coastguard Worker } 118*cd0cc2e3SAndroid Build Coastguard Worker } 119*cd0cc2e3SAndroid Build Coastguard Worker } 120*cd0cc2e3SAndroid Build Coastguard Worker } 121*cd0cc2e3SAndroid Build Coastguard Worker } 122*cd0cc2e3SAndroid Build Coastguard Worker 123*cd0cc2e3SAndroid Build Coastguard Worker def depsJar = tasks.register("depsJar", Jar) { 124*cd0cc2e3SAndroid Build Coastguard Worker dependsOn configureDepsJar 125*cd0cc2e3SAndroid Build Coastguard Worker archiveName = 'bundled-deps.jar' 126*cd0cc2e3SAndroid Build Coastguard Worker } 127*cd0cc2e3SAndroid Build Coastguard Worker 128*cd0cc2e3SAndroid Build Coastguard Worker def getAndroidDeviceAbi = tasks.register("getAndroidDeviceAbi") { 129*cd0cc2e3SAndroid Build Coastguard Worker doLast { 130*cd0cc2e3SAndroid Build Coastguard Worker new ByteArrayOutputStream().withStream { os -> 131*cd0cc2e3SAndroid Build Coastguard Worker def result = exec { 132*cd0cc2e3SAndroid Build Coastguard Worker executable android.adbExecutable 133*cd0cc2e3SAndroid Build Coastguard Worker args 'shell', 'getprop', 'ro.product.cpu.abi' 134*cd0cc2e3SAndroid Build Coastguard Worker standardOutput = os 135*cd0cc2e3SAndroid Build Coastguard Worker } 136*cd0cc2e3SAndroid Build Coastguard Worker project.ext.androidDeviceAbi = os.toString().trim() 137*cd0cc2e3SAndroid Build Coastguard Worker project.ext.androidDevice64Bit = androidDeviceAbi.contains('64') 138*cd0cc2e3SAndroid Build Coastguard Worker } 139*cd0cc2e3SAndroid Build Coastguard Worker } 140*cd0cc2e3SAndroid Build Coastguard Worker } 141*cd0cc2e3SAndroid Build Coastguard Worker 142*cd0cc2e3SAndroid Build Coastguard Worker def configureExtractNativeLib = tasks.register("configureExtractNativeLib") { 143*cd0cc2e3SAndroid Build Coastguard Worker dependsOn getAndroidDeviceAbi, depsJar 144*cd0cc2e3SAndroid Build Coastguard Worker doLast { 145*cd0cc2e3SAndroid Build Coastguard Worker extractNativeLib.from { 146*cd0cc2e3SAndroid Build Coastguard Worker zipTree(depsJar.archivePath).matching { 147*cd0cc2e3SAndroid Build Coastguard Worker include "jni/${androidDeviceAbi}/*.so" 148*cd0cc2e3SAndroid Build Coastguard Worker }.collect { 149*cd0cc2e3SAndroid Build Coastguard Worker // Using collect flattens out the directory. 150*cd0cc2e3SAndroid Build Coastguard Worker it 151*cd0cc2e3SAndroid Build Coastguard Worker } 152*cd0cc2e3SAndroid Build Coastguard Worker } 153*cd0cc2e3SAndroid Build Coastguard Worker } 154*cd0cc2e3SAndroid Build Coastguard Worker } 155*cd0cc2e3SAndroid Build Coastguard Worker 156*cd0cc2e3SAndroid Build Coastguard Worker def extractNativeLib = tasks.register("extractNativeLib", Copy) { 157*cd0cc2e3SAndroid Build Coastguard Worker dependsOn configureExtractNativeLib 158*cd0cc2e3SAndroid Build Coastguard Worker into "$buildDir/extracted-native-libs" 159*cd0cc2e3SAndroid Build Coastguard Worker } 160*cd0cc2e3SAndroid Build Coastguard Worker 161*cd0cc2e3SAndroid Build Coastguard Worker def configurePushNativeLibrary = tasks.register("configurePushNativeLibrary") { 162*cd0cc2e3SAndroid Build Coastguard Worker dependsOn extractNativeLib 163*cd0cc2e3SAndroid Build Coastguard Worker doLast { 164*cd0cc2e3SAndroid Build Coastguard Worker project.ext.nativeLibPath = "/system/lib${androidDevice64Bit ? '64' : ''}/libconscrypt_jni.so" 165*cd0cc2e3SAndroid Build Coastguard Worker pushNativeLibrary.args 'push', "${extractNativeLib.destinationDir}/libconscrypt_jni.so", nativeLibPath 166*cd0cc2e3SAndroid Build Coastguard Worker } 167*cd0cc2e3SAndroid Build Coastguard Worker } 168*cd0cc2e3SAndroid Build Coastguard Worker 169*cd0cc2e3SAndroid Build Coastguard Worker def pushNativeLibrary = tasks.register("pushNativeLibrary", Exec) { 170*cd0cc2e3SAndroid Build Coastguard Worker dependsOn configurePushNativeLibrary 171*cd0cc2e3SAndroid Build Coastguard Worker pushNativeLibrary.executable android.adbExecutable 172*cd0cc2e3SAndroid Build Coastguard Worker } 173*cd0cc2e3SAndroid Build Coastguard Worker 174*cd0cc2e3SAndroid Build Coastguard Worker def runBenchmarks = tasks.register("runBenchmarks") { 175*cd0cc2e3SAndroid Build Coastguard Worker dependsOn depsJar, pushNativeLibrary 176*cd0cc2e3SAndroid Build Coastguard Worker doLast { 177*cd0cc2e3SAndroid Build Coastguard Worker // Execute the benchmarks 178*cd0cc2e3SAndroid Build Coastguard Worker exec { 179*cd0cc2e3SAndroid Build Coastguard Worker workingDir "${rootDir}" 180*cd0cc2e3SAndroid Build Coastguard Worker environment PATH: "${android.sdkDirectory}/build-tools/${android.buildToolsVersion}:$System.env.PATH" 181*cd0cc2e3SAndroid Build Coastguard Worker environment JACK_JAR: "${android.sdkDirectory}/build-tools/${android.buildToolsVersion}/jack.jar" 182*cd0cc2e3SAndroid Build Coastguard Worker 183*cd0cc2e3SAndroid Build Coastguard Worker executable 'java' 184*cd0cc2e3SAndroid Build Coastguard Worker args '-cp', 'benchmark-android/vogar.jar', 'vogar.Vogar' 185*cd0cc2e3SAndroid Build Coastguard Worker args '--classpath', depsJar.archivePath 186*cd0cc2e3SAndroid Build Coastguard Worker args '--benchmark' 187*cd0cc2e3SAndroid Build Coastguard Worker args '--language=JN' 188*cd0cc2e3SAndroid Build Coastguard Worker args '--mode=app_process' 189*cd0cc2e3SAndroid Build Coastguard Worker args 'org.conscrypt.CaliperAlpnBenchmark' 190*cd0cc2e3SAndroid Build Coastguard Worker args 'org.conscrypt.CaliperClientSocketBenchmark' 191*cd0cc2e3SAndroid Build Coastguard Worker args 'org.conscrypt.CaliperEngineHandshakeBenchmark' 192*cd0cc2e3SAndroid Build Coastguard Worker args 'org.conscrypt.CaliperEngineWrapBenchmark' 193*cd0cc2e3SAndroid Build Coastguard Worker } 194*cd0cc2e3SAndroid Build Coastguard Worker // Clean up the native library 195*cd0cc2e3SAndroid Build Coastguard Worker exec { 196*cd0cc2e3SAndroid Build Coastguard Worker executable android.adbExecutable 197*cd0cc2e3SAndroid Build Coastguard Worker args 'shell', 'rm', '-f', nativeLibPath 198*cd0cc2e3SAndroid Build Coastguard Worker } 199*cd0cc2e3SAndroid Build Coastguard Worker } 200*cd0cc2e3SAndroid Build Coastguard Worker } 201*cd0cc2e3SAndroid Build Coastguard Worker} else { 202*cd0cc2e3SAndroid Build Coastguard Worker logger.warn('Android SDK has not been detected. The Android Benchmark module will not be built.') 203*cd0cc2e3SAndroid Build Coastguard Worker 204*cd0cc2e3SAndroid Build Coastguard Worker // Disable all tasks 205*cd0cc2e3SAndroid Build Coastguard Worker tasks.configureEach { 206*cd0cc2e3SAndroid Build Coastguard Worker it.enabled = false 207*cd0cc2e3SAndroid Build Coastguard Worker } 208*cd0cc2e3SAndroid Build Coastguard Worker} 209