xref: /aosp_15_r20/external/conscrypt/benchmark-android/build.gradle (revision cd0cc2e34ba52cdf454361820a14d744e4bd531d)
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