build.gradle.kts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import java.io.FileOutputStream
  2. import java.net.URL
  3. import java.time.Duration
  4. plugins {
  5. id("com.android.library")
  6. kotlin("android")
  7. id("kotlinx-serialization")
  8. id("clash-build")
  9. }
  10. val geoipDatabaseUrl =
  11. "https://github.com/Dreamacro/maxmind-geoip/releases/latest/download/Country.mmdb"
  12. val geoipInvalidate = Duration.ofDays(7)!!
  13. val geoipOutput = buildDir.resolve("intermediates/golang_blob")
  14. android {
  15. compileSdk = buildTargetSdkVersion
  16. ndkVersion = buildNdkVersion
  17. flavorDimensions(buildFlavor)
  18. defaultConfig {
  19. minSdk = buildMinSdkVersion
  20. targetSdk = buildTargetSdkVersion
  21. versionCode = buildVersionCode
  22. versionName = buildVersionName
  23. consumerProguardFiles("consumer-rules.pro")
  24. externalNativeBuild {
  25. cmake {
  26. abiFilters("arm64-v8a", "armeabi-v7a", "x86", "x86_64")
  27. arguments(
  28. "-DGO_SOURCE:STRING=$golangSource",
  29. "-DGO_OUTPUT:STRING=$golangBuild",
  30. "-DFLAVOR_NAME=$buildFlavor",
  31. )
  32. }
  33. }
  34. }
  35. buildTypes {
  36. named("release") {
  37. isMinifyEnabled = false
  38. proguardFiles(
  39. getDefaultProguardFile("proguard-android-optimize.txt"),
  40. "proguard-rules.pro"
  41. )
  42. }
  43. }
  44. productFlavors {
  45. create("foss") {
  46. dimension = "foss"
  47. }
  48. create("premium") {
  49. dimension = "premium"
  50. }
  51. }
  52. compileOptions {
  53. sourceCompatibility = JavaVersion.VERSION_1_8
  54. targetCompatibility = JavaVersion.VERSION_1_8
  55. }
  56. kotlinOptions {
  57. jvmTarget = "1.8"
  58. }
  59. externalNativeBuild {
  60. cmake {
  61. path = file("src/main/cpp/CMakeLists.txt")
  62. }
  63. }
  64. }
  65. dependencies {
  66. api(project(":common"))
  67. implementation(kotlin("stdlib-jdk7"))
  68. implementation("androidx.core:core-ktx:$coreVersion")
  69. implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutineVersion")
  70. implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serializationVersion")
  71. }
  72. repositories {
  73. mavenCentral()
  74. }
  75. task("downloadGeoipDatabase") {
  76. val databaseFile = geoipOutput.resolve("Country.mmdb")
  77. val moduleFile = geoipOutput.resolve("go.mod")
  78. val sourceFile = geoipOutput.resolve("blob.go")
  79. val moduleContent = """
  80. module "cfa/blob"
  81. """.trimIndent()
  82. val sourceContent = """
  83. package blob
  84. import _ "embed"
  85. //go:embed Country.mmdb
  86. var GeoipDatabase []byte
  87. """.trimIndent()
  88. onlyIf {
  89. System.currentTimeMillis() - databaseFile.lastModified() > geoipInvalidate.toMillis()
  90. }
  91. doLast {
  92. geoipOutput.mkdirs()
  93. moduleFile.writeText(moduleContent)
  94. sourceFile.writeText(sourceContent)
  95. URL(geoipDatabaseUrl).openConnection().getInputStream().use { input ->
  96. FileOutputStream(databaseFile).use { output ->
  97. input.copyTo(output)
  98. }
  99. }
  100. }
  101. }
  102. afterEvaluate {
  103. val downloadTask = tasks["downloadGeoipDatabase"]
  104. tasks.forEach {
  105. if (it.name.startsWith("externalGolangBuild")) {
  106. it.dependsOn(downloadTask)
  107. }
  108. }
  109. }