Fix macos performance issue

Support custom global-ua

Update core

Optimize some details
This commit is contained in:
chen08209
2026-05-27 15:16:51 +08:00
parent 5179d55dfb
commit 7e7f1f89f3
192 changed files with 4904 additions and 2910 deletions
+2 -3
View File
@@ -3,14 +3,13 @@ import java.util.Properties
plugins {
id("com.android.application")
id("kotlin-android")
id("dev.flutter.flutter-gradle-plugin")
id("com.google.gms.google-services")
id("com.google.firebase.crashlytics")
}
val localPropertiesFile = rootProject.file("local.properties")
val localProperties = Properties().apply {
val localPropertiesFile = rootProject.file("local.properties")
if (localPropertiesFile.exists()) {
localPropertiesFile.inputStream().use { load(it) }
}
@@ -106,4 +105,4 @@ dependencies {
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.crashlytics.ndk)
implementation(libs.firebase.analytics)
}
}
+15
View File
@@ -15,10 +15,25 @@ subprojects {
val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
project.layout.buildDirectory.value(newSubprojectBuildDir)
}
subprojects {
project.evaluationDependsOn(":app")
}
gradle.projectsEvaluated {
allprojects {
tasks.withType<JavaCompile>().configureEach {
sourceCompatibility = JavaVersion.VERSION_17.toString()
targetCompatibility = JavaVersion.VERSION_17.toString()
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
compilerOptions {
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17)
}
}
}
}
tasks.register<Delete>("clean") {
delete(rootProject.layout.buildDirectory)
}
+1 -2
View File
@@ -2,7 +2,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
id("com.android.library")
id("org.jetbrains.kotlin.android")
}
android {
@@ -42,4 +41,4 @@ dependencies {
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.crashlytics.ndk)
implementation(libs.firebase.analytics)
}
}
View File
-1
View File
@@ -2,7 +2,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
id("com.android.library")
id("org.jetbrains.kotlin.android")
}
android {
+4
View File
@@ -1,3 +1,7 @@
org.gradle.jvmargs=-Xmx4G
android.useAndroidX=true
android.enableJetifier=true
# This builtInKotlin flag was added automatically by Flutter migrator
android.builtInKotlin=false
# This newDsl flag was added automatically by Flutter migrator
android.newDsl=false
+5 -6
View File
@@ -1,6 +1,6 @@
[versions]
#agp = "8.10.1"
firebaseBom = "34.2.0"
firebaseBom = "34.15.0"
minSdk = "23"
targetSdk = "36"
compileSdk = "36"
@@ -9,13 +9,12 @@ coreKtx = "1.17.0"
annotationJvm = "1.9.1"
coreSplashscreen = "1.0.1"
gson = "2.13.1"
kotlin = "2.2.10"
kotlin = "2.2.20"
smaliDexlib2 = "3.0.9"
firebaseCrashlyticsKtx = "20.0.1"
firebaseCommonKtx = "22.0.0"
firebaseCrashlyticsKtx = "20.0.6"
firebaseCommonKtx = "22.1.0"
[libraries]
build-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
androidx-core = { module = "androidx.core:core-ktx", version.ref = "coreKtx" }
annotation-jvm = { module = "androidx.annotation:annotation-jvm", version.ref = "annotationJvm" }
core-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "coreSplashscreen" }
@@ -25,4 +24,4 @@ firebase-crashlytics-ndk = { module = "com.google.firebase:firebase-crashlytics-
gson = { module = "com.google.code.gson:gson", version.ref = "gson" }
smali-dexlib2 = { module = "com.android.tools.smali:smali-dexlib2", version.ref = "smaliDexlib2" }
firebase-crashlytics-ktx = { group = "com.google.firebase", name = "firebase-crashlytics-ktx", version.ref = "firebaseCrashlyticsKtx" }
firebase-common-ktx = { group = "com.google.firebase", name = "firebase-common-ktx", version.ref = "firebaseCommonKtx" }
firebase-common-ktx = { group = "com.google.firebase", name = "firebase-common-ktx", version.ref = "firebaseCommonKtx" }
+1 -1
View File
@@ -2,5 +2,5 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-all.zip
+1 -3
View File
@@ -2,8 +2,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
id("com.android.library")
id("org.jetbrains.kotlin.android")
id("kotlin-parcelize")
}
android {
@@ -45,4 +43,4 @@ dependencies {
implementation(project(":common"))
implementation(libs.gson)
implementation(libs.androidx.core)
}
}
@@ -1,11 +1,36 @@
package com.follow.clash.service.models
import android.os.Parcel
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class NotificationParams(
val title: String = "FlClash",
val stopText: String = "STOP",
val onlyStatisticsProxy: Boolean = false,
) : Parcelable
) : Parcelable {
constructor(parcel: Parcel) : this(
title = parcel.readString() ?: "FlClash",
stopText = parcel.readString() ?: "STOP",
onlyStatisticsProxy = parcel.readByte() != 0.toByte(),
)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(title)
parcel.writeString(stopText)
parcel.writeByte(if (onlyStatisticsProxy) 1.toByte() else 0.toByte())
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<NotificationParams> {
override fun createFromParcel(parcel: Parcel): NotificationParams {
return NotificationParams(parcel)
}
override fun newArray(size: Int): Array<NotificationParams?> {
return arrayOfNulls(size)
}
}
}
@@ -1,19 +1,45 @@
package com.follow.clash.service.models
import android.os.Parcel
import android.os.Parcelable
import com.follow.clash.common.AccessControlMode
import kotlinx.parcelize.Parcelize
import java.net.InetAddress
@Parcelize
data class AccessControlProps(
val enable: Boolean,
val mode: AccessControlMode,
val acceptList: List<String>,
val rejectList: List<String>,
) : Parcelable
) : Parcelable {
constructor(parcel: Parcel) : this(
enable = parcel.readByte() != 0.toByte(),
mode = AccessControlMode.valueOf(parcel.readString() ?: AccessControlMode.ACCEPT_SELECTED.name),
acceptList = parcel.createStringArrayList() ?: emptyList(),
rejectList = parcel.createStringArrayList() ?: emptyList(),
)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeByte(if (enable) 1.toByte() else 0.toByte())
parcel.writeString(mode.name)
parcel.writeStringList(acceptList)
parcel.writeStringList(rejectList)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<AccessControlProps> {
override fun createFromParcel(parcel: Parcel): AccessControlProps {
return AccessControlProps(parcel)
}
override fun newArray(size: Int): Array<AccessControlProps?> {
return arrayOfNulls(size)
}
}
}
@Parcelize
data class VpnOptions(
val enable: Boolean,
val port: Int,
@@ -25,7 +51,59 @@ data class VpnOptions(
val bypassDomain: List<String>,
val stack: String,
val routeAddress: List<String>,
) : Parcelable
) : Parcelable {
constructor(parcel: Parcel) : this(
enable = parcel.readByte() != 0.toByte(),
port = parcel.readInt(),
ipv6 = parcel.readByte() != 0.toByte(),
dnsHijacking = parcel.readByte() != 0.toByte(),
accessControlProps = readAccessControlProps(parcel),
allowBypass = parcel.readByte() != 0.toByte(),
systemProxy = parcel.readByte() != 0.toByte(),
bypassDomain = parcel.createStringArrayList() ?: emptyList(),
stack = parcel.readString() ?: "",
routeAddress = parcel.createStringArrayList() ?: emptyList(),
)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeByte(if (enable) 1.toByte() else 0.toByte())
parcel.writeInt(port)
parcel.writeByte(if (ipv6) 1.toByte() else 0.toByte())
parcel.writeByte(if (dnsHijacking) 1.toByte() else 0.toByte())
parcel.writeParcelable(accessControlProps, flags)
parcel.writeByte(if (allowBypass) 1.toByte() else 0.toByte())
parcel.writeByte(if (systemProxy) 1.toByte() else 0.toByte())
parcel.writeStringList(bypassDomain)
parcel.writeString(stack)
parcel.writeStringList(routeAddress)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<VpnOptions> {
@Suppress("DEPRECATION")
private fun readAccessControlProps(parcel: Parcel): AccessControlProps {
return parcel.readParcelable<AccessControlProps>(
AccessControlProps::class.java.classLoader,
) ?: AccessControlProps(
enable = false,
mode = AccessControlMode.ACCEPT_SELECTED,
acceptList = emptyList(),
rejectList = emptyList(),
)
}
override fun createFromParcel(parcel: Parcel): VpnOptions {
return VpnOptions(parcel)
}
override fun newArray(size: Int): Array<VpnOptions?> {
return arrayOfNulls(size)
}
}
}
data class CIDR(val address: InetAddress, val prefixLength: Int)
@@ -80,4 +158,4 @@ fun String.toCIDR(): CIDR {
}
return CIDR(address, prefixLength)
}
}
+4 -4
View File
@@ -19,10 +19,10 @@ pluginManagement {
plugins {
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
id("com.android.application") version "8.12.2" apply false
id("org.jetbrains.kotlin.android") version "2.2.10" apply false
id("com.google.gms.google-services") version ("4.3.15") apply false
id("com.google.firebase.crashlytics") version ("2.8.1") apply false
id("com.android.application") version "9.0.1" apply false
id("org.jetbrains.kotlin.android") version "2.4.0" apply false
id("com.google.gms.google-services") version ("4.5.0") apply false
id("com.google.firebase.crashlytics") version ("3.0.7") apply false
}