| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- plugins {
- alias(libs.plugins.android.application)
- alias(libs.plugins.kotlin.android)
- id("com.jaredsburrows.license")
- }
- android {
- namespace = "com.v2ray.ang"
- compileSdk = 35
- defaultConfig {
- applicationId = "com.v2ray.ang"
- minSdk = 21
- targetSdk = 35
- versionCode = 673
- versionName = "1.10.23"
- multiDexEnabled = true
- val abiFilterList = (properties["ABI_FILTERS"] as? String)?.split(';')
- splits {
- abi {
- isEnable = true
- reset()
- if (abiFilterList != null && abiFilterList.isNotEmpty()) {
- include(*abiFilterList.toTypedArray())
- } else {
- include(
- "arm64-v8a",
- "armeabi-v7a",
- "x86_64",
- "x86"
- )
- }
- isUniversalApk = abiFilterList.isNullOrEmpty()
- }
- }
- testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
- }
- buildTypes {
- release {
- isMinifyEnabled = false
- proguardFiles(
- getDefaultProguardFile("proguard-android-optimize.txt"),
- "proguard-rules.pro"
- )
- }
- }
- flavorDimensions.add("distribution")
- productFlavors {
- create("fdroid") {
- dimension = "distribution"
- applicationIdSuffix = ".fdroid"
- buildConfigField("String", "DISTRIBUTION", "\"F-Droid\"")
- }
- create("playstore") {
- dimension = "distribution"
- buildConfigField("String", "DISTRIBUTION", "\"Play Store\"")
- }
- }
- sourceSets {
- getByName("main") {
- jniLibs.srcDirs("libs")
- }
- }
- compileOptions {
- isCoreLibraryDesugaringEnabled = true
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
- }
- kotlinOptions {
- jvmTarget = JavaVersion.VERSION_17.toString()
- }
- applicationVariants.all {
- val variant = this
- val isFdroid = variant.productFlavors.any { it.name == "fdroid" }
- if (isFdroid) {
- val versionCodes =
- mapOf(
- "armeabi-v7a" to 2, "arm64-v8a" to 1, "x86" to 4, "x86_64" to 3, "universal" to 0
- )
- variant.outputs
- .map { it as com.android.build.gradle.internal.api.ApkVariantOutputImpl }
- .forEach { output ->
- val abi = output.getFilter("ABI") ?: "universal"
- output.outputFileName = "v2rayNG_${variant.versionName}-fdroid_${abi}.apk"
- if (versionCodes.containsKey(abi)) {
- output.versionCodeOverride =
- (100 * variant.versionCode + versionCodes[abi]!!).plus(5000000)
- } else {
- return@forEach
- }
- }
- } else {
- val versionCodes =
- mapOf("armeabi-v7a" to 4, "arm64-v8a" to 4, "x86" to 4, "x86_64" to 4, "universal" to 4)
- variant.outputs
- .map { it as com.android.build.gradle.internal.api.ApkVariantOutputImpl }
- .forEach { output ->
- val abi = if (output.getFilter("ABI") != null)
- output.getFilter("ABI")
- else
- "universal"
- output.outputFileName = "v2rayNG_${variant.versionName}_${abi}.apk"
- if (versionCodes.containsKey(abi)) {
- output.versionCodeOverride =
- (1000000 * versionCodes[abi]!!).plus(variant.versionCode)
- } else {
- return@forEach
- }
- }
- }
- }
- buildFeatures {
- viewBinding = true
- buildConfig = true
- }
- packaging {
- jniLibs {
- useLegacyPackaging = true
- }
- }
- // Fix for 16KB page size alignment required by Android 15+
- // https://developer.android.com/16kb-page-size
- // For pre-compiled libraries in AARs, we need to handle alignment
- packaging {
- resources {
- excludes += ":META-INF/LICENSE"
- excludes += ":META-INF/LICENSE.md"
- excludes += ":META-INF/NOTICE"
- }
- jniLibs.keepDebugSymbols += "**/*.so"
- }
- }
- dependencies {
- // Core Libraries
- implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar", "*.jar"))))
- // AndroidX Core Libraries
- implementation(libs.androidx.core.ktx)
- implementation(libs.androidx.appcompat)
- implementation(libs.androidx.activity)
- implementation(libs.androidx.constraintlayout)
- implementation(libs.preference.ktx)
- implementation(libs.recyclerview)
- implementation(libs.androidx.swiperefreshlayout)
- // UI Libraries
- implementation(libs.material)
- implementation(libs.toasty)
- implementation(libs.editorkit)
- implementation(libs.flexbox)
- // Data and Storage Libraries
- implementation(libs.mmkv.static)
- implementation(libs.gson)
- // Reactive and Utility Libraries
- implementation(libs.kotlinx.coroutines.android)
- implementation(libs.kotlinx.coroutines.core)
- // Language and Processing Libraries
- implementation(libs.language.base)
- implementation(libs.language.json)
- // Intent and Utility Libraries
- implementation(libs.quickie.foss)
- implementation(libs.core)
- // AndroidX Lifecycle and Architecture Components
- implementation(libs.lifecycle.viewmodel.ktx)
- implementation(libs.lifecycle.livedata.ktx)
- implementation(libs.lifecycle.runtime.ktx)
- // Background Task Libraries
- implementation(libs.work.runtime.ktx)
- implementation(libs.work.multiprocess)
- // Multidex Support
- implementation(libs.multidex)
- // Testing Libraries
- testImplementation(libs.junit)
- androidTestImplementation(libs.androidx.junit)
- androidTestImplementation(libs.androidx.espresso.core)
- testImplementation(libs.org.mockito.mockito.inline)
- testImplementation(libs.mockito.kotlin)
- coreLibraryDesugaring(libs.desugar.jdk.libs)
- }
|