import com.github.kr328.golang.GolangPlugin import java.io.FileOutputStream import java.net.URL import java.time.Duration plugins { kotlin("android") id("com.android.library") id("kotlinx-serialization") id("golang-android") } 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") golang { sourceSets { create("foss") { srcDir.set(file("src/foss/go")) } create("premium") { srcDir.set(file("src/premium/go")) } all { fileName.set("libclash.so") } } } android { productFlavors { all { externalNativeBuild { cmake { arguments("-DGO_SOURCE:STRING=${golang.sourceSets.getByName(name).srcDir.asFile.get()}") arguments("-DGO_OUTPUT:STRING=${GolangPlugin.outputDirOf(project, null, null)}") arguments("-DFLAVOR_NAME:STRING=$name") } } } } externalNativeBuild { cmake { path = file("src/main/cpp/CMakeLists.txt") } } } dependencies { implementation(project(":common")) implementation(kotlin("stdlib-jdk7")) implementation(deps.androidx.core) implementation(deps.kotlin.coroutine) implementation(deps.kotlin.serialization.json) } repositories { mavenCentral() } 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() outputs.dir(geoipOutput) 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) } } }