2021-09-12 00:43:32 +08:00
|
|
|
import com.github.kr328.golang.GolangBuildTask
|
2021-09-11 14:53:09 +08:00
|
|
|
import com.github.kr328.golang.GolangPlugin
|
2021-05-15 00:51:08 +08:00
|
|
|
import java.io.FileOutputStream
|
|
|
|
import java.net.URL
|
|
|
|
import java.time.Duration
|
|
|
|
|
|
|
|
plugins {
|
|
|
|
kotlin("android")
|
2021-09-11 14:53:09 +08:00
|
|
|
id("com.android.library")
|
2021-05-15 00:51:08 +08:00
|
|
|
id("kotlinx-serialization")
|
2021-09-11 14:53:09 +08:00
|
|
|
id("golang-android")
|
2021-05-15 00:51:08 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
val geoipDatabaseUrl =
|
|
|
|
"https://github.com/Dreamacro/maxmind-geoip/releases/latest/download/Country.mmdb"
|
|
|
|
val geoipInvalidate = Duration.ofDays(7)!!
|
|
|
|
val geoipOutput = buildDir.resolve("intermediates/golang_blob")
|
2021-09-12 00:43:32 +08:00
|
|
|
val golangSource = file("src/main/golang/native")
|
2021-05-15 00:51:08 +08:00
|
|
|
|
2021-09-11 14:53:09 +08:00
|
|
|
golang {
|
|
|
|
sourceSets {
|
2021-05-16 17:55:47 +08:00
|
|
|
create("foss") {
|
2021-09-11 18:27:02 +08:00
|
|
|
tags.set(listOf("foss"))
|
2021-09-12 00:39:59 +08:00
|
|
|
srcDir.set(file("src/foss/golang"))
|
2021-05-15 00:51:08 +08:00
|
|
|
}
|
|
|
|
create("premium") {
|
2021-09-12 01:33:52 +08:00
|
|
|
tags.set(listOf("premium", "without_gvisor", "without_system"))
|
2021-09-12 00:39:59 +08:00
|
|
|
srcDir.set(file("src/premium/golang"))
|
2021-09-11 14:53:09 +08:00
|
|
|
}
|
|
|
|
all {
|
|
|
|
fileName.set("libclash.so")
|
2021-09-12 00:39:59 +08:00
|
|
|
packageName.set("cfa/native")
|
2021-05-15 00:51:08 +08:00
|
|
|
}
|
|
|
|
}
|
2021-09-11 14:53:09 +08:00
|
|
|
}
|
2021-05-15 00:51:08 +08:00
|
|
|
|
2021-09-11 14:53:09 +08:00
|
|
|
android {
|
|
|
|
productFlavors {
|
|
|
|
all {
|
|
|
|
externalNativeBuild {
|
|
|
|
cmake {
|
2021-09-12 00:43:32 +08:00
|
|
|
arguments("-DGO_SOURCE:STRING=${golangSource}")
|
2021-09-11 14:53:09 +08:00
|
|
|
arguments("-DGO_OUTPUT:STRING=${GolangPlugin.outputDirOf(project, null, null)}")
|
|
|
|
arguments("-DFLAVOR_NAME:STRING=$name")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-05-15 00:51:08 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
externalNativeBuild {
|
|
|
|
cmake {
|
|
|
|
path = file("src/main/cpp/CMakeLists.txt")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
dependencies {
|
2021-09-11 14:53:09 +08:00
|
|
|
implementation(project(":common"))
|
2021-05-15 00:51:08 +08:00
|
|
|
|
2021-09-11 14:53:09 +08:00
|
|
|
implementation(deps.androidx.core)
|
|
|
|
implementation(deps.kotlin.coroutine)
|
|
|
|
implementation(deps.kotlin.serialization.json)
|
2021-05-15 00:51:08 +08:00
|
|
|
}
|
|
|
|
|
2021-09-12 00:43:32 +08:00
|
|
|
afterEvaluate {
|
|
|
|
tasks.withType(GolangBuildTask::class.java).forEach {
|
2021-09-12 01:33:52 +08:00
|
|
|
it.inputs.dir(golangSource)
|
2021-09-12 00:43:32 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-15 00:51:08 +08:00
|
|
|
task("downloadGeoipDatabase") {
|
|
|
|
val databaseFile = geoipOutput.resolve("Country.mmdb")
|
|
|
|
val moduleFile = geoipOutput.resolve("go.mod")
|
|
|
|
val sourceFile = geoipOutput.resolve("blob.go")
|
|
|
|
|
|
|
|
val moduleContent = """
|
|
|
|
module "cfa/blob"
|
|
|
|
""".trimIndent()
|
|
|
|
|
|
|
|
val sourceContent = """
|
|
|
|
package blob
|
|
|
|
|
|
|
|
import _ "embed"
|
|
|
|
|
|
|
|
//go:embed Country.mmdb
|
|
|
|
var GeoipDatabase []byte
|
|
|
|
""".trimIndent()
|
|
|
|
|
2021-09-11 14:53:09 +08:00
|
|
|
outputs.dir(geoipOutput)
|
|
|
|
|
2021-05-15 00:51:08 +08:00
|
|
|
onlyIf {
|
|
|
|
System.currentTimeMillis() - databaseFile.lastModified() > geoipInvalidate.toMillis()
|
|
|
|
}
|
|
|
|
|
|
|
|
doLast {
|
|
|
|
geoipOutput.mkdirs()
|
|
|
|
|
|
|
|
moduleFile.writeText(moduleContent)
|
|
|
|
sourceFile.writeText(sourceContent)
|
|
|
|
|
|
|
|
URL(geoipDatabaseUrl).openConnection().getInputStream().use { input ->
|
|
|
|
FileOutputStream(databaseFile).use { output ->
|
|
|
|
input.copyTo(output)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
afterEvaluate {
|
|
|
|
val downloadTask = tasks["downloadGeoipDatabase"]
|
|
|
|
|
|
|
|
tasks.forEach {
|
|
|
|
if (it.name.startsWith("externalGolangBuild")) {
|
|
|
|
it.dependsOn(downloadTask)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|