buildscript {
repositories {
jcenter()
}
dependencies {
classpath libraries.android_tools
}
}
description = 'Conscrypt: Android Benchmarks'
ext {
androidHome = "$System.env.ANDROID_HOME"
androidSdkInstalled = file("$androidHome").exists()
androidVersionCode = 1
androidVersionName = "$version"
androidMinSdkVersion = 24
androidTargetSdkVersion = 25
androidBuildToolsVersion = "25.0.0"
androidBuildToolsDir = "${androidHome}/build-tools/${androidBuildToolsVersion}"
}
if (androidSdkInstalled) {
apply plugin: 'com.android.library'
android {
compileSdkVersion androidTargetSdkVersion
buildToolsVersion androidBuildToolsVersion
compileOptions {
sourceCompatibility androidMinJavaVersion;
targetCompatibility androidMinJavaVersion
}
defaultConfig {
minSdkVersion androidMinSdkVersion
targetSdkVersion androidTargetSdkVersion
versionCode androidVersionCode
versionName androidVersionName
}
lintOptions {
// Some Caliper classes reference packages that don't exist on Android
disable 'InvalidPackage'
}
sourceSets.main {
java {
srcDirs = [
"src/main/java"
]
}
}
}
dependencies {
compile project(':conscrypt-android'),
project(':conscrypt-benchmark-base'),
project(':conscrypt-testing')
compile 'com.google.caliper:caliper:1.0-beta-2'
compile libraries.bouncycastle_provider
}
// This task bundles up everything we're going to send to the device into a single jar.
// We need to include all the Conscrypt code plus the Bouncy Castle jar because the platform
// version of Bouncy Castle is jarjared.
task depsJar(type: Jar, dependsOn: 'assembleRelease') {
archiveName = 'bundled-deps.jar'
from {
configurations.compile.filter {
// Find the jars from our project plus BC
it.name.endsWith(".jar") && (it.path.startsWith("${rootDir}") || it.path.contains('org.bouncycastle'))
}.collect {
zipTree(it)
}
}
from {
// Also include the classes.jar from our Android libraries
['.', "${rootDir}/android"].collect {
zipTree(it + '/build/intermediates/bundles/default/classes.jar')
}
}
// Bouncy Castle signs their jar, which causes our combined jar to fail to verify. Just
// strip out the signature files.
exclude "META-INF/*.RSA", "META-INF/*.SF", "META-INF/*.DSA"
}
task runBenchmarks(dependsOn: depsJar) {
doLast {
// First, determine which ABI the device uses so that we can send the right native lib
new ByteArrayOutputStream().withStream { stream ->
exec {
commandLine = ['adb', 'shell', 'getprop', 'ro.product.cpu.abi']
standardOutput = stream
}
ext.androidDeviceAbi = stream.toString().trim()
ext.androidDevice64Bit = ext.androidDeviceAbi.contains('64')
}
def nativeLibPath = "/system/lib${androidDevice64Bit ? '64' : ''}/libconscrypt_jni.so"
// Send the native library to the device
exec {
executable "${androidHome}/platform-tools/adb"
args 'push'
args "${rootDir}/android/build/intermediates/bundles/default/jni/${androidDeviceAbi}/libconscrypt_jni.so"
args nativeLibPath
}
// Execute the benchmarks
exec {
workingDir "${rootDir}"
environment PATH: "${androidBuildToolsDir}:$System.env.PATH"
environment JACK_JAR: "${androidBuildToolsDir}/jack.jar"
executable 'java'
args '-cp', 'benchmark-android/vogar.jar', 'vogar.Vogar'
args '--classpath', 'benchmark-android/build/libs/bundled-deps.jar'
args '--benchmark'
args '--language=JN'
args '--mode=app_process'
args 'org.conscrypt.CaliperAlpnBenchmark'
args 'org.conscrypt.CaliperClientSocketBenchmark'
args 'org.conscrypt.CaliperEngineHandshakeBenchmark'
args 'org.conscrypt.CaliperEngineWrapBenchmark'
}
// Clean up the native library
exec {
commandLine = ['adb', 'shell', 'rm', '-f', nativeLibPath]
}
}
}
} else {
logger.warn('Android SDK has not been detected. The Android Benchmark module will not be built.')
// Disable all tasks
tasks.collect {
it.enabled = false
}
}