Update On Fri May 9 20:36:54 CEST 2025

This commit is contained in:
github-action[bot]
2025-05-09 20:36:54 +02:00
parent 40a1860078
commit 5ad5eb65a0
268 changed files with 32572 additions and 1774 deletions
+10 -11
View File
@@ -1,8 +1,8 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id("com.github.ben-manes.versions") version "0.52.0"
id("com.google.devtools.ksp") version "2.1.20-2.0.0" apply false
alias(libs.plugins.versions)
alias(libs.plugins.ksp) apply false
}
buildscript {
@@ -15,15 +15,14 @@ buildscript {
}
dependencies {
val kotlinVersion = rootProject.extra["kotlinVersion"].toString()
classpath(rootProject.extra["androidPlugin"].toString())
classpath(kotlin("gradle-plugin", kotlinVersion))
classpath("com.google.android.gms:oss-licenses-plugin:0.10.6")
classpath("com.google.firebase:firebase-crashlytics-gradle:3.0.3")
classpath("com.google.gms:google-services:4.4.2")
classpath("com.vanniktech:gradle-maven-publish-plugin:0.31.0")
classpath("org.jetbrains.dokka:dokka-gradle-plugin:2.0.0")
classpath("org.mozilla.rust-android-gradle:plugin:0.9.6")
classpath(libs.android.gradle)
classpath(libs.dokka)
classpath(libs.firebase.crashlytics.gradle)
classpath(libs.google.oss.licenses)
classpath(libs.google.services)
classpath(libs.gradle.maven.publish)
classpath(libs.kotlin.gradle)
classpath(libs.rust.android)
}
}
@@ -5,6 +5,6 @@ plugins {
apply(from = "../repositories.gradle.kts")
dependencies {
implementation(rootProject.extra["androidPlugin"].toString())
implementation(kotlin("gradle-plugin", rootProject.extra["kotlinVersion"].toString()))
implementation(libs.android.gradle)
implementation(libs.kotlin.gradle)
}
@@ -0,0 +1,7 @@
dependencyResolutionManagement {
versionCatalogs {
create("libs") {
from(files("../gradle/libs.versions.toml"))
}
}
}
@@ -8,8 +8,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension
import java.util.Locale
const val lifecycleVersion = "2.8.7"
private val Project.android get() = extensions.getByName<BaseExtension>("android")
private val BaseExtension.lint get() = (this as CommonExtension<*, *, *, *, *, *>).lint
@@ -42,12 +40,6 @@ fun Project.setupCommon() {
}
extensions.getByName<KotlinAndroidProjectExtension>("kotlin").compilerOptions.jvmTarget
.set(JvmTarget.fromTarget(javaVersion.toString()))
dependencies {
add("testImplementation", "junit:junit:4.13.2")
add("androidTestImplementation", "androidx.test:runner:1.6.2")
add("androidTestImplementation", "androidx.test.espresso:espresso-core:3.6.1")
}
}
fun Project.setupCore() {
@@ -65,7 +57,6 @@ fun Project.setupCore() {
}
buildFeatures.buildConfig = true
}
dependencies.add("coreLibraryDesugaring", "com.android.tools:desugar_jdk_libs:2.1.5")
}
fun Project.setupApp() {
+21 -22
View File
@@ -88,27 +88,26 @@ tasks.register<Exec>("cargoClean") {
tasks.clean.dependsOn("cargoClean")
dependencies {
val coroutinesVersion = "1.10.2"
val roomVersion = "2.7.0"
val workVersion = "2.10.0"
api(project(":plugin"))
api("androidx.core:core-ktx:1.16.0")
api("com.google.android.material:material:1.12.0")
api("androidx.lifecycle:lifecycle-livedata-core-ktx:$lifecycleVersion")
api("androidx.preference:preference:1.2.1")
api("androidx.room:room-runtime:$roomVersion")
api("androidx.work:work-multiprocess:$workVersion")
api("androidx.work:work-runtime-ktx:$workVersion")
api("com.google.android.gms:play-services-oss-licenses:17.1.0")
api("com.google.firebase:firebase-analytics:22.4.0")
api("com.google.firebase:firebase-crashlytics:19.4.2")
api("com.jakewharton.timber:timber:5.0.1")
api("dnsjava:dnsjava:3.6.3")
api("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion")
api("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$coroutinesVersion")
ksp("androidx.room:room-compiler:$roomVersion")
androidTestImplementation("androidx.room:room-testing:$roomVersion")
androidTestImplementation("androidx.test.ext:junit-ktx:1.2.1")
api(libs.androidx.core.ktx)
api(libs.androidx.lifecycle.livedata.core.ktx)
api(libs.androidx.preference)
api(libs.androidx.room.runtime)
api(libs.androidx.work.multiprocess)
api(libs.androidx.work.runtime.ktx)
api(libs.dnsjava)
api(libs.firebase.analytics)
api(libs.firebase.crashlytics)
api(libs.kotlinx.coroutines.android)
api(libs.kotlinx.coroutines.play.services)
api(libs.material)
api(libs.play.services.oss.licenses)
api(libs.timber)
coreLibraryDesugaring(libs.desugar)
ksp(libs.androidx.room.compiler)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(libs.androidx.junit.ktx)
androidTestImplementation(libs.androidx.room.testing)
androidTestImplementation(libs.androidx.test.runner)
}
@@ -20,12 +20,12 @@ jobs:
toolchain: stable
- target: aarch64-unknown-linux-musl
toolchain: stable
- target: mips-unknown-linux-gnu
toolchain: nightly
- target: mipsel-unknown-linux-gnu
toolchain: nightly
- target: mips64el-unknown-linux-gnuabi64
toolchain: nightly
#- target: mips-unknown-linux-gnu
# toolchain: nightly
#- target: mipsel-unknown-linux-gnu
# toolchain: nightly
#- target: mips64el-unknown-linux-gnuabi64
# toolchain: nightly
steps:
- name: Free Disk Space (Ubuntu)
@@ -21,10 +21,6 @@ jobs:
- uses: Swatinem/rust-cache@v2
- if: ${{ runner.os == 'Windows' }}
uses: ilammy/setup-nasm@v1
- name: Install Protoc
uses: arduino/setup-protoc@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Install Rust
run: |
rustup set profile minimal
@@ -287,7 +287,7 @@ dependencies = [
"bitflags 2.9.0",
"cexpr",
"clang-sys",
"itertools",
"itertools 0.12.1",
"lazy_static",
"lazycell",
"proc-macro2",
@@ -298,6 +298,24 @@ dependencies = [
"syn 2.0.100",
]
[[package]]
name = "bindgen"
version = "0.71.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3"
dependencies = [
"bitflags 2.9.0",
"cexpr",
"clang-sys",
"itertools 0.13.0",
"proc-macro2",
"quote",
"regex",
"rustc-hash 2.1.1",
"shlex",
"syn 2.0.100",
]
[[package]]
name = "bitflags"
version = "1.3.2"
@@ -324,9 +342,9 @@ dependencies = [
[[package]]
name = "blake3"
version = "1.7.0"
version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b17679a8d69b6d7fd9cd9801a536cec9fa5e5970b69f9d4747f70b39b031f5e7"
checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0"
dependencies = [
"arrayref",
"arrayvec",
@@ -369,9 +387,9 @@ dependencies = [
[[package]]
name = "brotli"
version = "7.0.0"
version = "8.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd"
checksum = "cf19e729cdbd51af9a397fb9ef8ac8378007b797f8273cfbfdf45dcaa316167b"
dependencies = [
"alloc-no-stdlib",
"alloc-stdlib",
@@ -380,9 +398,9 @@ dependencies = [
[[package]]
name = "brotli-decompressor"
version = "4.0.2"
version = "5.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37"
checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03"
dependencies = [
"alloc-no-stdlib",
"alloc-stdlib",
@@ -403,7 +421,7 @@ dependencies = [
"indexmap",
"js-sys",
"once_cell",
"rand 0.9.0",
"rand 0.9.1",
"serde",
"serde_bytes",
"serde_json",
@@ -490,9 +508,9 @@ dependencies = [
[[package]]
name = "cc"
version = "1.2.16"
version = "1.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c"
checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a"
dependencies = [
"jobserver",
"libc",
@@ -592,18 +610,18 @@ dependencies = [
[[package]]
name = "clap"
version = "4.5.32"
version = "4.5.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6088f3ae8c3608d19260cd7445411865a485688711b78b5be70d78cd96136f83"
checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071"
dependencies = [
"clap_builder",
]
[[package]]
name = "clap_builder"
version = "4.5.32"
version = "4.5.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22a7ef7f676155edfb82daa97f99441f3ebf4a58d5e32f295a56259f1b6facc8"
checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2"
dependencies = [
"anstream",
"anstyle",
@@ -706,9 +724,9 @@ checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b"
[[package]]
name = "crossbeam-channel"
version = "0.5.14"
version = "0.5.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471"
checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
dependencies = [
"crossbeam-utils",
]
@@ -777,9 +795,18 @@ checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010"
[[package]]
name = "defmt"
version = "0.3.10"
version = "0.3.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86f6162c53f659f65d00619fe31f14556a6e9f8752ccc4a41bd177ffcf3d6130"
checksum = "f0963443817029b2024136fc4dd07a5107eb8f977eaf18fcd1fdeb11306b64ad"
dependencies = [
"defmt 1.0.1",
]
[[package]]
name = "defmt"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "548d977b6da32fa1d1fda2876453da1e7df63ad0304c8b3dae4dbe7b96f39b78"
dependencies = [
"bitflags 1.3.2",
"defmt-macros",
@@ -787,9 +814,9 @@ dependencies = [
[[package]]
name = "defmt-macros"
version = "0.4.0"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d135dd939bad62d7490b0002602d35b358dce5fd9233a709d3c1ef467d4bde6"
checksum = "3d4fc12a85bcf441cfe44344c4b72d58493178ce635338a3f3b78943aceb258e"
dependencies = [
"defmt-parser",
"proc-macro-error2",
@@ -800,9 +827,9 @@ dependencies = [
[[package]]
name = "defmt-parser"
version = "0.4.1"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3983b127f13995e68c1e29071e5d115cd96f215ccb5e6812e3728cd6f92653b3"
checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e"
dependencies = [
"thiserror 2.0.12",
]
@@ -888,9 +915,9 @@ dependencies = [
[[package]]
name = "dynosaur"
version = "0.1.3"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1b7ff6b5c4d1df9f75c6bcce5cebfa480a448d298b0c83a07b3f5bb318ad10f"
checksum = "277b2cb52d2df4acece06bb16bc0bb0a006970c7bf504eac2d310927a6f65890"
dependencies = [
"dynosaur_derive",
"trait-variant",
@@ -898,9 +925,9 @@ dependencies = [
[[package]]
name = "dynosaur_derive"
version = "0.1.3"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a600ac649c596084163b9bcde422e9973a321dd190b9d8b15dde23986e53f425"
checksum = "7a4102713839a8c01c77c165bc38ef2e83948f6397fa1e1dcfacec0f07b149d3"
dependencies = [
"proc-macro2",
"quote",
@@ -985,9 +1012,9 @@ dependencies = [
[[package]]
name = "env_logger"
version = "0.11.7"
version = "0.11.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3716d7a920fb4fac5d84e9d4bce8ceb321e9414b4409da61b07b75c1e3d0697"
checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f"
dependencies = [
"anstream",
"anstyle",
@@ -1014,9 +1041,9 @@ dependencies = [
[[package]]
name = "etherparse"
version = "0.17.0"
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b14e4ac78394e3ea04edbbc412099cf54f2f52ded51efb79c466a282729399d2"
checksum = "3ff83a5facf1a7cbfef93cfb48d6d4fb6a1f42d8ac2341a96b3255acb4d4f860"
dependencies = [
"arrayvec",
]
@@ -1034,9 +1061,9 @@ dependencies = [
[[package]]
name = "event-listener-strategy"
version = "0.5.3"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2"
checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"
dependencies = [
"event-listener",
"pin-project-lite",
@@ -1072,9 +1099,9 @@ dependencies = [
[[package]]
name = "flate2"
version = "1.1.0"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc"
checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece"
dependencies = [
"crc32fast",
"miniz_oxide",
@@ -1417,7 +1444,7 @@ dependencies = [
"once_cell",
"pin-project-lite",
"quinn",
"rand 0.9.0",
"rand 0.9.1",
"ring",
"rustls",
"serde",
@@ -1444,7 +1471,7 @@ dependencies = [
"once_cell",
"parking_lot",
"quinn",
"rand 0.9.0",
"rand 0.9.1",
"resolv-conf",
"rustls",
"serde",
@@ -1595,9 +1622,9 @@ dependencies = [
[[package]]
name = "hyper-util"
version = "0.1.10"
version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4"
checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2"
dependencies = [
"bytes",
"futures-channel",
@@ -1605,6 +1632,7 @@ dependencies = [
"http",
"http-body",
"hyper",
"libc",
"pin-project-lite",
"socket2",
"tokio",
@@ -1614,16 +1642,17 @@ dependencies = [
[[package]]
name = "iana-time-zone"
version = "0.1.61"
version = "0.1.63"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
"log",
"wasm-bindgen",
"windows-core 0.52.0",
"windows-core 0.61.0",
]
[[package]]
@@ -1676,9 +1705,9 @@ dependencies = [
[[package]]
name = "icu_locid_transform_data"
version = "1.5.0"
version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d"
[[package]]
name = "icu_normalizer"
@@ -1700,9 +1729,9 @@ dependencies = [
[[package]]
name = "icu_normalizer_data"
version = "1.5.0"
version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7"
[[package]]
name = "icu_properties"
@@ -1721,9 +1750,9 @@ dependencies = [
[[package]]
name = "icu_properties_data"
version = "1.5.0"
version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2"
[[package]]
name = "icu_provider"
@@ -1855,6 +1884,15 @@ dependencies = [
"either",
]
[[package]]
name = "itertools"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
dependencies = [
"either",
]
[[package]]
name = "itoa"
version = "1.0.15"
@@ -1883,9 +1921,9 @@ dependencies = [
[[package]]
name = "jiff"
version = "0.2.4"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d699bc6dfc879fb1bf9bdff0d4c56f0884fc6f0d0eb0fba397a6d00cd9a6b85e"
checksum = "c102670231191d07d37a35af3eb77f1f0dbf7a71be51a962dcd57ea607be7260"
dependencies = [
"jiff-static",
"log",
@@ -1896,9 +1934,9 @@ dependencies = [
[[package]]
name = "jiff-static"
version = "0.2.4"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d16e75759ee0aa64c57a56acbf43916987b20c77373cb7e808979e02b93c9f9"
checksum = "4cdde31a9d349f1b1f51a0b3714a5940ac022976f4b49485fc04be052b183b4c"
dependencies = [
"proc-macro2",
"quote",
@@ -1907,10 +1945,11 @@ dependencies = [
[[package]]
name = "jobserver"
version = "0.1.32"
version = "0.1.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a"
dependencies = [
"getrandom 0.3.2",
"libc",
]
@@ -1969,9 +2008,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]]
name = "libc"
version = "0.2.171"
version = "0.2.172"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
[[package]]
name = "libloading"
@@ -1985,9 +2024,9 @@ dependencies = [
[[package]]
name = "libmimalloc-sys"
version = "0.1.40"
version = "0.1.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07d0e07885d6a754b9c7993f2625187ad694ee985d60f23355ff0e7077261502"
checksum = "ec9d6fac27761dabcd4ee73571cdb06b7022dc99089acbe5435691edffaac0f4"
dependencies = [
"cc",
"libc",
@@ -2010,7 +2049,7 @@ version = "0.17.1+9.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b7869a512ae9982f4d46ba482c2a304f1efd80c6412a3d4bf57bb79a619679f"
dependencies = [
"bindgen",
"bindgen 0.69.5",
"bzip2-sys",
"cc",
"libc",
@@ -2054,9 +2093,9 @@ dependencies = [
[[package]]
name = "log"
version = "0.4.26"
version = "0.4.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e"
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
dependencies = [
"serde",
]
@@ -2157,9 +2196,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "mimalloc"
version = "0.1.44"
version = "0.1.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99585191385958383e13f6b822e6b6d8d9cf928e7d286ceb092da92b43c87bc1"
checksum = "995942f432bbb4822a7e9c3faa87a695185b0d09273ba85f097b54f4e458f2af"
dependencies = [
"libmimalloc-sys",
]
@@ -2325,9 +2364,9 @@ dependencies = [
[[package]]
name = "once_cell"
version = "1.21.1"
version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
dependencies = [
"critical-section",
"portable-atomic",
@@ -2341,9 +2380,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
[[package]]
name = "openssl"
version = "0.10.71"
version = "0.10.72"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd"
checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da"
dependencies = [
"bitflags 2.9.0",
"cfg-if",
@@ -2382,9 +2421,9 @@ dependencies = [
[[package]]
name = "openssl-sys"
version = "0.9.106"
version = "0.9.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd"
checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07"
dependencies = [
"cc",
"libc",
@@ -2472,9 +2511,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
name = "pest"
version = "2.7.15"
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc"
checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6"
dependencies = [
"memchr",
"thiserror 2.0.12",
@@ -2483,9 +2522,9 @@ dependencies = [
[[package]]
name = "pest_derive"
version = "2.7.15"
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e"
checksum = "d725d9cfd79e87dccc9341a2ef39d1b6f6353d68c4b33c177febbe1a402c97c5"
dependencies = [
"pest",
"pest_generator",
@@ -2493,9 +2532,9 @@ dependencies = [
[[package]]
name = "pest_generator"
version = "2.7.15"
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b"
checksum = "db7d01726be8ab66ab32f9df467ae8b1148906685bbe75c82d1e65d7f5b3f841"
dependencies = [
"pest",
"pest_meta",
@@ -2506,9 +2545,9 @@ dependencies = [
[[package]]
name = "pest_meta"
version = "2.7.15"
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea"
checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0"
dependencies = [
"once_cell",
"pest",
@@ -2624,7 +2663,7 @@ version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
dependencies = [
"zerocopy 0.8.23",
"zerocopy 0.8.24",
]
[[package]]
@@ -2702,7 +2741,7 @@ checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc"
dependencies = [
"bytes",
"getrandom 0.3.2",
"rand 0.9.0",
"rand 0.9.1",
"ring",
"rustc-hash 2.1.1",
"rustls",
@@ -2716,9 +2755,9 @@ dependencies = [
[[package]]
name = "quinn-udp"
version = "0.5.10"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944"
checksum = "541d0f57c6ec747a90738a52741d3221f7960e8ac2f0ff4b1a63680e033b4ab5"
dependencies = [
"cfg_aliases",
"libc",
@@ -2762,13 +2801,12 @@ dependencies = [
[[package]]
name = "rand"
version = "0.9.0"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94"
checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97"
dependencies = [
"rand_chacha 0.9.0",
"rand_core 0.9.3",
"zerocopy 0.8.23",
]
[[package]]
@@ -2978,13 +3016,13 @@ dependencies = [
[[package]]
name = "rpassword"
version = "7.3.1"
version = "7.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f"
checksum = "66d4c8b64f049c6721ec8ccec37ddfc3d641c4a7fca57e8f2a89de509c73df39"
dependencies = [
"libc",
"rtoolbox",
"windows-sys 0.48.0",
"windows-sys 0.59.0",
]
[[package]]
@@ -3046,9 +3084,9 @@ dependencies = [
[[package]]
name = "rustix"
version = "1.0.3"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96"
checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf"
dependencies = [
"bitflags 2.9.0",
"errno",
@@ -3104,9 +3142,9 @@ dependencies = [
[[package]]
name = "rustls-webpki"
version = "0.103.0"
version = "0.103.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f"
checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03"
dependencies = [
"ring",
"rustls-pki-types",
@@ -3212,9 +3250,9 @@ checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0"
[[package]]
name = "sendfd"
version = "0.4.3"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "604b71b8fc267e13bb3023a2c901126c8f349393666a6d98ac1ae5729b701798"
checksum = "b183bfd5b1bc64ab0c1ef3ee06b008a9ef1b68a7d3a99ba566fbfe7a7c6d745b"
dependencies = [
"libc",
"tokio",
@@ -3321,7 +3359,7 @@ dependencies = [
[[package]]
name = "shadowsocks"
version = "1.23.0"
version = "1.23.1"
dependencies = [
"aes",
"arc-swap",
@@ -3342,7 +3380,7 @@ dependencies = [
"once_cell",
"percent-encoding",
"pin-project",
"rand 0.9.0",
"rand 0.9.1",
"sendfd",
"serde",
"serde_json",
@@ -3379,7 +3417,7 @@ dependencies = [
"ghash",
"hkdf",
"md-5",
"rand 0.9.0",
"rand 0.9.1",
"ring-compat",
"sha1",
"sm4",
@@ -3388,7 +3426,7 @@ dependencies = [
[[package]]
name = "shadowsocks-rust"
version = "1.23.0"
version = "1.23.2"
dependencies = [
"base64",
"build-time",
@@ -3409,7 +3447,7 @@ dependencies = [
"mimalloc",
"mime",
"qrcode",
"rand 0.9.0",
"rand 0.9.1",
"reqwest",
"rpassword",
"rpmalloc",
@@ -3429,7 +3467,7 @@ dependencies = [
[[package]]
name = "shadowsocks-service"
version = "1.23.0"
version = "1.23.2"
dependencies = [
"arc-swap",
"brotli",
@@ -3459,7 +3497,7 @@ dependencies = [
"nix",
"once_cell",
"pin-project",
"rand 0.9.0",
"rand 0.9.1",
"regex",
"rocksdb",
"rustls-native-certs",
@@ -3551,7 +3589,7 @@ dependencies = [
"bitflags 1.3.2",
"byteorder",
"cfg-if",
"defmt",
"defmt 0.3.100",
"heapless",
"log",
"managed",
@@ -3577,9 +3615,9 @@ dependencies = [
[[package]]
name = "socket2"
version = "0.5.8"
version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef"
dependencies = [
"libc",
"windows-sys 0.52.0",
@@ -3587,9 +3625,9 @@ dependencies = [
[[package]]
name = "spin"
version = "0.9.8"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591"
dependencies = [
"lock_api",
]
@@ -3720,9 +3758,9 @@ checksum = "3b7ad73e635dd232c2c2106d59269f59a61de421cc6b95252d2d932094ff1f40"
[[package]]
name = "tempfile"
version = "3.19.0"
version = "3.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "488960f40a3fd53d72c2a29a58722561dee8afdd175bd88e3db4677d7b2ba600"
checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf"
dependencies = [
"fastrand",
"getrandom 0.3.2",
@@ -3803,9 +3841,9 @@ dependencies = [
[[package]]
name = "time"
version = "0.3.40"
version = "0.3.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d9c75b47bdff86fa3334a3db91356b8d7d86a9b839dab7d0bdc5c3d3a077618"
checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40"
dependencies = [
"deranged",
"itoa",
@@ -3826,9 +3864,9 @@ checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c"
[[package]]
name = "time-macros"
version = "0.2.21"
version = "0.2.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29aa485584182073ed57fd5004aa09c371f021325014694e432313345865fd04"
checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49"
dependencies = [
"num-conv",
"time-core",
@@ -3861,9 +3899,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
version = "1.44.1"
version = "1.44.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a"
checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48"
dependencies = [
"backtrace",
"bytes",
@@ -4047,9 +4085,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
[[package]]
name = "tun"
version = "0.7.13"
version = "0.7.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9298ac5c7f0076908d7a168c634bf4867b4a7d5725eb6356863f8640c6c35ef1"
checksum = "caaf6aa0a713f0e3b20157f6048d113b6256c045e0e2d80734d54cf1c72dc24a"
dependencies = [
"bytes",
"cfg-if",
@@ -4390,13 +4428,26 @@ version = "0.58.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99"
dependencies = [
"windows-implement",
"windows-interface",
"windows-implement 0.58.0",
"windows-interface 0.58.0",
"windows-result 0.2.0",
"windows-strings 0.1.0",
"windows-targets 0.52.6",
]
[[package]]
name = "windows-core"
version = "0.61.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980"
dependencies = [
"windows-implement 0.60.0",
"windows-interface 0.59.1",
"windows-link",
"windows-result 0.3.2",
"windows-strings 0.4.0",
]
[[package]]
name = "windows-implement"
version = "0.58.0"
@@ -4408,6 +4459,17 @@ dependencies = [
"syn 2.0.100",
]
[[package]]
name = "windows-implement"
version = "0.60.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.100",
]
[[package]]
name = "windows-interface"
version = "0.58.0"
@@ -4419,6 +4481,17 @@ dependencies = [
"syn 2.0.100",
]
[[package]]
name = "windows-interface"
version = "0.59.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.100",
]
[[package]]
name = "windows-link"
version = "0.1.1"
@@ -4484,6 +4557,15 @@ dependencies = [
"windows-link",
]
[[package]]
name = "windows-strings"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97"
dependencies = [
"windows-link",
]
[[package]]
name = "windows-sys"
version = "0.48.0"
@@ -4803,11 +4885,11 @@ dependencies = [
[[package]]
name = "zerocopy"
version = "0.8.23"
version = "0.8.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6"
checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879"
dependencies = [
"zerocopy-derive 0.8.23",
"zerocopy-derive 0.8.24",
]
[[package]]
@@ -4823,9 +4905,9 @@ dependencies = [
[[package]]
name = "zerocopy-derive"
version = "0.8.23"
version = "0.8.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154"
checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be"
dependencies = [
"proc-macro2",
"quote",
@@ -4892,19 +4974,20 @@ dependencies = [
[[package]]
name = "zstd-safe"
version = "7.2.3"
version = "7.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722"
checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d"
dependencies = [
"zstd-sys",
]
[[package]]
name = "zstd-sys"
version = "2.0.14+zstd.1.5.7"
version = "2.0.15+zstd.1.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5"
checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237"
dependencies = [
"bindgen 0.71.1",
"cc",
"pkg-config",
]
@@ -1,6 +1,6 @@
[package]
name = "shadowsocks-rust"
version = "1.23.0"
version = "1.23.2"
authors = ["Shadowsocks Contributors"]
description = "shadowsocks is a fast tunnel proxy that helps you bypass firewalls."
repository = "https://github.com/shadowsocks/shadowsocks-rust"
@@ -242,7 +242,7 @@ jemallocator = { version = "0.5", optional = true }
snmalloc-rs = { version = "0.3", optional = true }
rpmalloc = { version = "0.2", optional = true }
shadowsocks-service = { version = "1.23.0", path = "./crates/shadowsocks-service" }
shadowsocks-service = { version = "1.23.2", path = "./crates/shadowsocks-service" }
windows-service = { version = "0.8", optional = true }
@@ -125,6 +125,8 @@ systemctl restart snap.shadowsocks-rust.sslocal-daemon.service
systemctl status snap.shadowsocks-rust.sslocal-daemon.service
```
Default configuration file path probably is `/var/snap/shadowsocks-rust/common/etc/shadowsocks-rust/config.json`.
### **Download release**
Download static-linked build [here](https://github.com/shadowsocks/shadowsocks-rust/releases).
@@ -302,7 +304,7 @@ Create a ShadowSocks' configuration file. Example
Detailed explanation of the configuration file could be found in [shadowsocks' documentation](https://github.com/shadowsocks/shadowsocks/wiki). (Link to original project, not maintained anymore !)
> :warning: For snap installations, configuration file is most probably located in `/var/snap/shadowsocks-rust/common/etc/shadowsocks-rust/config.json` (see https://github.com/shadowsocks/shadowsocks-rust/issues/621 / https://github.com/shadowsocks/shadowsocks-rust/issues/1146)
> :warning: For snap installations, configuration file is most probably located in `/var/snap/shadowsocks-rust/common/etc/shadowsocks-rust/config.json` (see <https://github.com/shadowsocks/shadowsocks-rust/issues/621> / <https://github.com/shadowsocks/shadowsocks-rust/issues/1146>)
In shadowsocks-rust, we also have an extended configuration file format, which is able to define more than one server. You can also disable individual servers.
@@ -1,6 +1,6 @@
[package]
name = "shadowsocks-service"
version = "1.23.0"
version = "1.23.2"
authors = ["Shadowsocks Contributors"]
description = "shadowsocks is a fast tunnel proxy that helps you bypass firewalls."
repository = "https://github.com/shadowsocks/shadowsocks-rust"
@@ -129,7 +129,7 @@ once_cell = "1.17"
thiserror = "2.0"
arc-swap = "1.7"
spin = { version = "0.9" }
spin = { version = "0.10" }
lru_time_cache = "0.11"
bytes = "1.7"
byte_string = "1.0"
@@ -166,9 +166,7 @@ http-body-util = { version = "0.1", optional = true }
http = { version = "1.1", optional = true }
httparse = { version = "1.9", optional = true }
hickory-resolver = { version = "0.25", optional = true, features = [
"serde",
] }
hickory-resolver = { version = "0.25", optional = true, features = ["serde"] }
idna = "1.0"
ipnet = "2.10"
@@ -177,27 +175,29 @@ regex = "1.4"
mime = { version = "0.3", optional = true }
flate2 = { version = "1.0", optional = true }
brotli = { version = "7.0", optional = true }
brotli = { version = "8.0", optional = true }
zstd = { version = "0.13", optional = true }
tun = { version = "0.7", optional = true, features = ["async"] }
etherparse = { version = "0.17", optional = true }
etherparse = { version = "0.18", optional = true }
smoltcp = { version = "0.12", optional = true, default-features = false, features = [
"std",
"log",
"medium-ip",
"proto-ipv4",
"proto-ipv4-fragmentation",
"proto-ipv6",
"socket-icmp",
"socket-udp",
"socket-tcp",
"socket-tcp-cubic",
] }
serde = { version = "1.0", features = ["derive"] }
json5 = "0.4"
bson = { version = "2.13.0", optional = true }
shadowsocks = { version = "1.23.0", path = "../shadowsocks", default-features = false }
shadowsocks = { version = "1.23.1", path = "../shadowsocks", default-features = false }
# Just for the ioctl call macro
[target.'cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd", target_os = "openbsd"))'.dependencies]
@@ -4,6 +4,7 @@
use std::os::unix::io::RawFd;
use std::{
io::{self, ErrorKind},
mem,
net::{IpAddr, SocketAddr},
sync::Arc,
time::Duration,
@@ -41,7 +42,7 @@ cfg_if! {
use crate::local::{context::ServiceContext, loadbalancing::PingBalancer};
use self::{ip_packet::IpPacket, tcp::TcpTun, udp::UdpTun};
use self::{ip_packet::IpPacket, tcp::TcpTun, udp::UdpTun, virt_device::TokenBuffer};
mod ip_packet;
mod tcp;
@@ -191,7 +192,16 @@ impl Tun {
let address_broadcast = address_net.broadcast();
let mut packet_buffer = vec![0u8; 65536].into_boxed_slice();
let create_packet_buffer = || {
const PACKET_BUFFER_SIZE: usize = 65536;
let mut packet_buffer = TokenBuffer::with_capacity(PACKET_BUFFER_SIZE);
unsafe {
packet_buffer.set_len(PACKET_BUFFER_SIZE);
}
packet_buffer
};
let mut packet_buffer = create_packet_buffer();
let mut udp_cleanup_timer = time::interval(self.udp_cleanup_interval);
loop {
@@ -200,10 +210,14 @@ impl Tun {
n = self.device.read(&mut packet_buffer) => {
let n = n?;
let packet = &mut packet_buffer[..n];
trace!("[TUN] received IP packet {:?}", ByteStr::new(packet));
let mut packet_buffer = mem::replace(&mut packet_buffer, create_packet_buffer());
unsafe {
packet_buffer.set_len(n);
}
if let Err(err) = self.handle_tun_frame(&address_broadcast, packet).await {
trace!("[TUN] received IP packet {:?}", ByteStr::new(&packet_buffer));
if let Err(err) = self.handle_tun_frame(&address_broadcast, packet_buffer).await {
error!("[TUN] handle IP frame failed, error: {}", err);
}
}
@@ -254,11 +268,15 @@ impl Tun {
}
}
async fn handle_tun_frame(&mut self, device_broadcast_addr: &IpAddr, frame: &[u8]) -> smoltcp::wire::Result<()> {
let packet = match IpPacket::new_checked(frame)? {
async fn handle_tun_frame(
&mut self,
device_broadcast_addr: &IpAddr,
frame: TokenBuffer,
) -> smoltcp::wire::Result<()> {
let packet = match IpPacket::new_checked(frame.as_ref())? {
Some(packet) => packet,
None => {
warn!("unrecognized IP packet {:?}", ByteStr::new(frame));
warn!("unrecognized IP packet {:?}", ByteStr::new(&frame));
return Ok(());
}
};
@@ -18,8 +18,8 @@ use log::{debug, error, trace};
use shadowsocks::{net::TcpSocketOpts, relay::socks5::Address};
use smoltcp::{
iface::{Config as InterfaceConfig, Interface, PollResult, SocketHandle, SocketSet},
phy::{DeviceCapabilities, Medium},
socket::tcp::{Socket as TcpSocket, SocketBuffer as TcpSocketBuffer, State as TcpState},
phy::{Checksum, DeviceCapabilities, Medium},
socket::tcp::{CongestionControl, Socket as TcpSocket, SocketBuffer as TcpSocketBuffer, State as TcpState},
storage::RingBuffer,
time::{Duration as SmolDuration, Instant as SmolInstant},
wire::{HardwareAddress, IpAddress, IpCidr, Ipv4Address, Ipv6Address, TcpPacket},
@@ -40,11 +40,11 @@ use crate::{
net::utils::to_ipv4_mapped,
};
use super::virt_device::VirtTunDevice;
use super::virt_device::{TokenBuffer, VirtTunDevice};
// NOTE: Default buffer could contain 20 AEAD packets
const DEFAULT_TCP_SEND_BUFFER_SIZE: u32 = 0x3FFF * 20;
const DEFAULT_TCP_RECV_BUFFER_SIZE: u32 = 0x3FFF * 20;
// NOTE: Default buffer could contain 5 AEAD packets
const DEFAULT_TCP_SEND_BUFFER_SIZE: u32 = (0x3FFFu32 * 5).next_power_of_two();
const DEFAULT_TCP_RECV_BUFFER_SIZE: u32 = (0x3FFFu32 * 5).next_power_of_two();
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
enum TcpSocketState {
@@ -243,8 +243,8 @@ pub struct TcpTun {
manager_socket_creation_tx: mpsc::UnboundedSender<TcpSocketCreation>,
manager_running: Arc<AtomicBool>,
balancer: PingBalancer,
iface_rx: mpsc::UnboundedReceiver<Vec<u8>>,
iface_tx: mpsc::UnboundedSender<Vec<u8>>,
iface_rx: mpsc::UnboundedReceiver<TokenBuffer>,
iface_tx: mpsc::UnboundedSender<TokenBuffer>,
iface_tx_avail: Arc<AtomicBool>,
}
@@ -261,6 +261,11 @@ impl TcpTun {
let mut capabilities = DeviceCapabilities::default();
capabilities.medium = Medium::Ip;
capabilities.max_transmission_unit = mtu as usize;
capabilities.checksum.ipv4 = Checksum::Tx;
capabilities.checksum.tcp = Checksum::Tx;
capabilities.checksum.udp = Checksum::Tx;
capabilities.checksum.icmpv4 = Checksum::Tx;
capabilities.checksum.icmpv6 = Checksum::Tx;
let (mut device, iface_rx, iface_tx, iface_tx_avail) = VirtTunDevice::new(capabilities);
@@ -516,6 +521,8 @@ impl TcpTun {
socket.set_timeout(Some(SmolDuration::from_secs(7200)));
// NO ACK delay
// socket.set_ack_delay(None);
// Enable Cubic congestion control
socket.set_congestion_control(CongestionControl::Cubic);
if let Err(err) = socket.listen(dst_addr) {
return Err(io::Error::new(ErrorKind::Other, format!("listen error: {:?}", err)));
@@ -544,8 +551,8 @@ impl TcpTun {
Ok(())
}
pub async fn drive_interface_state(&mut self, frame: &[u8]) {
if self.iface_tx.send(frame.to_vec()).is_err() {
pub async fn drive_interface_state(&mut self, frame: TokenBuffer) {
if self.iface_tx.send(frame).is_err() {
panic!("interface send channel closed unexpectedly");
}
@@ -554,7 +561,7 @@ impl TcpTun {
self.manager_notify.notify();
}
pub async fn recv_packet(&mut self) -> Vec<u8> {
pub async fn recv_packet(&mut self) -> TokenBuffer {
match self.iface_rx.recv().await {
Some(v) => v,
None => unreachable!("channel closed unexpectedly"),
@@ -2,12 +2,16 @@
use std::{
marker::PhantomData,
mem,
ops::{Deref, DerefMut},
sync::{
Arc,
Arc, Mutex,
atomic::{AtomicBool, Ordering},
},
};
use bytes::BytesMut;
use once_cell::sync::Lazy;
use smoltcp::{
phy::{self, Device, DeviceCapabilities},
time::Instant,
@@ -16,8 +20,8 @@ use tokio::sync::mpsc;
pub struct VirtTunDevice {
capabilities: DeviceCapabilities,
in_buf: mpsc::UnboundedReceiver<Vec<u8>>,
out_buf: mpsc::UnboundedSender<Vec<u8>>,
in_buf: mpsc::UnboundedReceiver<TokenBuffer>,
out_buf: mpsc::UnboundedSender<TokenBuffer>,
in_buf_avail: Arc<AtomicBool>,
}
@@ -27,8 +31,8 @@ impl VirtTunDevice {
capabilities: DeviceCapabilities,
) -> (
Self,
mpsc::UnboundedReceiver<Vec<u8>>,
mpsc::UnboundedSender<Vec<u8>>,
mpsc::UnboundedReceiver<TokenBuffer>,
mpsc::UnboundedSender<TokenBuffer>,
Arc<AtomicBool>,
) {
let (iface_tx, iface_output) = mpsc::unbounded_channel();
@@ -81,7 +85,7 @@ impl Device for VirtTunDevice {
}
pub struct VirtRxToken<'a> {
buffer: Vec<u8>,
buffer: TokenBuffer,
phantom_device: PhantomData<&'a VirtTunDevice>,
}
@@ -101,9 +105,65 @@ impl phy::TxToken for VirtTxToken<'_> {
where
F: FnOnce(&mut [u8]) -> R,
{
let mut buffer = vec![0u8; len];
let mut buffer = TokenBuffer::with_capacity(len);
unsafe {
buffer.set_len(len);
}
let result = f(&mut buffer);
self.0.out_buf.send(buffer).expect("channel closed unexpectly");
result
}
}
// Maximun number of TokenBuffer cached globally.
//
// Each of them has capacity 65536 (defined in tun/mod.rs), so 64 * 65536 = 4MB.
const TOKEN_BUFFER_LIST_MAX_SIZE: usize = 64;
static TOKEN_BUFFER_LIST: Lazy<Mutex<Vec<BytesMut>>> = Lazy::new(|| Mutex::new(Vec::new()));
pub struct TokenBuffer {
buffer: BytesMut,
}
impl Drop for TokenBuffer {
fn drop(&mut self) {
let mut list = TOKEN_BUFFER_LIST.lock().unwrap();
if list.len() >= TOKEN_BUFFER_LIST_MAX_SIZE {
return;
}
let empty_buffer = BytesMut::new();
let mut buffer = mem::replace(&mut self.buffer, empty_buffer);
buffer.clear();
list.push(buffer);
}
}
impl TokenBuffer {
pub fn with_capacity(cap: usize) -> TokenBuffer {
let mut list = TOKEN_BUFFER_LIST.lock().unwrap();
if let Some(mut buffer) = list.pop() {
buffer.reserve(cap);
return TokenBuffer { buffer };
}
TokenBuffer {
buffer: BytesMut::with_capacity(cap),
}
}
}
impl Deref for TokenBuffer {
type Target = BytesMut;
fn deref(&self) -> &Self::Target {
&self.buffer
}
}
impl DerefMut for TokenBuffer {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.buffer
}
}
@@ -1,6 +1,6 @@
[package]
name = "shadowsocks"
version = "1.23.0"
version = "1.23.1"
authors = ["Shadowsocks Contributors"]
description = "shadowsocks is a fast tunnel proxy that helps you bypass firewalls."
repository = "https://github.com/shadowsocks/shadowsocks-rust"
@@ -58,7 +58,7 @@ byte_string = "1.0"
base64 = "0.22"
url = "2.5"
once_cell = "1.17"
spin = { version = "0.9", features = ["std"] }
spin = { version = "0.10", features = ["std"] }
pin-project = "1.1"
bloomfilter = { version = "3.0.0", optional = true }
thiserror = "2.0"
@@ -72,7 +72,7 @@ percent-encoding = "2.1"
futures = "0.3"
trait-variant = "0.1"
dynosaur = "0.1.2"
dynosaur = "0.2.0"
socket2 = { version = "0.5", features = ["all"] }
tokio = { version = "1.9.0", features = [
@@ -394,6 +394,10 @@ pub enum ServerConfigError {
/// Key length mismatch
#[error("invalid key length for {0}, expecting {1} bytes, but found {2} bytes")]
InvalidKeyLength(CipherKind, usize, usize),
/// User Key (ipsk) length mismatch
#[error("invalid user key length for {0}, expecting {1} bytes, but found {2} bytes")]
InvalidUserKeyLength(CipherKind, usize, usize),
}
/// Configuration for a server
@@ -538,6 +542,22 @@ where
for ipsk in split_iter {
match USER_KEY_BASE64_ENGINE.decode(ipsk) {
Ok(v) => {
// Double check identity key's length
match method {
CipherKind::AEAD2022_BLAKE3_AES_128_GCM => {
// AES-128
if v.len() != 16 {
return Err(ServerConfigError::InvalidUserKeyLength(method, 16, v.len()));
}
}
CipherKind::AEAD2022_BLAKE3_AES_256_GCM => {
// AES-256
if v.len() != 32 {
return Err(ServerConfigError::InvalidUserKeyLength(method, 32, v.len()));
}
}
_ => unreachable!("{} doesn't support EIH", method),
}
identity_keys.push(Bytes::from(v));
}
Err(err) => {
@@ -28,10 +28,21 @@ fn set_common_sockopt_for_connect(addr: SocketAddr, socket: &TcpSocket, opts: &C
(SocketAddr::V4(..), SocketAddr::V4(..)) => {
socket.bind(baddr)?;
}
(SocketAddr::V4(v4baddr), SocketAddr::V6(..)) => {
socket.bind(SocketAddr::new(v4baddr.ip().to_ipv6_mapped().into(), v4baddr.port()))?;
}
(SocketAddr::V6(..), SocketAddr::V6(..)) => {
socket.bind(baddr)?;
}
_ => {}
(SocketAddr::V6(v6baddr), SocketAddr::V4(..)) => match v6baddr.ip().to_ipv4_mapped() {
Some(v4baddr) => socket.bind(SocketAddr::new(v4baddr.into(), v6baddr.port()))?,
None => {
return Err(io::Error::new(
ErrorKind::InvalidInput,
"bind_local_addr is not a valid IPv4-mapped IPv6 address",
));
}
},
}
}
@@ -1,5 +1,6 @@
use std::{
io, mem,
io::{self, ErrorKind},
mem,
net::{Ipv4Addr, Ipv6Addr, SocketAddr},
os::unix::io::{AsRawFd, RawFd},
pin::Pin,
@@ -228,7 +229,18 @@ pub fn set_disable_ip_fragmentation<S: AsRawFd>(af: AddrFamily, socket: &S) -> i
pub async fn create_outbound_udp_socket(af: AddrFamily, config: &ConnectOpts) -> io::Result<UdpSocket> {
let bind_addr = match (af, config.bind_local_addr) {
(AddrFamily::Ipv4, Some(SocketAddr::V4(addr))) => addr.into(),
(AddrFamily::Ipv4, Some(SocketAddr::V6(addr))) => {
// Map IPv6 bind_local_addr to IPv4 if AF is IPv4
match addr.ip().to_ipv4_mapped() {
Some(addr) => SocketAddr::new(addr.into(), 0),
None => return Err(io::Error::new(ErrorKind::InvalidInput, "Invalid IPv6 address")),
}
}
(AddrFamily::Ipv6, Some(SocketAddr::V6(addr))) => addr.into(),
(AddrFamily::Ipv6, Some(SocketAddr::V4(addr))) => {
// Map IPv4 bind_local_addr to IPv6 if AF is IPv6
SocketAddr::new(addr.ip().to_ipv6_mapped().into(), 0)
}
(AddrFamily::Ipv4, ..) => SocketAddr::new(Ipv4Addr::UNSPECIFIED.into(), 0),
(AddrFamily::Ipv6, ..) => SocketAddr::new(Ipv6Addr::UNSPECIFIED.into(), 0),
};
@@ -356,7 +356,18 @@ pub fn set_disable_ip_fragmentation<S: AsRawFd>(af: AddrFamily, socket: &S) -> i
pub async fn create_outbound_udp_socket(af: AddrFamily, config: &ConnectOpts) -> io::Result<UdpSocket> {
let bind_addr = match (af, config.bind_local_addr) {
(AddrFamily::Ipv4, Some(SocketAddr::V4(addr))) => addr.into(),
(AddrFamily::Ipv4, Some(SocketAddr::V6(addr))) => {
// Map IPv6 bind_local_addr to IPv4 if AF is IPv4
match addr.ip().to_ipv4_mapped() {
Some(addr) => SocketAddr::new(addr.into(), 0),
None => return Err(io::Error::new(ErrorKind::InvalidInput, "Invalid IPv6 address")),
}
}
(AddrFamily::Ipv6, Some(SocketAddr::V6(addr))) => addr.into(),
(AddrFamily::Ipv6, Some(SocketAddr::V4(addr))) => {
// Map IPv4 bind_local_addr to IPv6 if AF is IPv6
SocketAddr::new(addr.ip().to_ipv6_mapped().into(), 0)
}
(AddrFamily::Ipv4, ..) => SocketAddr::new(Ipv4Addr::UNSPECIFIED.into(), 0),
(AddrFamily::Ipv6, ..) => SocketAddr::new(Ipv6Addr::UNSPECIFIED.into(), 0),
};
@@ -1,5 +1,6 @@
use std::{
io, mem,
io::{self, ErrorKind},
mem,
net::{Ipv4Addr, Ipv6Addr, SocketAddr},
os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd},
pin::Pin,
@@ -55,7 +56,7 @@ impl TcpStream {
// This is a workaround for VPNService
#[cfg(target_os = "android")]
if !addr.ip().is_loopback() {
use std::{io::ErrorKind, time::Duration};
use std::time::Duration;
use tokio::time;
if let Some(ref path) = opts.vpn_protect_path {
@@ -287,7 +288,18 @@ pub fn set_disable_ip_fragmentation<S: AsRawFd>(af: AddrFamily, socket: &S) -> i
pub async fn create_outbound_udp_socket(af: AddrFamily, config: &ConnectOpts) -> io::Result<UdpSocket> {
let bind_addr = match (af, config.bind_local_addr) {
(AddrFamily::Ipv4, Some(SocketAddr::V4(addr))) => addr.into(),
(AddrFamily::Ipv4, Some(SocketAddr::V6(addr))) => {
// Map IPv6 bind_local_addr to IPv4 if AF is IPv4
match addr.ip().to_ipv4_mapped() {
Some(addr) => SocketAddr::new(addr.into(), 0),
None => return Err(io::Error::new(ErrorKind::InvalidInput, "Invalid IPv6 address")),
}
}
(AddrFamily::Ipv6, Some(SocketAddr::V6(addr))) => addr.into(),
(AddrFamily::Ipv6, Some(SocketAddr::V4(addr))) => {
// Map IPv4 bind_local_addr to IPv6 if AF is IPv6
SocketAddr::new(addr.ip().to_ipv6_mapped().into(), 0)
}
(AddrFamily::Ipv4, ..) => SocketAddr::new(Ipv4Addr::UNSPECIFIED.into(), 0),
(AddrFamily::Ipv6, ..) => SocketAddr::new(Ipv6Addr::UNSPECIFIED.into(), 0),
};
@@ -320,7 +332,7 @@ pub async fn bind_outbound_udp_socket(bind_addr: &SocketAddr, config: &ConnectOp
// This is a workaround for VPNService
#[cfg(target_os = "android")]
{
use std::{io::ErrorKind, time::Duration};
use std::time::Duration;
use tokio::time;
if let Some(ref path) = config.vpn_protect_path {
@@ -385,10 +397,7 @@ fn set_bindtodevice<S: AsRawFd>(socket: &S, iface: &str) -> io::Result<()> {
cfg_if! {
if #[cfg(target_os = "android")] {
use std::{
io::ErrorKind,
path::Path,
};
use std::path::Path;
use tokio::io::AsyncReadExt;
use super::uds::UnixStream;
@@ -1,6 +1,6 @@
use std::{
io,
net::{Ipv4Addr, Ipv6Addr, SocketAddr},
io::{self, ErrorKind},
net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr},
ops::{Deref, DerefMut},
os::fd::AsRawFd,
pin::Pin,
@@ -15,7 +15,7 @@ use tokio::{
use crate::net::{
AcceptOpts, AddrFamily, ConnectOpts,
sys::{ErrorKind, set_common_sockopt_after_connect, set_common_sockopt_for_connect},
sys::{set_common_sockopt_after_connect, set_common_sockopt_for_connect},
};
/// A wrapper of `TcpStream`
@@ -82,7 +82,19 @@ pub fn set_disable_ip_fragmentation<S: AsRawFd>(_af: AddrFamily, _socket: &S) ->
pub async fn create_outbound_udp_socket(af: AddrFamily, config: &ConnectOpts) -> io::Result<UdpSocket> {
let bind_addr = match (af, config.bind_local_addr) {
(AddrFamily::Ipv4, Some(SocketAddr::V4(addr))) => addr.into(),
(AddrFamily::Ipv4, Some(SocketAddr::V6(addr))) => {
// Map IPv6 bind_local_addr to IPv4 if AF is IPv4
match addr.ip().to_ipv4_mapped() {
Some(addr) => SocketAddr::new(IpAddr::from(addr), 0),
None => return Err(io::Error::new(ErrorKind::InvalidInput, "Invalid IPv6 address")),
}
}
(AddrFamily::Ipv6, Some(SocketAddr::V6(addr))) => addr.into(),
(AddrFamily::Ipv6, Some(SocketAddr::V4(addr))) => {
// Map IPv4 bind_local_addr to IPv6 if AF is IPv6
let ip_addr: IpAddr = addr.ip().to_ipv6_mapped().into();
SocketAddr::new(ip_addr, 0)
}
(AddrFamily::Ipv4, ..) => SocketAddr::new(Ipv4Addr::UNSPECIFIED.into(), 0),
(AddrFamily::Ipv6, ..) => SocketAddr::new(Ipv6Addr::UNSPECIFIED.into(), 0),
};
@@ -468,7 +468,18 @@ pub async fn create_inbound_udp_socket(addr: &SocketAddr, ipv6_only: bool) -> io
pub async fn create_outbound_udp_socket(af: AddrFamily, opts: &ConnectOpts) -> io::Result<UdpSocket> {
let bind_addr = match (af, opts.bind_local_addr) {
(AddrFamily::Ipv4, Some(SocketAddr::V4(addr))) => addr.into(),
(AddrFamily::Ipv4, Some(SocketAddr::V6(addr))) => {
// Map IPv6 bind_local_addr to IPv4 if AF is IPv4
match addr.ip().to_ipv4_mapped() {
Some(addr) => SocketAddr::new(addr.into(), 0),
None => return Err(io::Error::new(ErrorKind::InvalidInput, "Invalid IPv6 address")),
}
}
(AddrFamily::Ipv6, Some(SocketAddr::V6(addr))) => addr.into(),
(AddrFamily::Ipv6, Some(SocketAddr::V4(addr))) => {
// Map IPv4 bind_local_addr to IPv6 if AF is IPv6
SocketAddr::new(addr.ip().to_ipv6_mapped().into(), 0)
}
(AddrFamily::Ipv4, ..) => SocketAddr::new(Ipv4Addr::UNSPECIFIED.into(), 0),
(AddrFamily::Ipv6, ..) => SocketAddr::new(Ipv6Addr::UNSPECIFIED.into(), 0),
};
@@ -478,7 +478,7 @@ fn write_domain_name_address<B: BufMut>(dnaddr: &str, port: u16, buf: &mut B) {
"domain name length must be smaller than 256"
);
buf.put_u8(dnaddr.len() as u8);
buf.put_slice(dnaddr[..].as_bytes());
buf.put_slice(dnaddr.as_bytes());
buf.put_u16(port);
}
@@ -837,7 +837,7 @@ impl UdpAssociateHeader {
}
}
/// Username/Password Authentication Inittial Negociation
/// Username/Password Authentication Initial Negotiation
///
/// https://datatracker.ietf.org/doc/html/rfc1929
///
@@ -880,7 +880,7 @@ impl PasswdAuthRequest {
let mut ver_buf = [0u8; 1];
let _ = r.read_exact(&mut ver_buf).await?;
// The only valid subnegociation version
// The only valid subnegotiation version
if ver_buf[0] != 0x01 {
return Err(Error::UnsupportedPasswdAuthVersion(ver_buf[0]));
}
@@ -1,3 +1,22 @@
shadowsocks-rust (1.23.2) unstable; urgency=medium
## Bug Fixes
- #1940 `local-tun`: Fixes `panic` when resizing cached buffers
shadowsocks-rust (1.23.1) unstable; urgency=medium
## Features
- #1922 `local-tun`: Enable congestion control algorithm for TCP connections
- #1923 `local-tun`: Disable TCP package receive checksum for improving performance
- `local-tun`: Buffer for receiving/sending packets from/to `tun` device are cached globally
## Bug Fixes
- #1929 `outbound_bind_addr` for UDP sockets failed to `bind()` if it is an IPv4 address
- Double check IPSK key length (AEAD-2022) when reading from configuration file
shadowsocks-rust (1.23.0) unstable; urgency=medium
## Features, Breaking Changes
@@ -0,0 +1,54 @@
[versions]
camera = "1.4.2"
coroutines = "1.10.2"
lifecycle = "2.9.0"
room = "2.7.1"
work = "2.10.1"
[libraries]
android-gradle = "com.android.tools.build:gradle:8.10.0"
androidx-browser = "androidx.browser:browser:1.8.0"
androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "camera" }
androidx-camera-lifecycle = { module = "androidx.camera:camera-lifecycle", version.ref = "camera" }
androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "camera" }
androidx-concurrent-futures-ktx = "androidx.concurrent:concurrent-futures-ktx:1.2.0"
androidx-constraintlayout = "androidx.constraintlayout:constraintlayout:2.2.1"
androidx-core-ktx = "androidx.core:core-ktx:1.16.0"
androidx-espresso-core = "androidx.test.espresso:espresso-core:3.6.1"
androidx-junit-ktx = "androidx.test.ext:junit-ktx:1.2.1"
androidx-leanback-preference = "androidx.leanback:leanback-preference:1.2.0"
androidx-lifecycle-livedata-core-ktx = { module = "androidx.lifecycle:lifecycle-livedata-core-ktx", version.ref = "lifecycle" }
androidx-lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle" }
androidx-preference = "androidx.preference:preference:1.2.1"
androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" }
androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" }
androidx-room-testing = { module = "androidx.room:room-testing", version.ref = "room" }
androidx-test-runner = "androidx.test:runner:1.6.2"
androidx-work-multiprocess = { module = "androidx.work:work-multiprocess", version.ref = "work" }
androidx-work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "work" }
barcode-scanning = "com.google.mlkit:barcode-scanning:17.3.0"
desugar = "com.android.tools:desugar_jdk_libs:2.1.5"
dnsjava = "dnsjava:dnsjava:3.6.3"
dokka = "org.jetbrains.dokka:dokka-gradle-plugin:2.0.0"
fastscroll = "me.zhanghai.android.fastscroll:library:1.3.0"
firebase-analytics = "com.google.firebase:firebase-analytics:22.4.0"
firebase-crashlytics = "com.google.firebase:firebase-crashlytics:19.4.3"
firebase-crashlytics-gradle = "com.google.firebase:firebase-crashlytics-gradle:3.0.3"
google-oss-licenses = "com.google.android.gms:oss-licenses-plugin:0.10.6"
google-services = "com.google.gms:google-services:4.4.2"
gradle-maven-publish = "com.vanniktech:gradle-maven-publish-plugin:0.31.0"
junit = "junit:junit:4.13.2"
kotlin-gradle = "org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.20"
kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
kotlinx-coroutines-play-services = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-play-services", version.ref = "coroutines" }
locale-api = "com.twofortyfouram:android-plugin-api-for-locale:1.0.4"
material = "com.google.android.material:material:1.12.0"
play-services-oss-licenses = "com.google.android.gms:play-services-oss-licenses:17.1.0"
preferencex-simplemenu = "com.takisoft.preferencex:preferencex-simplemenu:1.1.0"
rust-android = "org.mozilla.rust-android-gradle:plugin:0.9.6"
timber = "com.jakewharton.timber:timber:5.0.1"
zxing = "com.google.zxing:core:3.5.3"
[plugins]
ksp = "com.google.devtools.ksp:2.1.20-2.0.1"
versions = "com.github.ben-manes.versions:0.52.0"
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
+16 -14
View File
@@ -15,18 +15,20 @@ android {
}
dependencies {
val cameraxVersion = "1.4.2"
implementation("androidx.browser:browser:1.8.0")
implementation("androidx.camera:camera-camera2:$cameraxVersion")
implementation("androidx.camera:camera-lifecycle:$cameraxVersion")
implementation("androidx.camera:camera-view:$cameraxVersion")
implementation("androidx.concurrent:concurrent-futures-ktx:1.2.0")
implementation("androidx.constraintlayout:constraintlayout:2.2.1")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycleVersion")
implementation("com.google.mlkit:barcode-scanning:17.3.0")
implementation("com.google.zxing:core:3.5.3")
implementation("com.takisoft.preferencex:preferencex-simplemenu:1.1.0")
implementation("com.twofortyfouram:android-plugin-api-for-locale:1.0.4")
implementation("me.zhanghai.android.fastscroll:library:1.3.0")
coreLibraryDesugaring(libs.desugar)
implementation(libs.androidx.browser)
implementation(libs.androidx.camera.camera2)
implementation(libs.androidx.camera.lifecycle)
implementation(libs.androidx.camera.view)
implementation(libs.androidx.concurrent.futures.ktx)
implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.barcode.scanning)
implementation(libs.fastscroll)
implementation(libs.locale.api)
implementation(libs.preferencex.simplemenu)
implementation(libs.zxing)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(libs.androidx.test.runner)
}
+4 -1
View File
@@ -13,8 +13,11 @@ android {
}
dependencies {
api(kotlin("stdlib-jdk8"))
coreLibraryDesugaring(libs.desugar)
api("androidx.core:core-ktx:1.7.0")
api("androidx.fragment:fragment-ktx:1.5.5")
api("com.google.android.material:material:1.6.0")
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.test.runner)
androidTestImplementation(libs.androidx.espresso.core)
}
@@ -1,8 +1,3 @@
rootProject.extra.apply {
set("androidPlugin", "com.android.tools.build:gradle:8.9.1")
set("kotlinVersion", "2.1.20")
}
repositories {
google()
mavenCentral()
+5 -1
View File
@@ -27,5 +27,9 @@ android {
}
dependencies {
implementation("androidx.leanback:leanback-preference:1.1.0-rc01")
coreLibraryDesugaring(libs.desugar)
implementation(libs.androidx.leanback.preference)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(libs.androidx.test.runner)
}