mirror of
https://github.com/MetaCubeX/ClashMetaForAndroid.git
synced 2024-11-22 05:16:08 +03:00
Refactor: refactor project structure & update clash core (#1174)
* Refactor: refactor project structure * Chore: remove apply * Chore: update clash core * Fix: fix versionName & versionCode patch * Chore: update golang plugin * Fix: fix workflow build
This commit is contained in:
parent
fa23be76ed
commit
11c4e19e0c
11
.github/workflows/build-unsigned.yaml
vendored
11
.github/workflows/build-unsigned.yaml
vendored
@ -1,9 +1,6 @@
|
|||||||
name: Build Unsigned
|
name: Build Unsigned
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
|
||||||
push:
|
push:
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- '.github/**'
|
- '.github/**'
|
||||||
- '.idea/**'
|
- '.idea/**'
|
||||||
@ -13,8 +10,6 @@ on:
|
|||||||
- 'LICENSE'
|
- 'LICENSE'
|
||||||
- 'NOTICE'
|
- 'NOTICE'
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- '.github/**'
|
- '.github/**'
|
||||||
- '.idea/**'
|
- '.idea/**'
|
||||||
@ -38,10 +33,8 @@ jobs:
|
|||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v2
|
uses: actions/setup-go@v2
|
||||||
with:
|
with:
|
||||||
go-version: 1.16
|
go-version: 1.17
|
||||||
- name: Setup Android SDK
|
- name: Setup Android SDK
|
||||||
uses: android-actions/setup-android@v2
|
uses: android-actions/setup-android@v2
|
||||||
- name: Setup Cmake & Ninja
|
|
||||||
uses: lukka/get-cmake@latest
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: ./gradlew --no-daemon app:assembleRelease
|
run: ./gradlew --no-daemon app:assembleFossRelease
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -19,9 +19,11 @@ gradle-app.setting
|
|||||||
# Ignore IDEA config
|
# Ignore IDEA config
|
||||||
*.iml
|
*.iml
|
||||||
/.idea/*
|
/.idea/*
|
||||||
/core/src/main/golang/.idea/*
|
|
||||||
!/.idea/codeStyles
|
!/.idea/codeStyles
|
||||||
!/core/src/main/golang/.idea/codeStyles
|
/core/src/foss/go/.idea/*
|
||||||
|
!/core/src/foss/go/.idea/codeStyles
|
||||||
|
/core/src/premium/go/.idea/*
|
||||||
|
!/core/src/premium/go/.idea/codeStyles
|
||||||
|
|
||||||
# KeyStore
|
# KeyStore
|
||||||
*.keystore
|
*.keystore
|
||||||
|
10
.gitmodules
vendored
10
.gitmodules
vendored
@ -1,9 +1,3 @@
|
|||||||
[submodule "core/src/main/golang/clash"]
|
[submodule "clash-foss"]
|
||||||
path = core/src/main/golang/clash
|
path = core/src/foss/go/clash
|
||||||
url = https://github.com/Kr328/clash.git
|
url = https://github.com/Kr328/clash.git
|
||||||
[submodule "kaidl"]
|
|
||||||
path = kaidl
|
|
||||||
url = https://github.com/Kr328/kaidl.git
|
|
||||||
[submodule "core/src/main/golang/tun2socket"]
|
|
||||||
path = core/src/main/golang/tun2socket
|
|
||||||
url = https://github.com/Kr328/tun2socket-lwip.git
|
|
||||||
|
@ -1,144 +1,31 @@
|
|||||||
import java.util.*
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("com.android.application")
|
|
||||||
kotlin("android")
|
kotlin("android")
|
||||||
kotlin("kapt")
|
kotlin("kapt")
|
||||||
}
|
id("com.android.application")
|
||||||
|
|
||||||
android {
|
|
||||||
compileSdk = buildTargetSdkVersion
|
|
||||||
|
|
||||||
flavorDimensions(buildFlavor)
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
applicationId = "com.github.kr328.clash"
|
|
||||||
|
|
||||||
minSdk = buildMinSdkVersion
|
|
||||||
targetSdk = buildTargetSdkVersion
|
|
||||||
|
|
||||||
versionCode = buildVersionCode
|
|
||||||
versionName = buildVersionName
|
|
||||||
|
|
||||||
resConfigs("zh-rCN", "zh-rHK", "zh-rTW")
|
|
||||||
|
|
||||||
resValue("string", "release_name", "v$buildVersionName")
|
|
||||||
resValue("integer", "release_code", "$buildVersionCode")
|
|
||||||
}
|
|
||||||
|
|
||||||
packagingOptions {
|
|
||||||
exclude("DebugProbesKt.bin")
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
named("release") {
|
|
||||||
isMinifyEnabled = true
|
|
||||||
isShrinkResources = true
|
|
||||||
proguardFiles(
|
|
||||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
|
||||||
"proguard-rules.pro"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
productFlavors {
|
|
||||||
create("foss") {
|
|
||||||
dimension = "foss"
|
|
||||||
versionNameSuffix = ".foss"
|
|
||||||
applicationIdSuffix = ".foss"
|
|
||||||
}
|
|
||||||
create("premium") {
|
|
||||||
dimension = "premium"
|
|
||||||
versionNameSuffix = ".premium"
|
|
||||||
|
|
||||||
if (buildFlavor == "premium") {
|
|
||||||
val localFile = rootProject.file("local.properties")
|
|
||||||
if (localFile.exists()) {
|
|
||||||
val appCenterKey = localFile.inputStream()
|
|
||||||
.use { Properties().apply { load(it) } }
|
|
||||||
.getProperty("appcenter.key", null)
|
|
||||||
|
|
||||||
if (appCenterKey != null) {
|
|
||||||
buildConfigField("String", "APP_CENTER_KEY", "\"$appCenterKey\"")
|
|
||||||
} else {
|
|
||||||
buildConfigField("String", "APP_CENTER_KEY", "null")
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
buildConfigField("String", "APP_CENTER_KEY", "null")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val signingFile = rootProject.file("keystore.properties")
|
|
||||||
if (signingFile.exists()) {
|
|
||||||
val properties = Properties().apply {
|
|
||||||
signingFile.inputStream().use {
|
|
||||||
load(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
signingConfigs {
|
|
||||||
create("release") {
|
|
||||||
storeFile = rootProject.file(properties.getProperty("storeFile")!!)
|
|
||||||
storePassword = properties.getProperty("storePassword")!!
|
|
||||||
keyAlias = properties.getProperty("keyAlias")!!
|
|
||||||
keyPassword = properties.getProperty("keyPassword")!!
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buildTypes {
|
|
||||||
named("release") {
|
|
||||||
signingConfig = signingConfigs["release"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
buildFeatures {
|
|
||||||
dataBinding = true
|
|
||||||
}
|
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
kotlinOptions {
|
|
||||||
jvmTarget = "1.8"
|
|
||||||
}
|
|
||||||
|
|
||||||
splits {
|
|
||||||
abi {
|
|
||||||
isEnable = true
|
|
||||||
isUniversalApk = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
val premiumImplementation by configurations
|
implementation(project(":core"))
|
||||||
|
implementation(project(":service"))
|
||||||
api(project(":core"))
|
implementation(project(":design"))
|
||||||
api(project(":service"))
|
implementation(project(":common"))
|
||||||
api(project(":design"))
|
|
||||||
api(project(":common"))
|
|
||||||
|
|
||||||
premiumImplementation("com.microsoft.appcenter:appcenter-analytics:$appcenterVersion")
|
|
||||||
premiumImplementation("com.microsoft.appcenter:appcenter-crashes:$appcenterVersion")
|
|
||||||
|
|
||||||
implementation(kotlin("stdlib-jdk7"))
|
implementation(kotlin("stdlib-jdk7"))
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutineVersion")
|
implementation(deps.kotlin.coroutine)
|
||||||
implementation("androidx.core:core-ktx:$coreVersion")
|
implementation(deps.androidx.core)
|
||||||
implementation("androidx.activity:activity:$activityVersion")
|
implementation(deps.androidx.activity)
|
||||||
implementation("androidx.appcompat:appcompat:$appcompatVersion")
|
implementation(deps.androidx.fragment)
|
||||||
implementation("androidx.coordinatorlayout:coordinatorlayout:$coordinatorlayoutVersion")
|
implementation(deps.androidx.appcompat)
|
||||||
implementation("androidx.recyclerview:recyclerview:$recyclerviewVersion")
|
implementation(deps.androidx.coordinator)
|
||||||
implementation("androidx.fragment:fragment:$fragmentVersion")
|
implementation(deps.androidx.recyclerview)
|
||||||
implementation("com.google.android.material:material:$materialVersion")
|
implementation(deps.google.material)
|
||||||
|
|
||||||
|
val premiumImplementation by configurations
|
||||||
|
|
||||||
|
premiumImplementation(deps.appcenter.analytics)
|
||||||
|
premiumImplementation(deps.appcenter.crashes)
|
||||||
}
|
}
|
||||||
|
|
||||||
task("cleanRelease", type = Delete::class) {
|
tasks.getByName("clean", type = Delete::class) {
|
||||||
delete(file("release"))
|
delete(file("release"))
|
||||||
}
|
}
|
||||||
|
|
||||||
afterEvaluate {
|
|
||||||
tasks["clean"].dependsOn(tasks["cleanRelease"])
|
|
||||||
}
|
|
116
build.gradle.kts
116
build.gradle.kts
@ -1,11 +1,127 @@
|
|||||||
@file:Suppress("UNUSED_VARIABLE")
|
@file:Suppress("UNUSED_VARIABLE")
|
||||||
|
|
||||||
|
import com.android.build.gradle.BaseExtension
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
|
|
||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
mavenLocal()
|
||||||
|
google()
|
||||||
|
maven("https://maven.kr328.app/releases")
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
classpath(deps.build.android)
|
||||||
|
classpath(deps.build.kotlin.common)
|
||||||
|
classpath(deps.build.kotlin.serialization)
|
||||||
|
classpath(deps.build.ksp)
|
||||||
|
classpath(deps.build.golang)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
maven("https://maven.kr328.app/releases")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
subprojects {
|
||||||
|
val isApp = name == "app"
|
||||||
|
|
||||||
|
apply(plugin = if (isApp) "com.android.application" else "com.android.library")
|
||||||
|
|
||||||
|
extensions.configure(BaseExtension::class) {
|
||||||
|
val minSdkVersion = 21
|
||||||
|
val targetSdkVersion = 30
|
||||||
|
val buildVersionCode = 204009
|
||||||
|
val buildVersionName = "2.4.9"
|
||||||
|
val defaultDimension = "feature"
|
||||||
|
|
||||||
|
ndkVersion = "23.0.7599858"
|
||||||
|
|
||||||
|
compileSdkVersion(targetSdkVersion)
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
if (isApp) {
|
||||||
|
applicationId = "com.github.kr328.clash"
|
||||||
|
}
|
||||||
|
|
||||||
|
minSdk = minSdkVersion
|
||||||
|
targetSdk = targetSdkVersion
|
||||||
|
|
||||||
|
versionName = buildVersionName
|
||||||
|
versionCode = buildVersionCode
|
||||||
|
|
||||||
|
if (!isApp) {
|
||||||
|
consumerProguardFiles("consumer-rules.pro")
|
||||||
|
}
|
||||||
|
|
||||||
|
resValue("string", "release_name", "v$buildVersionName")
|
||||||
|
resValue("integer", "release_code", "$buildVersionCode")
|
||||||
|
|
||||||
|
externalNativeBuild {
|
||||||
|
cmake {
|
||||||
|
abiFilters("arm64-v8a", "armeabi-v7a", "x86", "x86_64")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
externalNativeBuild {
|
||||||
|
cmake {
|
||||||
|
version = "3.18.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isApp) {
|
||||||
|
packagingOptions {
|
||||||
|
excludes.add("DebugProbesKt.bin")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
named("release") {
|
||||||
|
isMinifyEnabled = isApp
|
||||||
|
isShrinkResources = isApp
|
||||||
|
proguardFiles(
|
||||||
|
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||||
|
"proguard-rules.pro"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
productFlavors {
|
||||||
|
flavorDimensions(defaultDimension)
|
||||||
|
|
||||||
|
create("foss") {
|
||||||
|
dimension = defaultDimension
|
||||||
|
versionNameSuffix = ".foss"
|
||||||
|
|
||||||
|
if (isApp) {
|
||||||
|
applicationIdSuffix = ".foss"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
create("premium") {
|
||||||
|
dimension = defaultDimension
|
||||||
|
versionNameSuffix = ".premium"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildFeatures.apply {
|
||||||
|
dataBinding {
|
||||||
|
isEnabled = name != "hideapi"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isApp) {
|
||||||
|
splits {
|
||||||
|
abi {
|
||||||
|
isEnable = true
|
||||||
|
isUniversalApk = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
plugins {
|
|
||||||
kotlin("jvm") version "1.5.10"
|
|
||||||
`java-gradle-plugin`
|
|
||||||
}
|
|
||||||
|
|
||||||
repositories {
|
|
||||||
mavenCentral()
|
|
||||||
google()
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
implementation(kotlin("gradle-plugin"))
|
|
||||||
implementation(kotlin("serialization"))
|
|
||||||
implementation("com.android.tools.build:gradle:4.2.1")
|
|
||||||
implementation("com.google.devtools.ksp:symbol-processing-gradle-plugin:1.5.10-1.0.0-beta01")
|
|
||||||
}
|
|
||||||
|
|
||||||
gradlePlugin {
|
|
||||||
plugins {
|
|
||||||
create("golang") {
|
|
||||||
id = "clash-build"
|
|
||||||
implementationClass = "com.github.kr328.clash.tools.ClashBuildPlugin"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
import org.gradle.api.Project
|
|
||||||
|
|
||||||
const val buildVersionCode = 204009
|
|
||||||
const val buildVersionName = "2.4.9"
|
|
||||||
|
|
||||||
const val buildMinSdkVersion = 21
|
|
||||||
const val buildTargetSdkVersion = 30
|
|
||||||
|
|
||||||
const val buildNdkVersion = "22.1.7171670"
|
|
||||||
|
|
||||||
val Project.buildFlavor: String
|
|
||||||
get() {
|
|
||||||
return if (project(":core").file("src/main/golang/clash/script/script.go").exists())
|
|
||||||
"premium"
|
|
||||||
else
|
|
||||||
"foss"
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
const val activityVersion = "1.2.3"
|
|
||||||
const val coroutineVersion = "1.5.0"
|
|
||||||
const val roomVersion = "2.3.0"
|
|
||||||
const val coreVersion = "1.5.0"
|
|
||||||
const val appcompatVersion = "1.3.0"
|
|
||||||
const val muiltprocessVersion = "1.0.0"
|
|
||||||
const val appcenterVersion = "4.2.0"
|
|
||||||
const val serializationVersion = "1.2.1"
|
|
||||||
const val materialVersion = "1.3.0"
|
|
||||||
const val coordinatorlayoutVersion = "1.1.0"
|
|
||||||
const val recyclerviewVersion = "1.2.1"
|
|
||||||
const val fragmentVersion = "1.3.4"
|
|
||||||
const val viewpagerVersion = "1.0.0"
|
|
@ -1,8 +0,0 @@
|
|||||||
import org.gradle.api.Project
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
val Project.golangSource: File
|
|
||||||
get() = file("src/main/golang")
|
|
||||||
|
|
||||||
val Project.golangBuild: File
|
|
||||||
get() = buildDir.resolve("intermediates/golang")
|
|
@ -1,23 +0,0 @@
|
|||||||
package com.github.kr328.clash.tools
|
|
||||||
|
|
||||||
import com.android.build.gradle.BaseExtension
|
|
||||||
import com.android.build.gradle.api.BaseVariant
|
|
||||||
import java.io.Serializable
|
|
||||||
|
|
||||||
data class BuildConfig(
|
|
||||||
val debug: Boolean,
|
|
||||||
val premium: Boolean,
|
|
||||||
val abis: List<NativeAbi>,
|
|
||||||
val minSdkVersion: Int,
|
|
||||||
) : Serializable {
|
|
||||||
companion object {
|
|
||||||
fun of(abis: List<NativeAbi>, minSdkVersion: Int, variant: BaseVariant): BuildConfig {
|
|
||||||
return BuildConfig(
|
|
||||||
debug = variant.buildType.isDebuggable,
|
|
||||||
premium = variant.flavorName == "premium",
|
|
||||||
abis = abis,
|
|
||||||
minSdkVersion = minSdkVersion
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,56 +0,0 @@
|
|||||||
package com.github.kr328.clash.tools
|
|
||||||
|
|
||||||
import com.android.build.gradle.LibraryExtension
|
|
||||||
import golangBuild
|
|
||||||
import golangSource
|
|
||||||
import org.gradle.api.Plugin
|
|
||||||
import org.gradle.api.Project
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
class ClashBuildPlugin : Plugin<Project> {
|
|
||||||
override fun apply(target: Project) {
|
|
||||||
target.afterEvaluate {
|
|
||||||
target.extensions.getByType(LibraryExtension::class.java).apply {
|
|
||||||
val abis = defaultConfig.externalNativeBuild.cmake.abiFilters
|
|
||||||
.map { NativeAbi.parse(it) }
|
|
||||||
.distinct()
|
|
||||||
val minSdkVersion = defaultConfig.minSdkVersion!!.apiLevel
|
|
||||||
|
|
||||||
target.tasks.register("cleanGolang", ClashCleanTask::class.java) {
|
|
||||||
it.applyFrom(target, abis)
|
|
||||||
|
|
||||||
target.tasks.getByName("clean").dependsOn(it)
|
|
||||||
}
|
|
||||||
|
|
||||||
libraryVariants.forEach { variant ->
|
|
||||||
val config = BuildConfig.of(abis, minSdkVersion, variant)
|
|
||||||
val buildDir = target.golangBuild.resolve(variant.name)
|
|
||||||
val capitalize = variant.name.capitalize(Locale.getDefault())
|
|
||||||
|
|
||||||
val task = target.tasks.register(
|
|
||||||
"externalGolangBuild$capitalize",
|
|
||||||
ClashBuildTask::class.java
|
|
||||||
) {
|
|
||||||
it.config.set(config)
|
|
||||||
it.ndkDirectory.set(ndkDirectory)
|
|
||||||
it.inputDirectory.set(target.golangSource)
|
|
||||||
it.outputDirectory.set(buildDir)
|
|
||||||
}
|
|
||||||
|
|
||||||
sourceSets.named(variant.name) {
|
|
||||||
it.jniLibs {
|
|
||||||
srcDir(buildDir)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
variant.externalNativeBuildProviders.forEach {
|
|
||||||
it.get().dependsOn(task)
|
|
||||||
}
|
|
||||||
target.tasks.filter { it.name.startsWith("buildCMake") }.forEach {
|
|
||||||
it.mustRunAfter(task)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,60 +0,0 @@
|
|||||||
package com.github.kr328.clash.tools
|
|
||||||
|
|
||||||
import org.gradle.api.DefaultTask
|
|
||||||
import org.gradle.api.file.DirectoryProperty
|
|
||||||
import org.gradle.api.provider.Property
|
|
||||||
import org.gradle.api.tasks.Input
|
|
||||||
import org.gradle.api.tasks.InputDirectory
|
|
||||||
import org.gradle.api.tasks.OutputDirectory
|
|
||||||
import org.gradle.api.tasks.TaskAction
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
abstract class ClashBuildTask : DefaultTask() {
|
|
||||||
abstract val config: Property<BuildConfig>
|
|
||||||
@Input get
|
|
||||||
|
|
||||||
abstract val ndkDirectory: DirectoryProperty
|
|
||||||
@InputDirectory get
|
|
||||||
|
|
||||||
abstract val inputDirectory: DirectoryProperty
|
|
||||||
@InputDirectory get
|
|
||||||
|
|
||||||
abstract val outputDirectory: DirectoryProperty
|
|
||||||
@OutputDirectory get
|
|
||||||
|
|
||||||
@TaskAction
|
|
||||||
fun build() {
|
|
||||||
val input = inputDirectory.file
|
|
||||||
val output = outputDirectory.file
|
|
||||||
|
|
||||||
val config = config.get()
|
|
||||||
val environment = Environment(ndkDirectory.file, config.minSdkVersion)
|
|
||||||
|
|
||||||
val tags = listOf("without_gvisor", "without_system") +
|
|
||||||
(if (config.debug) listOf("debug") else emptyList()) +
|
|
||||||
(if (config.premium) listOf("premium") else emptyList())
|
|
||||||
|
|
||||||
Command.ofGoModuleTidy(input).exec()
|
|
||||||
|
|
||||||
config.abis.forEach {
|
|
||||||
Command.ofGoRun(
|
|
||||||
"make/make.go",
|
|
||||||
listOf("tun2socket", ".", "android", it.goArch),
|
|
||||||
input.resolve("tun2socket"),
|
|
||||||
environment.ofLwipBuild(it)
|
|
||||||
).exec()
|
|
||||||
|
|
||||||
Command.ofGoBuild(
|
|
||||||
"c-shared",
|
|
||||||
output.resolve("${it.value}/libclash.so"),
|
|
||||||
tags,
|
|
||||||
!config.debug,
|
|
||||||
input,
|
|
||||||
environment.ofCoreBuild(it)
|
|
||||||
).exec()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private val DirectoryProperty.file: File
|
|
||||||
get() = get().asFile
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
package com.github.kr328.clash.tools
|
|
||||||
|
|
||||||
import org.gradle.api.Project
|
|
||||||
import org.gradle.api.tasks.Delete
|
|
||||||
import golangSource
|
|
||||||
|
|
||||||
abstract class ClashCleanTask : Delete() {
|
|
||||||
fun applyFrom(project: Project, abis: List<NativeAbi>) {
|
|
||||||
val bridge = project.golangSource.resolve("tun2socket")
|
|
||||||
|
|
||||||
delete(bridge.resolve("build"))
|
|
||||||
|
|
||||||
abis.forEach {
|
|
||||||
delete(bridge.resolve("build_android_${it.goArch}.go"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,84 +0,0 @@
|
|||||||
package com.github.kr328.clash.tools
|
|
||||||
|
|
||||||
import org.gradle.api.GradleException
|
|
||||||
import java.io.File
|
|
||||||
import kotlin.concurrent.thread
|
|
||||||
|
|
||||||
class Command(
|
|
||||||
private val command: Array<String>,
|
|
||||||
workingDir: File,
|
|
||||||
environments: Map<String, String>
|
|
||||||
) {
|
|
||||||
private val processBuilder: ProcessBuilder = ProcessBuilder(*command)
|
|
||||||
.redirectErrorStream(true)
|
|
||||||
.directory(workingDir)
|
|
||||||
.apply { environment().putAll(environments) }
|
|
||||||
|
|
||||||
fun exec() {
|
|
||||||
val process = processBuilder.start()
|
|
||||||
|
|
||||||
thread {
|
|
||||||
process.inputStream.copyTo(System.out)
|
|
||||||
}
|
|
||||||
|
|
||||||
val result = process.waitFor()
|
|
||||||
|
|
||||||
if (result != 0) {
|
|
||||||
throw GradleException("exec ${command.joinToString(" ")}: exit with $result")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
fun ofGoModuleTidy(workingDir: File): Command {
|
|
||||||
return Command(arrayOf("go", "mod", "tidy"), workingDir, System.getenv())
|
|
||||||
}
|
|
||||||
|
|
||||||
fun ofGoBuild(
|
|
||||||
mode: String,
|
|
||||||
output: File,
|
|
||||||
tags: List<String>,
|
|
||||||
strip: Boolean,
|
|
||||||
workingDir: File,
|
|
||||||
environments: Map<String, String>
|
|
||||||
): Command {
|
|
||||||
val command = mutableListOf("go", "build")
|
|
||||||
|
|
||||||
// go build mode
|
|
||||||
command += "-buildmode"
|
|
||||||
command += mode
|
|
||||||
|
|
||||||
// output file
|
|
||||||
command += "-o"
|
|
||||||
command += output.absolutePath
|
|
||||||
|
|
||||||
// trim path prefix
|
|
||||||
command += "-trimpath"
|
|
||||||
|
|
||||||
if (tags.isNotEmpty()) {
|
|
||||||
command += "-tags"
|
|
||||||
command += tags.joinToString(",")
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strip) {
|
|
||||||
command += "-ldflags"
|
|
||||||
command += "-s -w"
|
|
||||||
}
|
|
||||||
|
|
||||||
return Command(command.toTypedArray(), workingDir, environments)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun ofGoRun(
|
|
||||||
file: String,
|
|
||||||
args: List<String>,
|
|
||||||
workingDir: File,
|
|
||||||
environments: Map<String, String>
|
|
||||||
): Command {
|
|
||||||
val command = mutableListOf("go", "run")
|
|
||||||
|
|
||||||
command += file
|
|
||||||
command += args
|
|
||||||
|
|
||||||
return Command(command.toTypedArray(), workingDir, environments)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
package com.github.kr328.clash.tools
|
|
||||||
|
|
||||||
import org.apache.tools.ant.taskdefs.condition.Os
|
|
||||||
import org.gradle.api.GradleException
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
class Environment(
|
|
||||||
private val ndkDirectory: File,
|
|
||||||
private val minSdkVersion: Int,
|
|
||||||
) {
|
|
||||||
fun ofCoreBuild(abi: NativeAbi): Map<String, String> {
|
|
||||||
val host = when {
|
|
||||||
Os.isFamily(Os.FAMILY_WINDOWS) ->
|
|
||||||
"windows"
|
|
||||||
Os.isFamily(Os.FAMILY_MAC) ->
|
|
||||||
"darwin"
|
|
||||||
Os.isFamily(Os.FAMILY_UNIX) ->
|
|
||||||
"linux"
|
|
||||||
else ->
|
|
||||||
throw GradleException("Unsupported host: ${System.getProperty("os.name")}")
|
|
||||||
}
|
|
||||||
|
|
||||||
val compiler = ndkDirectory.resolve("toolchains/llvm/prebuilt/$host-x86_64/bin")
|
|
||||||
.resolve("${abi.compiler}${minSdkVersion}-clang")
|
|
||||||
|
|
||||||
return mapOf(
|
|
||||||
"CC" to compiler.absolutePath,
|
|
||||||
"GOOS" to "android",
|
|
||||||
"GOARCH" to abi.goArch,
|
|
||||||
"GOARM" to abi.goArm,
|
|
||||||
"CGO_ENABLED" to "1",
|
|
||||||
"CFLAGS" to "-O3 -Werror",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun ofLwipBuild(abi: NativeAbi): Map<String, String> {
|
|
||||||
val host = when {
|
|
||||||
Os.isFamily(Os.FAMILY_WINDOWS) ->
|
|
||||||
"windows"
|
|
||||||
Os.isFamily(Os.FAMILY_MAC) ->
|
|
||||||
"darwin"
|
|
||||||
Os.isFamily(Os.FAMILY_UNIX) ->
|
|
||||||
"linux"
|
|
||||||
else ->
|
|
||||||
throw GradleException("Unsupported host: ${System.getProperty("os.name")}")
|
|
||||||
}
|
|
||||||
|
|
||||||
val compiler = ndkDirectory.resolve("toolchains/llvm/prebuilt/$host-x86_64/bin")
|
|
||||||
.resolve("${abi.compiler}${minSdkVersion}-clang")
|
|
||||||
val ar = ndkDirectory.resolve("toolchains/llvm/prebuilt/$host-x86_64/bin")
|
|
||||||
.resolve("${abi.archiver}-ar")
|
|
||||||
|
|
||||||
return mapOf(
|
|
||||||
"CC" to compiler.absolutePath,
|
|
||||||
"AR" to ar.absolutePath,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
package com.github.kr328.clash.tools
|
|
||||||
|
|
||||||
enum class NativeAbi(
|
|
||||||
val value: String,
|
|
||||||
val compiler: String,
|
|
||||||
val archiver: String,
|
|
||||||
val goArch: String,
|
|
||||||
val goArm: String
|
|
||||||
) {
|
|
||||||
ArmeabiV7a("armeabi-v7a", "armv7a-linux-androideabi", "arm-linux-androideabi", "arm", "7"),
|
|
||||||
Arm64V8a("arm64-v8a", "aarch64-linux-android", "aarch64-linux-android", "arm64", ""),
|
|
||||||
X86("x86", "i686-linux-android", "i686-linux-android", "386", ""),
|
|
||||||
X64("x86_64", "x86_64-linux-android", "x86_64-linux-android", "amd64", "");
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
fun parse(value: String): NativeAbi {
|
|
||||||
return when (value) {
|
|
||||||
ArmeabiV7a.value -> ArmeabiV7a
|
|
||||||
Arm64V8a.value -> Arm64V8a
|
|
||||||
X86.value -> X86
|
|
||||||
X64.value -> X64
|
|
||||||
else -> throw IllegalArgumentException("unsupported abi $value")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,50 +1,12 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("com.android.library")
|
|
||||||
kotlin("android")
|
kotlin("android")
|
||||||
}
|
id("com.android.library")
|
||||||
|
|
||||||
android {
|
|
||||||
compileSdk = buildTargetSdkVersion
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
minSdk = buildMinSdkVersion
|
|
||||||
targetSdk = buildTargetSdkVersion
|
|
||||||
|
|
||||||
versionCode = buildVersionCode
|
|
||||||
versionName = buildVersionName
|
|
||||||
|
|
||||||
consumerProguardFiles("consumer-rules.pro")
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
named("release") {
|
|
||||||
isMinifyEnabled = false
|
|
||||||
proguardFiles(
|
|
||||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
|
||||||
"proguard-rules.pro"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
kotlinOptions {
|
|
||||||
jvmTarget = "1.8"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly(project(":hideapi"))
|
compileOnly(project(":hideapi"))
|
||||||
|
|
||||||
implementation(kotlin("stdlib-jdk7"))
|
implementation(kotlin("stdlib-jdk7"))
|
||||||
implementation("androidx.core:core-ktx:$coreVersion")
|
implementation(deps.kotlin.coroutine)
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutineVersion")
|
implementation(deps.androidx.core)
|
||||||
}
|
|
||||||
|
|
||||||
repositories {
|
|
||||||
mavenCentral()
|
|
||||||
google()
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
|
import com.github.kr328.golang.GolangPlugin
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.time.Duration
|
import java.time.Duration
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("com.android.library")
|
|
||||||
kotlin("android")
|
kotlin("android")
|
||||||
|
id("com.android.library")
|
||||||
id("kotlinx-serialization")
|
id("kotlinx-serialization")
|
||||||
id("clash-build")
|
id("golang-android")
|
||||||
}
|
}
|
||||||
|
|
||||||
val geoipDatabaseUrl =
|
val geoipDatabaseUrl =
|
||||||
@ -14,60 +15,31 @@ val geoipDatabaseUrl =
|
|||||||
val geoipInvalidate = Duration.ofDays(7)!!
|
val geoipInvalidate = Duration.ofDays(7)!!
|
||||||
val geoipOutput = buildDir.resolve("intermediates/golang_blob")
|
val geoipOutput = buildDir.resolve("intermediates/golang_blob")
|
||||||
|
|
||||||
android {
|
golang {
|
||||||
compileSdk = buildTargetSdkVersion
|
sourceSets {
|
||||||
|
|
||||||
ndkVersion = buildNdkVersion
|
|
||||||
|
|
||||||
flavorDimensions(buildFlavor)
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
minSdk = buildMinSdkVersion
|
|
||||||
targetSdk = buildTargetSdkVersion
|
|
||||||
|
|
||||||
versionCode = buildVersionCode
|
|
||||||
versionName = buildVersionName
|
|
||||||
|
|
||||||
consumerProguardFiles("consumer-rules.pro")
|
|
||||||
|
|
||||||
externalNativeBuild {
|
|
||||||
cmake {
|
|
||||||
abiFilters("arm64-v8a", "armeabi-v7a", "x86", "x86_64")
|
|
||||||
arguments(
|
|
||||||
"-DGO_SOURCE:STRING=$golangSource",
|
|
||||||
"-DGO_OUTPUT:STRING=$golangBuild",
|
|
||||||
"-DFLAVOR_NAME=$buildFlavor",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
named("release") {
|
|
||||||
isMinifyEnabled = false
|
|
||||||
proguardFiles(
|
|
||||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
|
||||||
"proguard-rules.pro"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
productFlavors {
|
|
||||||
create("foss") {
|
create("foss") {
|
||||||
dimension = "foss"
|
srcDir.set(file("src/foss/go"))
|
||||||
}
|
}
|
||||||
create("premium") {
|
create("premium") {
|
||||||
dimension = "premium"
|
srcDir.set(file("src/premium/go"))
|
||||||
|
}
|
||||||
|
all {
|
||||||
|
fileName.set("libclash.so")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
compileOptions {
|
android {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
productFlavors {
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
all {
|
||||||
}
|
externalNativeBuild {
|
||||||
|
cmake {
|
||||||
kotlinOptions {
|
arguments("-DGO_SOURCE:STRING=${golang.sourceSets.getByName(name).srcDir.asFile.get()}")
|
||||||
jvmTarget = "1.8"
|
arguments("-DGO_OUTPUT:STRING=${GolangPlugin.outputDirOf(project, null, null)}")
|
||||||
|
arguments("-DFLAVOR_NAME:STRING=$name")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
@ -78,12 +50,12 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api(project(":common"))
|
implementation(project(":common"))
|
||||||
|
|
||||||
implementation(kotlin("stdlib-jdk7"))
|
implementation(kotlin("stdlib-jdk7"))
|
||||||
implementation("androidx.core:core-ktx:$coreVersion")
|
implementation(deps.androidx.core)
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutineVersion")
|
implementation(deps.kotlin.coroutine)
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serializationVersion")
|
implementation(deps.kotlin.serialization.json)
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
@ -108,6 +80,8 @@ task("downloadGeoipDatabase") {
|
|||||||
var GeoipDatabase []byte
|
var GeoipDatabase []byte
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
|
|
||||||
|
outputs.dir(geoipOutput)
|
||||||
|
|
||||||
onlyIf {
|
onlyIf {
|
||||||
System.currentTimeMillis() - databaseFile.lastModified() > geoipInvalidate.toMillis()
|
System.currentTimeMillis() - databaseFile.lastModified() > geoipInvalidate.toMillis()
|
||||||
}
|
}
|
||||||
|
1
core/src/foss/go/clash
Submodule
1
core/src/foss/go/clash
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit a918699140e9169f76600f2e7837ec6d69957fb5
|
@ -2,7 +2,11 @@
|
|||||||
|
|
||||||
package config
|
package config
|
||||||
|
|
||||||
import "github.com/Dreamacro/clash/config"
|
import (
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"github.com/Dreamacro/clash/config"
|
||||||
|
)
|
||||||
|
|
||||||
func forEachProviders(rawCfg *config.RawConfig, fun func(index int, total int, key string, provider map[string]interface{})) {
|
func forEachProviders(rawCfg *config.RawConfig, fun func(index int, total int, key string, provider map[string]interface{})) {
|
||||||
total := len(rawCfg.ProxyProvider)
|
total := len(rawCfg.ProxyProvider)
|
||||||
@ -17,6 +21,6 @@ func forEachProviders(rawCfg *config.RawConfig, fun func(index int, total int, k
|
|||||||
|
|
||||||
func destroyProviders(cfg *config.Config) {
|
func destroyProviders(cfg *config.Config) {
|
||||||
for _, p := range cfg.Providers {
|
for _, p := range cfg.Providers {
|
||||||
_ = p.Destroy()
|
_ = p.(io.Closer).Close()
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -2,7 +2,6 @@ package core
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"net"
|
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"cfa/blob"
|
"cfa/blob"
|
||||||
@ -41,34 +40,13 @@ func Init(home, versionName string, platformVersion int) {
|
|||||||
return pkg, nil
|
return pkg, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
dialer.DialerHook = func(dialer *net.Dialer) error {
|
dialer.DefaultSocketHook = func(network, address string, conn syscall.RawConn) error {
|
||||||
dialer.Control = func(network, address string, c syscall.RawConn) error {
|
|
||||||
return c.Control(func(fd uintptr) {
|
|
||||||
app.MarkSocket(int(fd))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
dialer.ListenPacketHook = func(lc *net.ListenConfig, address string) (string, error) {
|
|
||||||
lc.Control = func(network, address string, c syscall.RawConn) error {
|
|
||||||
return c.Control(func(fd uintptr) {
|
|
||||||
app.MarkSocket(int(fd))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if platform.ShouldBlockConnection() {
|
|
||||||
return "", errBlocked
|
|
||||||
}
|
|
||||||
|
|
||||||
return address, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
dialer.DialHook = func(dialer *net.Dialer, network string, ip net.IP) error {
|
|
||||||
if platform.ShouldBlockConnection() {
|
if platform.ShouldBlockConnection() {
|
||||||
return errBlocked
|
return errBlocked
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return conn.Control(func(fd uintptr) {
|
||||||
|
app.MarkSocket(int(fd))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -6,8 +6,8 @@ require (
|
|||||||
cfa/blob v0.0.0 // local generated
|
cfa/blob v0.0.0 // local generated
|
||||||
github.com/Dreamacro/clash v0.0.0 // local
|
github.com/Dreamacro/clash v0.0.0 // local
|
||||||
github.com/dlclark/regexp2 v1.4.0
|
github.com/dlclark/regexp2 v1.4.0
|
||||||
github.com/kr328/tun2socket v0.0.0 // local
|
github.com/kr328/tun2socket-lwip v0.0.0-20210911023118-0b4947e2a9c1
|
||||||
github.com/miekg/dns v1.1.42
|
github.com/miekg/dns v1.1.43
|
||||||
github.com/oschwald/geoip2-golang v1.5.0
|
github.com/oschwald/geoip2-golang v1.5.0
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
||||||
gopkg.in/yaml.v2 v2.4.0
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
@ -15,6 +15,4 @@ require (
|
|||||||
|
|
||||||
replace github.com/Dreamacro/clash => ./clash
|
replace github.com/Dreamacro/clash => ./clash
|
||||||
|
|
||||||
replace github.com/kr328/tun2socket => ./tun2socket
|
|
||||||
|
|
||||||
replace cfa/blob => ../../../build/intermediates/golang_blob
|
replace cfa/blob => ../../../build/intermediates/golang_blob
|
114
core/src/foss/go/go.sum
Normal file
114
core/src/foss/go/go.sum
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
github.com/Dreamacro/go-shadowsocks2 v0.1.7 h1:8CtbE1HoPPMfrQZGXmlluq6dO2lL31W6WRRE8fabc4Q=
|
||||||
|
github.com/Dreamacro/go-shadowsocks2 v0.1.7/go.mod h1:8p5G4cAj5ZlXwUR+Ww63gfSikr8kvw8uw3TDwLAJpUc=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E=
|
||||||
|
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
|
||||||
|
github.com/fanliao/go-promise v0.0.0-20141029170127-1890db352a72/go.mod h1:PjfxuH4FZdUyfMdtBio2lsRr1AKEaVPwelzuHuh8Lqc=
|
||||||
|
github.com/go-chi/chi/v5 v5.0.4/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
|
||||||
|
github.com/go-chi/cors v1.2.0/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58=
|
||||||
|
github.com/go-chi/render v1.0.1/go.mod h1:pq4Rr7HbnsdaeHagklXub+p6Wd16Af5l9koip1OvJns=
|
||||||
|
github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
|
||||||
|
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||||
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
|
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
||||||
|
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
|
github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714/go.mod h1:2Goc3h8EklBH5mspfHFxBnEoURQCGzQQH1ga9Myjvis=
|
||||||
|
github.com/insomniacslk/dhcp v0.0.0-20210827173440-b95caade3eac h1:IO6EfdRnPhxgKOsk9DbewdtQZHKZKnGlW7QCUttvNys=
|
||||||
|
github.com/insomniacslk/dhcp v0.0.0-20210827173440-b95caade3eac/go.mod h1:h+MxyHxRg9NH3terB1nfRIUaQEcI0XOVkdR9LNBlp8E=
|
||||||
|
github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw=
|
||||||
|
github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ=
|
||||||
|
github.com/jsimonetti/rtnetlink v0.0.0-20201009170750-9c6f07d100c1/go.mod h1:hqoO/u39cqLeBLebZ8fWdE96O7FxrAsRYhnVOdgHxok=
|
||||||
|
github.com/jsimonetti/rtnetlink v0.0.0-20201110080708-d2c240429e6c/go.mod h1:huN4d1phzjhlOsNIjFsw2SVRbwIHj3fJDMEU2SDPTmg=
|
||||||
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
|
github.com/kr328/tun2socket-lwip v0.0.0-20210911023118-0b4947e2a9c1 h1:NJ5NyPHIok6hqdELvrI4bps5lLyfJtFmm0K4c9CB/WM=
|
||||||
|
github.com/kr328/tun2socket-lwip v0.0.0-20210911023118-0b4947e2a9c1/go.mod h1:JFkXLCpLkNVvLMRkq3gexTlRHfzbqcP5HfFOoq5Mj+g=
|
||||||
|
github.com/mdlayher/ethernet v0.0.0-20190606142754-0394541c37b7/go.mod h1:U6ZQobyTjI/tJyq2HG+i/dfSoFUt8/aZCM+GKtmFk/Y=
|
||||||
|
github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA=
|
||||||
|
github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M=
|
||||||
|
github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY=
|
||||||
|
github.com/mdlayher/netlink v1.1.1/go.mod h1:WTYpFb/WTvlRJAyKhZL5/uy69TDDpHHu2VZmb2XgV7o=
|
||||||
|
github.com/mdlayher/raw v0.0.0-20190606142536-fef19f00fc18/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg=
|
||||||
|
github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg=
|
||||||
|
github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg=
|
||||||
|
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
|
||||||
|
github.com/oschwald/geoip2-golang v1.5.0 h1:igg2yQIrrcRccB1ytFXqBfOHCjXWIoMv85lVJ1ONZzw=
|
||||||
|
github.com/oschwald/geoip2-golang v1.5.0/go.mod h1:xdvYt5xQzB8ORWFqPnqMwZpCpgNagttWdoZLlJQzg7s=
|
||||||
|
github.com/oschwald/maxminddb-golang v1.8.0 h1:Uh/DSnGoxsyp/KYbY1AuP0tYEwfs0sCph9p/UMXK/Hk=
|
||||||
|
github.com/oschwald/maxminddb-golang v1.8.0/go.mod h1:RXZtst0N6+FY/3qCNmZMBApR19cdQj43/NM9VkrNAis=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
|
||||||
|
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
|
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/u-root/uio v0.0.0-20210528114334-82958018845c h1:BFvcl34IGnw8yvJi8hlqLFo9EshRInwWBs2M5fGWzQA=
|
||||||
|
github.com/u-root/uio v0.0.0-20210528114334-82958018845c/go.mod h1:LpEX5FO/cB+WF4TYGY1V5qktpaZLkKkSegbr0V4eYXA=
|
||||||
|
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
|
||||||
|
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20210317152858-513c2a44f670/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||||
|
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
|
||||||
|
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190419010253-1f3472d942ba/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f h1:w6wWR0H+nyVpbSAQbzVEIACVyr/h8l/BEkY6Sokc7Eg=
|
||||||
|
golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
|
||||||
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190418153312-f0ce4c0180be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190606122018-79a91cf218c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191224085550-c709ea063b76/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34 h1:GkvMjFtXUmahfDtashnc1mnrCtuBVcwse5QV2lUk/tI=
|
||||||
|
golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
|
||||||
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
@ -46,7 +46,7 @@ accept:
|
|||||||
|
|
||||||
metadata := &C.Metadata{
|
metadata := &C.Metadata{
|
||||||
NetWork: C.TCP,
|
NetWork: C.TCP,
|
||||||
Type: C.SOCKS,
|
Type: C.SOCKS5,
|
||||||
SrcIP: sAddr.IP,
|
SrcIP: sAddr.IP,
|
||||||
DstIP: tAddr.IP,
|
DstIP: tAddr.IP,
|
||||||
SrcPort: strconv.Itoa(sAddr.Port),
|
SrcPort: strconv.Itoa(sAddr.Port),
|
@ -7,7 +7,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/kr328/tun2socket"
|
"github.com/kr328/tun2socket-lwip"
|
||||||
)
|
)
|
||||||
|
|
||||||
type adapter struct {
|
type adapter struct {
|
@ -3,14 +3,14 @@ package tun
|
|||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
"github.com/Dreamacro/clash/log"
|
|
||||||
"github.com/Dreamacro/clash/transport/socks5"
|
|
||||||
"github.com/kr328/tun2socket"
|
|
||||||
|
|
||||||
"github.com/Dreamacro/clash/adapter/inbound"
|
"github.com/Dreamacro/clash/adapter/inbound"
|
||||||
"github.com/Dreamacro/clash/common/pool"
|
"github.com/Dreamacro/clash/common/pool"
|
||||||
C "github.com/Dreamacro/clash/constant"
|
C "github.com/Dreamacro/clash/constant"
|
||||||
|
"github.com/Dreamacro/clash/log"
|
||||||
|
"github.com/Dreamacro/clash/transport/socks5"
|
||||||
"github.com/Dreamacro/clash/tunnel"
|
"github.com/Dreamacro/clash/tunnel"
|
||||||
|
|
||||||
|
"github.com/kr328/tun2socket-lwip"
|
||||||
)
|
)
|
||||||
|
|
||||||
type packet struct {
|
type packet struct {
|
||||||
@ -74,7 +74,7 @@ read:
|
|||||||
data: buf[:n],
|
data: buf[:n],
|
||||||
}
|
}
|
||||||
|
|
||||||
tunnel.UDPIn() <- inbound.NewPacket(socks5.ParseAddrToSocksAddr(tAddr), pkt, C.SOCKS)
|
tunnel.UDPIn() <- inbound.NewPacket(socks5.ParseAddrToSocksAddr(tAddr), pkt, C.SOCKS5)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/Dreamacro/clash/adapter"
|
"github.com/Dreamacro/clash/adapter"
|
||||||
"github.com/Dreamacro/clash/adapter/outboundgroup"
|
"github.com/Dreamacro/clash/adapter/outboundgroup"
|
||||||
"github.com/Dreamacro/clash/adapter/provider"
|
"github.com/Dreamacro/clash/constant/provider"
|
||||||
"github.com/Dreamacro/clash/log"
|
"github.com/Dreamacro/clash/log"
|
||||||
"github.com/Dreamacro/clash/tunnel"
|
"github.com/Dreamacro/clash/tunnel"
|
||||||
)
|
)
|
@ -7,7 +7,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/Dreamacro/clash/adapter/provider"
|
P "github.com/Dreamacro/clash/adapter/provider"
|
||||||
|
"github.com/Dreamacro/clash/constant/provider"
|
||||||
"github.com/Dreamacro/clash/tunnel"
|
"github.com/Dreamacro/clash/tunnel"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -38,7 +39,7 @@ func QueryProviders() []*Provider {
|
|||||||
for _, p := range providers {
|
for _, p := range providers {
|
||||||
updatedAt := time.Time{}
|
updatedAt := time.Time{}
|
||||||
|
|
||||||
if s, ok := p.(provider.UpdatableProvider); ok {
|
if s, ok := p.(P.UpdatableProvider); ok {
|
||||||
updatedAt = s.UpdatedAt()
|
updatedAt = s.UpdatedAt()
|
||||||
}
|
}
|
||||||
|
|
@ -8,8 +8,8 @@ import (
|
|||||||
"github.com/dlclark/regexp2"
|
"github.com/dlclark/regexp2"
|
||||||
|
|
||||||
"github.com/Dreamacro/clash/adapter/outboundgroup"
|
"github.com/Dreamacro/clash/adapter/outboundgroup"
|
||||||
"github.com/Dreamacro/clash/adapter/provider"
|
|
||||||
C "github.com/Dreamacro/clash/constant"
|
C "github.com/Dreamacro/clash/constant"
|
||||||
|
"github.com/Dreamacro/clash/constant/provider"
|
||||||
"github.com/Dreamacro/clash/log"
|
"github.com/Dreamacro/clash/log"
|
||||||
"github.com/Dreamacro/clash/tunnel"
|
"github.com/Dreamacro/clash/tunnel"
|
||||||
)
|
)
|
@ -19,7 +19,6 @@ endif ()
|
|||||||
|
|
||||||
include_directories("${GO_OUTPUT_BASE}/${CMAKE_ANDROID_ARCH_ABI}")
|
include_directories("${GO_OUTPUT_BASE}/${CMAKE_ANDROID_ARCH_ABI}")
|
||||||
include_directories("${GO_SOURCE}")
|
include_directories("${GO_SOURCE}")
|
||||||
include_directories("${GO_SOURCE}/tun2socket/bridge/native")
|
|
||||||
|
|
||||||
link_directories("${GO_OUTPUT_BASE}/${CMAKE_ANDROID_ARCH_ABI}")
|
link_directories("${GO_OUTPUT_BASE}/${CMAKE_ANDROID_ARCH_ABI}")
|
||||||
|
|
||||||
|
@ -1 +0,0 @@
|
|||||||
Subproject commit 1f076a4724c7f0056d5a1a5bdd14d794aa635c81
|
|
@ -1 +0,0 @@
|
|||||||
Subproject commit ba5ce167b596e89b046376828c20778a8275f49c
|
|
@ -1,70 +1,22 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("com.android.library")
|
|
||||||
kotlin("android")
|
kotlin("android")
|
||||||
kotlin("kapt")
|
kotlin("kapt")
|
||||||
}
|
id("com.android.library")
|
||||||
|
|
||||||
android {
|
|
||||||
compileSdk = buildTargetSdkVersion
|
|
||||||
|
|
||||||
flavorDimensions(buildFlavor)
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
minSdk = buildMinSdkVersion
|
|
||||||
targetSdk = buildTargetSdkVersion
|
|
||||||
|
|
||||||
versionCode = buildVersionCode
|
|
||||||
versionName = buildVersionName
|
|
||||||
|
|
||||||
consumerProguardFiles("consumer-rules.pro")
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
named("release") {
|
|
||||||
isMinifyEnabled = false
|
|
||||||
proguardFiles(
|
|
||||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
|
||||||
"proguard-rules.pro"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
productFlavors {
|
|
||||||
create("foss") {
|
|
||||||
dimension = "foss"
|
|
||||||
}
|
|
||||||
create("premium") {
|
|
||||||
dimension = "premium"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
buildFeatures {
|
|
||||||
dataBinding = true
|
|
||||||
}
|
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
kotlinOptions {
|
|
||||||
jvmTarget = "1.8"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api(project(":common"))
|
implementation(project(":common"))
|
||||||
api(project(":core"))
|
implementation(project(":core"))
|
||||||
api(project(":service"))
|
implementation(project(":service"))
|
||||||
|
|
||||||
implementation(kotlin("stdlib-jdk7"))
|
implementation(kotlin("stdlib-jdk7"))
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutineVersion")
|
implementation(deps.kotlin.coroutine)
|
||||||
implementation("androidx.core:core-ktx:$coreVersion")
|
implementation(deps.androidx.core)
|
||||||
implementation("androidx.appcompat:appcompat:$appcompatVersion")
|
implementation(deps.androidx.appcompat)
|
||||||
implementation("androidx.activity:activity:$activityVersion")
|
implementation(deps.androidx.activity)
|
||||||
implementation("com.google.android.material:material:$materialVersion")
|
implementation(deps.androidx.coordinator)
|
||||||
implementation("androidx.coordinatorlayout:coordinatorlayout:$coordinatorlayoutVersion")
|
implementation(deps.androidx.recyclerview)
|
||||||
implementation("androidx.recyclerview:recyclerview:$recyclerviewVersion")
|
implementation(deps.androidx.fragment)
|
||||||
implementation("androidx.fragment:fragment:$fragmentVersion")
|
implementation(deps.androidx.viewpager)
|
||||||
implementation("androidx.viewpager2:viewpager2:$viewpagerVersion")
|
implementation(deps.google.material)
|
||||||
}
|
}
|
||||||
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionSha256Sum=13bf8d3cf8eeeb5770d19741a59bde9bd966dd78d17f1bbad787a05ef19d1c2d
|
distributionSha256Sum=a8da5b02437a60819cad23e10fc7e9cf32bcb57029d9cb277e26eeff76ce014b
|
269
gradlew
vendored
269
gradlew
vendored
@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env sh
|
#!/bin/sh
|
||||||
|
|
||||||
#
|
#
|
||||||
# Copyright 2015 the original author or authors.
|
# Copyright ? 2015-2021 the original authors.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
@ -17,67 +17,101 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
##
|
#
|
||||||
## Gradle start up script for UN*X
|
# Gradle start up script for POSIX generated by Gradle.
|
||||||
##
|
#
|
||||||
|
# Important for running:
|
||||||
|
#
|
||||||
|
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||||
|
# noncompliant, but you have some other compliant shell such as ksh or
|
||||||
|
# bash, then to run this script, type that shell name before the whole
|
||||||
|
# command line, like:
|
||||||
|
#
|
||||||
|
# ksh Gradle
|
||||||
|
#
|
||||||
|
# Busybox and similar reduced shells will NOT work, because this script
|
||||||
|
# requires all of these POSIX shell features:
|
||||||
|
# * functions;
|
||||||
|
# * expansions ?$var?, ?${var}?, ?${var:-default}?, ?${var+SET}?,
|
||||||
|
# ?${var#prefix}?, ?${var%suffix}?, and ?$( cmd )?;
|
||||||
|
# * compound commands having a testable exit status, especially ?case?;
|
||||||
|
# * various built-in commands including ?command?, ?set?, and ?ulimit?.
|
||||||
|
#
|
||||||
|
# Important for patching:
|
||||||
|
#
|
||||||
|
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||||
|
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||||
|
#
|
||||||
|
# The "traditional" practice of packing multiple parameters into a
|
||||||
|
# space-separated string is a well documented source of bugs and security
|
||||||
|
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||||
|
# options in "$@", and eventually passing that to Java.
|
||||||
|
#
|
||||||
|
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||||
|
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||||
|
# see the in-line comments for details.
|
||||||
|
#
|
||||||
|
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||||
|
# Darwin, MinGW, and NonStop.
|
||||||
|
#
|
||||||
|
# (3) This script is generated from the Groovy template
|
||||||
|
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||||
|
# within the Gradle project.
|
||||||
|
#
|
||||||
|
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||||
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
# Attempt to set APP_HOME
|
# Attempt to set APP_HOME
|
||||||
|
|
||||||
# Resolve links: $0 may be a link
|
# Resolve links: $0 may be a link
|
||||||
PRG="$0"
|
app_path=$0
|
||||||
# Need this for relative symlinks.
|
|
||||||
while [ -h "$PRG" ] ; do
|
# Need this for daisy-chained symlinks.
|
||||||
ls=`ls -ld "$PRG"`
|
while
|
||||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||||
if expr "$link" : '/.*' > /dev/null; then
|
[ -h "$app_path" ]
|
||||||
PRG="$link"
|
do
|
||||||
else
|
ls=$( ls -ld "$app_path" )
|
||||||
PRG=`dirname "$PRG"`"/$link"
|
link=${ls#*' -> '}
|
||||||
fi
|
case $link in #(
|
||||||
|
/*) app_path=$link ;; #(
|
||||||
|
*) app_path=$APP_HOME$link ;;
|
||||||
|
esac
|
||||||
done
|
done
|
||||||
SAVED="`pwd`"
|
|
||||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||||
APP_HOME="`pwd -P`"
|
|
||||||
cd "$SAVED" >/dev/null
|
|
||||||
|
|
||||||
APP_NAME="Gradle"
|
APP_NAME="Gradle"
|
||||||
APP_BASE_NAME=`basename "$0"`
|
APP_BASE_NAME=${0##*/}
|
||||||
|
|
||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
MAX_FD="maximum"
|
MAX_FD=maximum
|
||||||
|
|
||||||
warn () {
|
warn () {
|
||||||
echo "$*"
|
echo "$*"
|
||||||
}
|
} >&2
|
||||||
|
|
||||||
die () {
|
die () {
|
||||||
echo
|
echo
|
||||||
echo "$*"
|
echo "$*"
|
||||||
echo
|
echo
|
||||||
exit 1
|
exit 1
|
||||||
}
|
} >&2
|
||||||
|
|
||||||
# OS specific support (must be 'true' or 'false').
|
# OS specific support (must be 'true' or 'false').
|
||||||
cygwin=false
|
cygwin=false
|
||||||
msys=false
|
msys=false
|
||||||
darwin=false
|
darwin=false
|
||||||
nonstop=false
|
nonstop=false
|
||||||
case "`uname`" in
|
case "$( uname )" in #(
|
||||||
CYGWIN* )
|
CYGWIN* ) cygwin=true ;; #(
|
||||||
cygwin=true
|
Darwin* ) darwin=true ;; #(
|
||||||
;;
|
MSYS* | MINGW* ) msys=true ;; #(
|
||||||
Darwin* )
|
NONSTOP* ) nonstop=true ;;
|
||||||
darwin=true
|
|
||||||
;;
|
|
||||||
MINGW* )
|
|
||||||
msys=true
|
|
||||||
;;
|
|
||||||
NONSTOP* )
|
|
||||||
nonstop=true
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
|||||||
if [ -n "$JAVA_HOME" ] ; then
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
# IBM's JDK on AIX uses strange locations for the executables
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||||
else
|
else
|
||||||
JAVACMD="$JAVA_HOME/bin/java"
|
JAVACMD=$JAVA_HOME/bin/java
|
||||||
fi
|
fi
|
||||||
if [ ! -x "$JAVACMD" ] ; then
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||||
@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
|
|||||||
location of your Java installation."
|
location of your Java installation."
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
JAVACMD="java"
|
JAVACMD=java
|
||||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
|
||||||
Please set the JAVA_HOME variable in your environment to match the
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
@ -106,80 +140,95 @@ location of your Java installation."
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Increase the maximum file descriptors if we can.
|
# Increase the maximum file descriptors if we can.
|
||||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||||
MAX_FD_LIMIT=`ulimit -H -n`
|
case $MAX_FD in #(
|
||||||
if [ $? -eq 0 ] ; then
|
max*)
|
||||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
MAX_FD=$( ulimit -H -n ) ||
|
||||||
MAX_FD="$MAX_FD_LIMIT"
|
warn "Could not query maximum file descriptor limit"
|
||||||
fi
|
esac
|
||||||
ulimit -n $MAX_FD
|
case $MAX_FD in #(
|
||||||
if [ $? -ne 0 ] ; then
|
'' | soft) :;; #(
|
||||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
*)
|
||||||
fi
|
ulimit -n "$MAX_FD" ||
|
||||||
else
|
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# For Darwin, add options to specify how the application appears in the dock
|
|
||||||
if $darwin; then
|
|
||||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
|
||||||
fi
|
|
||||||
|
|
||||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
|
||||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
|
||||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
|
||||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
|
||||||
|
|
||||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
|
||||||
|
|
||||||
# We build the pattern for arguments to be converted via cygpath
|
|
||||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
|
||||||
SEP=""
|
|
||||||
for dir in $ROOTDIRSRAW ; do
|
|
||||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
|
||||||
SEP="|"
|
|
||||||
done
|
|
||||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
|
||||||
# Add a user-defined pattern to the cygpath arguments
|
|
||||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
|
||||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
|
||||||
fi
|
|
||||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
|
||||||
i=0
|
|
||||||
for arg in "$@" ; do
|
|
||||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
|
||||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
|
||||||
|
|
||||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
|
||||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
|
||||||
else
|
|
||||||
eval `echo args$i`="\"$arg\""
|
|
||||||
fi
|
|
||||||
i=`expr $i + 1`
|
|
||||||
done
|
|
||||||
case $i in
|
|
||||||
0) set -- ;;
|
|
||||||
1) set -- "$args0" ;;
|
|
||||||
2) set -- "$args0" "$args1" ;;
|
|
||||||
3) set -- "$args0" "$args1" "$args2" ;;
|
|
||||||
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
|
||||||
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
|
||||||
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
|
||||||
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
|
||||||
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
|
||||||
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Escape application args
|
# Collect all arguments for the java command, stacking in reverse order:
|
||||||
save () {
|
# * args from the command line
|
||||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
# * the main class name
|
||||||
echo " "
|
# * -classpath
|
||||||
}
|
# * -D...appname settings
|
||||||
APP_ARGS=`save "$@"`
|
# * --module-path (only if needed)
|
||||||
|
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||||
|
|
||||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
if "$cygwin" || "$msys" ; then
|
||||||
|
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||||
|
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||||
|
|
||||||
|
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||||
|
|
||||||
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||||
|
for arg do
|
||||||
|
if
|
||||||
|
case $arg in #(
|
||||||
|
-*) false ;; # don't mess with options #(
|
||||||
|
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||||
|
[ -e "$t" ] ;; #(
|
||||||
|
*) false ;;
|
||||||
|
esac
|
||||||
|
then
|
||||||
|
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||||
|
fi
|
||||||
|
# Roll the args list around exactly as many times as the number of
|
||||||
|
# args, so each arg winds up back in the position where it started, but
|
||||||
|
# possibly modified.
|
||||||
|
#
|
||||||
|
# NB: a `for` loop captures its iteration list before it begins, so
|
||||||
|
# changing the positional parameters here affects neither the number of
|
||||||
|
# iterations, nor the values presented in `arg`.
|
||||||
|
shift # remove old arg
|
||||||
|
set -- "$@" "$arg" # push replacement arg
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Collect all arguments for the java command;
|
||||||
|
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||||
|
# shell script including quotes and variable substitutions, so put them in
|
||||||
|
# double quotes to make sure that they get re-expanded; and
|
||||||
|
# * put everything else in single quotes, so that it's not re-expanded.
|
||||||
|
|
||||||
|
set -- \
|
||||||
|
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||||
|
-classpath "$CLASSPATH" \
|
||||||
|
org.gradle.wrapper.GradleWrapperMain \
|
||||||
|
"$@"
|
||||||
|
|
||||||
|
# Use "xargs" to parse quoted args.
|
||||||
|
#
|
||||||
|
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||||
|
#
|
||||||
|
# In Bash we could simply go:
|
||||||
|
#
|
||||||
|
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||||
|
# set -- "${ARGS[@]}" "$@"
|
||||||
|
#
|
||||||
|
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||||
|
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||||
|
# character that might be a shell metacharacter, then use eval to reverse
|
||||||
|
# that process (while maintaining the separation between arguments), and wrap
|
||||||
|
# the whole thing up as a single "set" statement.
|
||||||
|
#
|
||||||
|
# This will of course break if any of these variables contains a newline or
|
||||||
|
# an unmatched quote.
|
||||||
|
#
|
||||||
|
|
||||||
|
eval "set -- $(
|
||||||
|
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||||
|
xargs -n1 |
|
||||||
|
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||||
|
tr '\n' ' '
|
||||||
|
)" '"$@"'
|
||||||
|
|
||||||
exec "$JAVACMD" "$@"
|
exec "$JAVACMD" "$@"
|
||||||
|
@ -1,31 +1,3 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("com.android.library")
|
id("com.android.library")
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
|
||||||
compileSdk = buildTargetSdkVersion
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
minSdk = buildMinSdkVersion
|
|
||||||
targetSdk = buildTargetSdkVersion
|
|
||||||
|
|
||||||
versionCode = buildVersionCode
|
|
||||||
versionName = buildVersionName
|
|
||||||
|
|
||||||
consumerProguardFiles("consumer-rules.pro")
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
named("release") {
|
|
||||||
isMinifyEnabled = false
|
|
||||||
proguardFiles(
|
|
||||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
|
||||||
"proguard-rules.pro"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
|
|
||||||
}
|
|
1
kaidl
1
kaidl
@ -1 +0,0 @@
|
|||||||
Subproject commit 16da2e83b72eb6ce6088aac8b59e2735bf020e95
|
|
@ -1,73 +1,26 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("com.android.library")
|
|
||||||
kotlin("android")
|
kotlin("android")
|
||||||
kotlin("kapt")
|
kotlin("kapt")
|
||||||
id("kotlinx-serialization")
|
id("kotlinx-serialization")
|
||||||
|
id("com.android.library")
|
||||||
id("com.google.devtools.ksp")
|
id("com.google.devtools.ksp")
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
|
||||||
compileSdk = buildTargetSdkVersion
|
|
||||||
|
|
||||||
flavorDimensions(buildFlavor)
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
minSdk = buildMinSdkVersion
|
|
||||||
targetSdk = buildTargetSdkVersion
|
|
||||||
|
|
||||||
versionCode = buildVersionCode
|
|
||||||
versionName = buildVersionName
|
|
||||||
|
|
||||||
consumerProguardFiles("consumer-rules.pro")
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
named("release") {
|
|
||||||
isMinifyEnabled = false
|
|
||||||
proguardFiles(
|
|
||||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
|
||||||
"proguard-rules.pro"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
productFlavors {
|
|
||||||
create("foss") {
|
|
||||||
dimension = "foss"
|
|
||||||
}
|
|
||||||
create("premium") {
|
|
||||||
dimension = "premium"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
kotlinOptions {
|
|
||||||
jvmTarget = "1.8"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
ksp(project(":kaidl:kaidl"))
|
ksp(deps.kaidl.compiler)
|
||||||
kapt("androidx.room:room-compiler:$roomVersion")
|
kapt(deps.androidx.room.compiler)
|
||||||
|
|
||||||
api(project(":core"))
|
implementation(project(":core"))
|
||||||
api(project(":common"))
|
implementation(project(":common"))
|
||||||
|
|
||||||
implementation(project(":kaidl:kaidl-runtime")) {
|
|
||||||
exclude(group = "org.jetbrains.kotlinx", module = "kotlinx-coroutines-core")
|
|
||||||
}
|
|
||||||
|
|
||||||
implementation(kotlin("stdlib-jdk7"))
|
implementation(kotlin("stdlib-jdk7"))
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutineVersion")
|
implementation(deps.kotlin.coroutine)
|
||||||
implementation("androidx.room:room-runtime:$roomVersion")
|
implementation(deps.kotlin.serialization.json)
|
||||||
implementation("androidx.room:room-ktx:$roomVersion")
|
implementation(deps.androidx.core)
|
||||||
implementation("androidx.core:core-ktx:$coreVersion")
|
implementation(deps.androidx.room.runtime)
|
||||||
implementation("dev.rikka.rikkax.preference:multiprocess:$muiltprocessVersion")
|
implementation(deps.androidx.room.ktx)
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serializationVersion")
|
implementation(deps.kaidl.runtime)
|
||||||
|
implementation(deps.rikkax.multiprocess)
|
||||||
}
|
}
|
||||||
|
|
||||||
afterEvaluate {
|
afterEvaluate {
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
@file:Suppress("UnstableApiUsage")
|
||||||
|
|
||||||
|
enableFeaturePreview("VERSION_CATALOGS")
|
||||||
|
|
||||||
rootProject.name = "ClashForAndroid"
|
rootProject.name = "ClashForAndroid"
|
||||||
|
|
||||||
include(":app")
|
include(":app")
|
||||||
@ -6,12 +10,52 @@ include(":service")
|
|||||||
include(":design")
|
include(":design")
|
||||||
include(":common")
|
include(":common")
|
||||||
include(":hideapi")
|
include(":hideapi")
|
||||||
include(":kaidl:kaidl")
|
|
||||||
include(":kaidl:kaidl-runtime")
|
|
||||||
|
|
||||||
pluginManagement {
|
dependencyResolutionManagement {
|
||||||
repositories {
|
versionCatalogs {
|
||||||
mavenCentral()
|
create("deps") {
|
||||||
google()
|
val agp = "7.0.2"
|
||||||
|
val ksp = "1.5.30-1.0.0-beta09"
|
||||||
|
val kotlin = "1.5.30"
|
||||||
|
val golang = "1.0.1"
|
||||||
|
val coroutine = "1.5.0"
|
||||||
|
val coreKtx = "1.5.0"
|
||||||
|
val activity = "1.2.3"
|
||||||
|
val fragment = "1.3.4"
|
||||||
|
val appcompat = "1.3.0"
|
||||||
|
val coordinator = "1.1.0"
|
||||||
|
val recyclerview = "1.2.1"
|
||||||
|
val viewpager = "1.0.0"
|
||||||
|
val material = "1.3.0"
|
||||||
|
val appcenter = "4.2.0"
|
||||||
|
val serialization = "1.2.1"
|
||||||
|
val kaidl = "1.14"
|
||||||
|
val room = "2.3.0"
|
||||||
|
val multiprocess = "1.0.0"
|
||||||
|
|
||||||
|
alias("build-android").to("com.android.tools.build:gradle:$agp")
|
||||||
|
alias("build-kotlin-common").to("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin")
|
||||||
|
alias("build-kotlin-serialization").to("org.jetbrains.kotlin:kotlin-serialization:$kotlin")
|
||||||
|
alias("build-ksp").to("com.google.devtools.ksp:symbol-processing-gradle-plugin:$ksp")
|
||||||
|
alias("build-golang").to("com.github.kr328.golang:gradle-plugin:$golang")
|
||||||
|
alias("kotlin-coroutine").to("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutine")
|
||||||
|
alias("kotlin-serialization-json").to("org.jetbrains.kotlinx:kotlinx-serialization-json:$serialization")
|
||||||
|
alias("androidx-core").to("androidx.core:core-ktx:$coreKtx")
|
||||||
|
alias("androidx-activity").to("androidx.activity:activity:$activity")
|
||||||
|
alias("androidx-fragment").to("androidx.fragment:fragment:$fragment")
|
||||||
|
alias("androidx-appcompat").to("androidx.appcompat:appcompat:$appcompat")
|
||||||
|
alias("androidx-coordinator").to("androidx.coordinatorlayout:coordinatorlayout:$coordinator")
|
||||||
|
alias("androidx-recyclerview").to("androidx.recyclerview:recyclerview:$recyclerview")
|
||||||
|
alias("androidx-viewpager").to("androidx.viewpager2:viewpager2:$viewpager")
|
||||||
|
alias("androidx-room-compiler").to("androidx.room:room-compiler:$room")
|
||||||
|
alias("androidx-room-runtime").to("androidx.room:room-runtime:$room")
|
||||||
|
alias("androidx-room-ktx").to("androidx.room:room-ktx:$room")
|
||||||
|
alias("google-material").to("com.google.android.material:material:$material")
|
||||||
|
alias("appcenter-analytics").to("com.microsoft.appcenter:appcenter-analytics:$appcenter")
|
||||||
|
alias("appcenter-crashes").to("com.microsoft.appcenter:appcenter-crashes:$appcenter")
|
||||||
|
alias("kaidl-compiler").to("com.github.kr328.kaidl:kaidl:$kaidl")
|
||||||
|
alias("kaidl-runtime").to("com.github.kr328.kaidl:kaidl-runtime:$kaidl")
|
||||||
|
alias("rikkax-multiprocess").to("dev.rikka.rikkax.preference:multiprocess:$multiprocess")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user