@@ -3,7 +3,9 @@ package kotlinx.benchmark.gradle
3
3
import kotlinx.benchmark.gradle.internal.KotlinxBenchmarkPluginInternalApi
4
4
import org.gradle.api.*
5
5
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation
6
+ import java.io.InputStream
6
7
import java.util.*
8
+ import java.util.concurrent.TimeUnit
7
9
8
10
9
11
@KotlinxBenchmarkPluginInternalApi
@@ -12,7 +14,7 @@ fun Project.processAndroidCompilation(target: KotlinJvmAndroidCompilation) {
12
14
println (" processAndroidCompilation: ${target.name} " )
13
15
val compilation = target.target.compilations.names.let (::println)
14
16
15
- tasks.register(" process ${target.name.capitalize(Locale .getDefault())} Compilation" , DefaultTask ::class .java) {
17
+ tasks.register(" processAndroid ${target.name.capitalize(Locale .getDefault())} Compilation" , DefaultTask ::class .java) {
16
18
it.group = " benchmark"
17
19
it.description = " Processes the Android compilation '${target.name} ' for benchmarks"
18
20
it.dependsOn(" bundle${target.name.capitalize(Locale .getDefault())} Aar" )
@@ -21,11 +23,13 @@ fun Project.processAndroidCompilation(target: KotlinJvmAndroidCompilation) {
21
23
generateBenchmarkSourceFiles(classDescriptors)
22
24
}
23
25
detectAndroidDevice()
26
+ createAndroidBenchmarkExecTask()
24
27
}
25
28
}
26
29
}
27
30
28
31
fun Project.detectAndroidDevice () {
32
+ println (" Detect running Android devices..." )
29
33
val devices = ProcessBuilder (" adb" , " devices" )
30
34
.start()
31
35
.inputStream
@@ -39,4 +43,47 @@ fun Project.detectAndroidDevice() {
39
43
?.let {
40
44
println (" Connected Android devices/emulators:\n\t ${it.joinToString(" \n\t " )} " )
41
45
} ? : throw RuntimeException (" No Android devices/emulators found, please start an emulator or connect a device." )
46
+ }
47
+
48
+
49
+ // Use shell command to execute separate project gradle task
50
+ fun Project.createAndroidBenchmarkExecTask () {
51
+ // TODO: Project path needs to execute benchmark task
52
+ val executeBenchmarkPath = " E:/Android/AndroidProjects/kotlin-qualification-task"
53
+ // Using ./gradlew on Windows shows error:
54
+ // CreateProcess error=193, %1 is not a valid Win32 application
55
+ val osName = System .getProperty(" os.name" ).toLowerCase(Locale .ROOT )
56
+ val gradlewPath = " $executeBenchmarkPath /gradlew" + if (osName.contains(" win" )) " .bat" else " "
57
+ val args = listOf (" -p" , executeBenchmarkPath, " connectedAndroidTest" )
58
+
59
+ try {
60
+ println (" Running command: $gradlewPath ${args.joinToString(" " )} " )
61
+
62
+ val process = ProcessBuilder (gradlewPath, * args.toTypedArray())
63
+ .redirectOutput(ProcessBuilder .Redirect .PIPE )
64
+ .redirectError(ProcessBuilder .Redirect .PIPE )
65
+ .start()
66
+
67
+ val outputGobbler = StreamGobbler (process.inputStream) { println (it) }
68
+ val errorGobbler = StreamGobbler (process.errorStream) { System .err.println (it) }
69
+
70
+ outputGobbler.start()
71
+ errorGobbler.start()
72
+
73
+ val exitCode = process.waitFor(10 , TimeUnit .MINUTES )
74
+ if (! exitCode || process.exitValue() != 0 ) {
75
+ println (" Android benchmark task failed with exit code ${process.exitValue()} " )
76
+ } else {
77
+ println (" Benchmark for Android target finished." )
78
+ }
79
+ } catch (e: Exception ) {
80
+ e.printStackTrace()
81
+ throw GradleException (" Failed to execute benchmark task" , e)
82
+ }
83
+ }
84
+
85
+ class StreamGobbler (private val inputStream : InputStream , private val consumer : (String ) -> Unit ) : Thread() {
86
+ override fun run () {
87
+ inputStream.bufferedReader().lines().forEach(consumer)
88
+ }
42
89
}
0 commit comments