build.gradle.kts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. plugins {
  2. alias(libs.plugins.android.application)
  3. alias(libs.plugins.kotlin.android)
  4. id("com.jaredsburrows.license")
  5. }
  6. android {
  7. namespace = "com.v2ray.ang"
  8. compileSdk = 35
  9. defaultConfig {
  10. applicationId = "com.v2ray.ang"
  11. minSdk = 21
  12. targetSdk = 35
  13. versionCode = 673
  14. versionName = "1.10.23"
  15. multiDexEnabled = true
  16. val abiFilterList = (properties["ABI_FILTERS"] as? String)?.split(';')
  17. splits {
  18. abi {
  19. isEnable = true
  20. reset()
  21. if (abiFilterList != null && abiFilterList.isNotEmpty()) {
  22. include(*abiFilterList.toTypedArray())
  23. } else {
  24. include(
  25. "arm64-v8a",
  26. "armeabi-v7a",
  27. "x86_64",
  28. "x86"
  29. )
  30. }
  31. isUniversalApk = abiFilterList.isNullOrEmpty()
  32. }
  33. }
  34. testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
  35. }
  36. buildTypes {
  37. release {
  38. isMinifyEnabled = false
  39. proguardFiles(
  40. getDefaultProguardFile("proguard-android-optimize.txt"),
  41. "proguard-rules.pro"
  42. )
  43. }
  44. }
  45. flavorDimensions.add("distribution")
  46. productFlavors {
  47. create("fdroid") {
  48. dimension = "distribution"
  49. applicationIdSuffix = ".fdroid"
  50. buildConfigField("String", "DISTRIBUTION", "\"F-Droid\"")
  51. }
  52. create("playstore") {
  53. dimension = "distribution"
  54. buildConfigField("String", "DISTRIBUTION", "\"Play Store\"")
  55. }
  56. }
  57. sourceSets {
  58. getByName("main") {
  59. jniLibs.srcDirs("libs")
  60. }
  61. }
  62. compileOptions {
  63. isCoreLibraryDesugaringEnabled = true
  64. sourceCompatibility = JavaVersion.VERSION_17
  65. targetCompatibility = JavaVersion.VERSION_17
  66. }
  67. kotlinOptions {
  68. jvmTarget = JavaVersion.VERSION_17.toString()
  69. }
  70. applicationVariants.all {
  71. val variant = this
  72. val isFdroid = variant.productFlavors.any { it.name == "fdroid" }
  73. if (isFdroid) {
  74. val versionCodes =
  75. mapOf(
  76. "armeabi-v7a" to 2, "arm64-v8a" to 1, "x86" to 4, "x86_64" to 3, "universal" to 0
  77. )
  78. variant.outputs
  79. .map { it as com.android.build.gradle.internal.api.ApkVariantOutputImpl }
  80. .forEach { output ->
  81. val abi = output.getFilter("ABI") ?: "universal"
  82. output.outputFileName = "v2rayNG_${variant.versionName}-fdroid_${abi}.apk"
  83. if (versionCodes.containsKey(abi)) {
  84. output.versionCodeOverride =
  85. (100 * variant.versionCode + versionCodes[abi]!!).plus(5000000)
  86. } else {
  87. return@forEach
  88. }
  89. }
  90. } else {
  91. val versionCodes =
  92. mapOf("armeabi-v7a" to 4, "arm64-v8a" to 4, "x86" to 4, "x86_64" to 4, "universal" to 4)
  93. variant.outputs
  94. .map { it as com.android.build.gradle.internal.api.ApkVariantOutputImpl }
  95. .forEach { output ->
  96. val abi = if (output.getFilter("ABI") != null)
  97. output.getFilter("ABI")
  98. else
  99. "universal"
  100. output.outputFileName = "v2rayNG_${variant.versionName}_${abi}.apk"
  101. if (versionCodes.containsKey(abi)) {
  102. output.versionCodeOverride =
  103. (1000000 * versionCodes[abi]!!).plus(variant.versionCode)
  104. } else {
  105. return@forEach
  106. }
  107. }
  108. }
  109. }
  110. buildFeatures {
  111. viewBinding = true
  112. buildConfig = true
  113. }
  114. packaging {
  115. jniLibs {
  116. useLegacyPackaging = true
  117. }
  118. }
  119. // Fix for 16KB page size alignment required by Android 15+
  120. // https://developer.android.com/16kb-page-size
  121. // For pre-compiled libraries in AARs, we need to handle alignment
  122. packaging {
  123. resources {
  124. excludes += ":META-INF/LICENSE"
  125. excludes += ":META-INF/LICENSE.md"
  126. excludes += ":META-INF/NOTICE"
  127. }
  128. jniLibs.keepDebugSymbols += "**/*.so"
  129. }
  130. }
  131. dependencies {
  132. // Core Libraries
  133. implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar", "*.jar"))))
  134. // AndroidX Core Libraries
  135. implementation(libs.androidx.core.ktx)
  136. implementation(libs.androidx.appcompat)
  137. implementation(libs.androidx.activity)
  138. implementation(libs.androidx.constraintlayout)
  139. implementation(libs.preference.ktx)
  140. implementation(libs.recyclerview)
  141. implementation(libs.androidx.swiperefreshlayout)
  142. // UI Libraries
  143. implementation(libs.material)
  144. implementation(libs.toasty)
  145. implementation(libs.editorkit)
  146. implementation(libs.flexbox)
  147. // Data and Storage Libraries
  148. implementation(libs.mmkv.static)
  149. implementation(libs.gson)
  150. // Reactive and Utility Libraries
  151. implementation(libs.kotlinx.coroutines.android)
  152. implementation(libs.kotlinx.coroutines.core)
  153. // Language and Processing Libraries
  154. implementation(libs.language.base)
  155. implementation(libs.language.json)
  156. // Intent and Utility Libraries
  157. implementation(libs.quickie.foss)
  158. implementation(libs.core)
  159. // AndroidX Lifecycle and Architecture Components
  160. implementation(libs.lifecycle.viewmodel.ktx)
  161. implementation(libs.lifecycle.livedata.ktx)
  162. implementation(libs.lifecycle.runtime.ktx)
  163. // Background Task Libraries
  164. implementation(libs.work.runtime.ktx)
  165. implementation(libs.work.multiprocess)
  166. // Multidex Support
  167. implementation(libs.multidex)
  168. // Testing Libraries
  169. testImplementation(libs.junit)
  170. androidTestImplementation(libs.androidx.junit)
  171. androidTestImplementation(libs.androidx.espresso.core)
  172. testImplementation(libs.org.mockito.mockito.inline)
  173. testImplementation(libs.mockito.kotlin)
  174. coreLibraryDesugaring(libs.desugar.jdk.libs)
  175. }