普通文本  |  138行  |  4.83 KB

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
    }
}