
* Potential fix for the multi-sources not being generated properly As described here https://www.infoworld.com/article/2071275/when-runtime-exec---won-t.html under "Listing 4.2 BadExecJavac2.java" the limited buffer size of the standard input associated with the sub-process can cause problems with the Runtime exec method. Consuming what the sub-process outputs should in theory allow for the process to finish (+ if you enable log level debug we could get some nice debug information in the future). I've tested this on my local machine and it works there, please do not accept the PR with this commit before the Github checks pass successfully and I've looked further into this. * Multi-sources not being generated properly - ErrorStream redirect Now redirecting the errorStream of the sub-process to the standard output of the subprocess, so that we can consume it with the `javaProcess.inputStream` stream.
69 lines
2.1 KiB
Plaintext
69 lines
2.1 KiB
Plaintext
import java.io.BufferedReader
|
|
import java.io.InputStreamReader
|
|
|
|
plugins {
|
|
id("com.android.library")
|
|
kotlin("android")
|
|
}
|
|
|
|
android {
|
|
compileSdkVersion(Config.compileSdk)
|
|
buildToolsVersion(Config.buildTools)
|
|
|
|
defaultConfig {
|
|
minSdkVersion(29)
|
|
targetSdkVersion(Config.targetSdk)
|
|
}
|
|
}
|
|
|
|
repositories {
|
|
mavenCentral()
|
|
}
|
|
|
|
// dependencies
|
|
apply("$rootDir/common-dependencies.gradle")
|
|
|
|
tasks {
|
|
val generateExtensions by registering {
|
|
doLast {
|
|
val isWindows = System.getProperty("os.name").toString().toLowerCase().contains("win")
|
|
var classPath = (configurations.debugCompileOnly.get().asFileTree.toList() +
|
|
listOf(
|
|
configurations.androidApis.get().asFileTree.first().absolutePath, // android.jar path
|
|
"$projectDir/build/intermediates/aar_main_jar/debug/classes.jar" // jar made from this module
|
|
))
|
|
.joinToString(if (isWindows) ";" else ":")
|
|
|
|
var javaPath = "${System.getProperty("java.home")}/bin/java"
|
|
|
|
val mainClass = "generator.GeneratorMainKt" // Main class we want to execute
|
|
|
|
if (isWindows) {
|
|
classPath = classPath.replace("/", "\\")
|
|
javaPath = javaPath.replace("/", "\\")
|
|
}
|
|
|
|
val javaProcess = ProcessBuilder()
|
|
.directory(null).command(javaPath, "-classpath", classPath, mainClass)
|
|
.redirectErrorStream(true).start()
|
|
|
|
val inputStreamReader = InputStreamReader(javaProcess.inputStream)
|
|
val bufferedReader = BufferedReader(inputStreamReader)
|
|
|
|
var s: String?
|
|
while (bufferedReader.readLine().also { s = it } != null) {
|
|
logger.info(s)
|
|
}
|
|
|
|
bufferedReader.close()
|
|
inputStreamReader.close()
|
|
|
|
val exitCode = javaProcess.waitFor()
|
|
if (exitCode != 0) {
|
|
throw Exception("Java process failed with exit code: $exitCode")
|
|
}
|
|
}
|
|
dependsOn("assembleDebug")
|
|
}
|
|
}
|