1 Commits

Author SHA1 Message Date
Zeus d0bfd6469b Revert "修复若干小问题" 2025-03-25 20:01:07 +08:00
14 changed files with 284 additions and 312 deletions
-1
View File
@@ -139,4 +139,3 @@ app.*.symbols
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
!/dev/ci/**/Gemfile.lock !/dev/ci/**/Gemfile.lock
!.vscode/settings.json !.vscode/settings.json
/Android-kotlin-Code/core/.cxx
-11
View File
@@ -8,8 +8,6 @@
- Android 7.0+ (recommend) - Android 7.0+ (recommend)
- `armeabi-v7a` , `arm64-v8a`, `x86` or `x86_64` Architecture - `armeabi-v7a` , `arm64-v8a`, `x86` or `x86_64` Architecture
### Build ### Build
1. Update submodules 1. Update submodules
@@ -69,15 +67,6 @@ Please read 服务器配置+Kotlin-Android 文档教程.docx
} }
``` ```
![alt text](telegram-cloud-photo-size-5-6327623898581027724-y.jpg)
```
测试的 URL 配置地址: https://vungles.com/api/test/config
测试账号:
binance3980@gmail.com
Tinkl123
```
上面字段的意思: 上面字段的意思:
以下是您提供的 JSON 配置文件的字段解释: 以下是您提供的 JSON 配置文件的字段解释:
+1 -4
View File
@@ -45,10 +45,7 @@ android {
externalNativeBuild { externalNativeBuild {
cmake { cmake {
// 设置cmake版本
// version = "3.31.6" //macos下不需要指定 cmake 的版本信息
path = file("src/main/cpp/CMakeLists.txt") path = file("src/main/cpp/CMakeLists.txt")
} }
} }
} }
@@ -65,4 +62,4 @@ afterEvaluate {
tasks.withType(GolangBuildTask::class.java).forEach { tasks.withType(GolangBuildTask::class.java).forEach {
it.inputs.dir(golangSource) it.inputs.dir(golangSource)
} }
} }
@@ -1,57 +1,47 @@
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.0)
# 获取git hash # 获取git hash
message(STATUS "CMAKE_CURRENT_SOURCE_DIR= ${CMAKE_CURRENT_SOURCE_DIR}") message(STATUS "CMAKE_CURRENT_SOURCE_DIR= ${CMAKE_CURRENT_SOURCE_DIR}")
execute_process( execute_process(
COMMAND git submodule foreach git log -1 --format=%H COMMAND git submodule foreach git log -1 --format=%H
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE COMMIT_HASH OUTPUT_VARIABLE COMMIT_HASH
) )
string(REPLACE "\n" ";" COMMIT_HASH "${COMMIT_HASH}")
list(GET COMMIT_HASH 1 COMMIT_HASH)
string (REGEX REPLACE "[\n\t\r]" "" COMMIT_HASH ${COMMIT_HASH})
string(SUBSTRING ${COMMIT_HASH} 0 7 COMMIT_HASH)
message(STATUS "git hash= ${COMMIT_HASH}")
# 判断是否获取到了git hash值(规避如因项目目录非git repository等原因产生的获取异常而中断build) # 获取分支名称
string(LENGTH ${COMMIT_HASH} OUTPUT_VARIABLE COMMIT_HASH_LENGTH) execute_process(
string(COMPARE LESS ${COMMIT_HASH_LENGTH} "40" OUTPUT_VARIABLE GIT_HASH_COMPARISON_RESULT) COMMAND git submodule foreach git branch -r --contains ${COMMIT_HASH}
if(NOT ${GIT_HASH_COMPARISON_RESULT}) WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
string(REPLACE "\n" ";" COMMIT_HASH "${COMMIT_HASH}") OUTPUT_VARIABLE CURRENT_BRANCH
list(GET COMMIT_HASH 1 COMMIT_HASH) )
string (REGEX REPLACE "[\n\t\r]" "" COMMIT_HASH ${COMMIT_HASH}) string(REPLACE "\n" ";" CURRENT_BRANCH "${CURRENT_BRANCH}")
#string(SUBSTRING ${COMMIT_HASH} 0 7 COMMIT_HASH) list(GET CURRENT_BRANCH 1 CURRENT_BRANCH)
message(STATUS "git hash= ${COMMIT_HASH}") string (REGEX REPLACE "origin/" "" CURRENT_BRANCH ${CURRENT_BRANCH} "")
string (REGEX REPLACE "[\n\t\r]" "" CURRENT_BRANCH ${CURRENT_BRANCH} "")
#string(SUBSTRING ${CURRENT_BRANCH} 0 8 CURRENT_BRANCH)
message(STATUS "git current branch = ${CURRENT_BRANCH}")
# 获取git分支名称 # 获取生成时间
execute_process( string(TIMESTAMP COMPILE_TIME "%y%m%d")
COMMAND git submodule foreach git branch -r --contains ${COMMIT_HASH} string (REGEX REPLACE "[\n\t\r]" "" COMPILE_TIME ${COMPILE_TIME})
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} string(REGEX REPLACE "\"" "" COMPILE_TIME ${COMPILE_TIME})
OUTPUT_VARIABLE CURRENT_BRANCH
)
string(REPLACE "\n" ";" CURRENT_BRANCH "${CURRENT_BRANCH}") # 生成版本信息
list(GET CURRENT_BRANCH 1 CURRENT_BRANCH) set(GIT_VERSION "${CURRENT_BRANCH}_${COMMIT_HASH}_${COMPILE_TIME}")
string (REGEX REPLACE "origin/" "" CURRENT_BRANCH ${CURRENT_BRANCH} "") message(STATUS "version info = ${GIT_VERSION}")
string (REGEX REPLACE "[\n\t\r]" "" CURRENT_BRANCH ${CURRENT_BRANCH} "")
string(SUBSTRING ${CURRENT_BRANCH} 0 8 CURRENT_BRANCH)
message(STATUS "git current branch = ${CURRENT_BRANCH}")
# 获取生成时间 # 去除空格
string(TIMESTAMP COMPILE_TIME "%y%m%d") string(REGEX REPLACE "[ ]+" "" GIT_VERSION "${GIT_VERSION}")
string (REGEX REPLACE "[\n\t\r]" "" COMPILE_TIME ${COMPILE_TIME})
string(REGEX REPLACE "\"" "" COMPILE_TIME ${COMPILE_TIME})
# 生成版本信息
set(GIT_VERSION "${CURRENT_BRANCH}_${COMMIT_HASH}_${COMPILE_TIME}")
message(STATUS "version info = ${GIT_VERSION}")
# 去除空格
string(REGEX REPLACE "[ ]+" "" GIT_VERSION "${GIT_VERSION}")
else()
message(AUTHOR_WARNING "Unable to get git hash, but build will continue.")
endif()
# 保存变量到文件 # 保存变量到文件
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/version.h @ONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/version.h @ONLY)
#设置项目名称与语言类别(必)
project(clash-bridge C) project(clash-bridge C)
@@ -5,7 +5,7 @@
* 当前编译core版本号 * 当前编译core版本号
*/ */
#define GIT_VERSION #define GIT_VERSION _920e728_241219
#define make_Str(x) #x #define make_Str(x) #x
#define make_String(x) make_Str(x) #define make_String(x) make_Str(x)
+1 -1
View File
@@ -32,6 +32,6 @@ dependencies {
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
implementation("com.github.bumptech.glide:glide:4.16.0") implementation("com.github.bumptech.glide:glide:4.16.0")
kapt("com.github.bumptech.glide:compiler:4.15.1") annotationProcessor("com.github.bumptech.glide:compiler:4.15.1")
} }
@@ -5,7 +5,7 @@ import android.content.res.Configuration
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
// import android.view.WindowManager import android.view.WindowManager
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
@@ -20,16 +20,16 @@ import com.github.kr328.clash.design.adapter.PlanDataAdapter
import com.github.kr328.clash.design.adapter.TicketDetailAdapter import com.github.kr328.clash.design.adapter.TicketDetailAdapter
import com.github.kr328.clash.design.adapter.TicketsDataAdapter import com.github.kr328.clash.design.adapter.TicketsDataAdapter
import com.github.kr328.clash.design.databinding.ActivityBaseListBinding import com.github.kr328.clash.design.databinding.ActivityBaseListBinding
// import com.github.kr328.clash.design.databinding.DesignSettingsCommonBinding import com.github.kr328.clash.design.databinding.DesignSettingsCommonBinding
import com.github.kr328.clash.design.ui.DayNight import com.github.kr328.clash.design.ui.DayNight
import com.github.kr328.clash.design.ui.Surface import com.github.kr328.clash.design.ui.Surface
import com.github.kr328.clash.design.util.applyFrom import com.github.kr328.clash.design.util.applyFrom
// import com.github.kr328.clash.design.util.layoutInflater import com.github.kr328.clash.design.util.layoutInflater
import com.github.kr328.clash.design.util.resolveThemedBoolean import com.github.kr328.clash.design.util.resolveThemedBoolean
import com.github.kr328.clash.design.util.resolveThemedColor import com.github.kr328.clash.design.util.resolveThemedColor
import com.github.kr328.clash.design.util.root import com.github.kr328.clash.design.util.root
import com.github.kr328.clash.design.util.setOnInsertsChangedListener import com.github.kr328.clash.design.util.setOnInsertsChangedListener
// import com.github.kr328.clash.design.view.ActivityBarLayout import com.github.kr328.clash.design.view.ActivityBarLayout
import com.github.kr328.clash.network.OrderData import com.github.kr328.clash.network.OrderData
import com.github.kr328.clash.network.PlanData import com.github.kr328.clash.network.PlanData
import com.github.kr328.clash.network.TicketMessage import com.github.kr328.clash.network.TicketMessage
@@ -190,61 +190,65 @@ abstract class BaseListActivity<T> : AppCompatActivity() {
this.dayNight = DayNight.Night //dayNight this.dayNight = DayNight.Night //dayNight
} }
/**
* 初始化列表数据。
* 如果数据为空,显示提示信息;否则,在UI线程上更新适配器数据。
*
* @param data 要显示的数据列表,可能为null
*/
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
private fun initList(data: List<T>?) { private fun initList(data: List<T>?) {
if (data.isNullOrEmpty()) { if (data.isNullOrEmpty()) {
showEmptyDataToast() runOnUiThread {
Toast.makeText(this, "没有更多数据", Toast.LENGTH_SHORT).show()
}
} else { } else {
updateAdapterDataOnUiThread(data) // 更新列表
runOnUiThread {
// 更新适配器的数据
when (adapter) {
is PlanDataAdapter -> {
// 使用 PlanDataAdapter 类型进行操作
val planDataAdapter = adapter as PlanDataAdapter
// 执行 PlanDataAdapter 的操作
planDataAdapter.setData(data as List<PlanData>)
}
is OrdersDataAdapter -> {
// 使用 PlanDataAdapter 类型进行操作
val ordersDataAdapter = adapter as OrdersDataAdapter
// 执行 PlanDataAdapter 的操作
ordersDataAdapter.setData(data as List<OrderData>)
}
is TicketsDataAdapter->{
val ordersDataAdapter = adapter as TicketsDataAdapter
ordersDataAdapter.setData(data as List<TicketsData>)
}
is TicketDetailAdapter ->{
val ordersDataAdapter = adapter as TicketDetailAdapter
ordersDataAdapter.setData(data as List<TicketMessage>)
}
else -> {
// 处理不匹配的适配器类型
println( "Unknown adapter type.")
}
}
val subscriptionAdapter = adapter as? PlanDataAdapter
if ( subscriptionAdapter != null ){
subscriptionAdapter.setData(data as List<PlanData>) // 假设你实现了一个 setData 方法来更新适配器的数据
}
adapter.notifyDataSetChanged()
}
} }
} }
/**
* 在UI线程上显示"没有更多数据"的Toast提示。
*/
private fun showEmptyDataToast() {
runOnUiThread {
Toast.makeText(this, "没有更多数据", Toast.LENGTH_SHORT).show()
}
}
/**
* 在UI线程上更新适配器数据。
* 这个方法作为一个中间层,避免在runOnUiThread的lambda中直接捕获外部变量。
*
* @param data 要更新到适配器的数据列表
*/
private fun updateAdapterDataOnUiThread(data: List<T>) {
runOnUiThread {
doUpdateAdapterData(data)
}
}
/**
* 执行实际的适配器数据更新操作。
* 根据适配器类型,将数据设置到相应的适配器中,并通知数据集变化。
*
* @param data 要更新到适配器的数据列表
*/
@SuppressLint("NotifyDataSetChanged")
@Suppress("UNCHECKED_CAST")
private fun doUpdateAdapterData(data: List<T>) {
when (adapter) {
is PlanDataAdapter -> (adapter as PlanDataAdapter).setData(data as List<PlanData>)
is OrdersDataAdapter -> (adapter as OrdersDataAdapter).setData(data as List<OrderData>)
is TicketsDataAdapter -> (adapter as TicketsDataAdapter).setData(data as List<TicketsData>)
is TicketDetailAdapter -> (adapter as TicketDetailAdapter).setData(data as List<TicketMessage>)
else -> println("Unknown adapter type.")
}
adapter.notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
private fun updateList(data: List<T>?) { private fun updateList(data: List<T>?) {
@@ -34,7 +34,7 @@ object ApiClient {
} }
object ApiClientConfig { object ApiClientConfig {
private const val ConfigURL = "https://vungles.com/api/test/" // BASE 请求配置文件地址 见说明文档 private const val ConfigURL = "https://api.xxxx.com/api/" // BASE 请求配置文件地址 见说明文档
//const val ConfigNodeURL = "https://api.xxxx.com/api/parseyamlclash.php?target=clashmeta&url=" //通过香港服务器转接一次Clash转化的订阅地址 //const val ConfigNodeURL = "https://api.xxxx.com/api/parseyamlclash.php?target=clashmeta&url=" //通过香港服务器转接一次Clash转化的订阅地址
const val ConfigNodeURL = "" const val ConfigNodeURL = ""
@@ -194,8 +194,8 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="0dp" android:layout_marginTop="16dp"
android:layout_marginHorizontal="0dp"/> android:layout_marginHorizontal="16dp"/>
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<!-- TabLayout作为页指示器 --> <!-- TabLayout作为页指示器 -->
<com.google.android.material.tabs.TabLayout <com.google.android.material.tabs.TabLayout
+1 -2
View File
@@ -6,8 +6,7 @@
# http://www.gradle.org/docs/current/userguide/build_environment.html # http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process. # Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings. # The setting is particularly useful for tweaking memory settings.
#org.gradle.jvmargs=-Xmx4g -XX:+UseZGC -Dfile.encoding=UTF-8 org.gradle.jvmargs=-Xmx4g -XX:+UseZGC -Dfile.encoding=UTF-8
org.gradle.jvmargs=-Xmx4g -XX:+UseG1GC
# When configured, Gradle will run in incubating parallel mode. # When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit # This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+2 -4
View File
@@ -4,7 +4,5 @@
# Location of the SDK. This is only used by Gradle. # Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the # For customization when using a Version Control System, please read the
# header note. # header note.
#Fri Jul 18 13:36:50 CST 2025 #Wed Dec 11 11:56:02 CST 2024
#cmake.dir=/Volumes/WD/androidstudio/sdk/cmake/3.22.1 sdk.dir=/Volumes/TOSHIBA/androidstudio/sdk
# C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk\\cmake\\3.31.6
sdk.dir=/Volumes/WD/androidstudio/sdk
+2 -2
View File
@@ -51,7 +51,7 @@ dependencyResolutionManagement {
library("androidx-activity", "androidx.activity:activity:$activity") library("androidx-activity", "androidx.activity:activity:$activity")
library("androidx-fragment", "androidx.fragment:fragment:$fragment") library("androidx-fragment", "androidx.fragment:fragment:$fragment")
library("androidx-appcompat", "androidx.appcompat:appcompat:$appcompat") library("androidx-appcompat", "androidx.appcompat:appcompat:$appcompat")
library("androidx-appcompat-resources", "androidx.appcompat:appcompat-resources:$appcompatres") library("androidx-appcompat", "androidx.appcompat:appcompat-resources:$appcompatres")
library("androidx-coordinator", "androidx.coordinatorlayout:coordinatorlayout:$coordinator") library("androidx-coordinator", "androidx.coordinatorlayout:coordinatorlayout:$coordinator")
library("androidx-recyclerview", "androidx.recyclerview:recyclerview:$recyclerview") library("androidx-recyclerview", "androidx.recyclerview:recyclerview:$recyclerview")
library("androidx-viewpager", "androidx.viewpager2:viewpager2:$viewpager") library("androidx-viewpager", "androidx.viewpager2:viewpager2:$viewpager")
@@ -64,4 +64,4 @@ dependencyResolutionManagement {
library("rikkax-multiprocess", "dev.rikka.rikkax.preference:multiprocess:$multiprocess") library("rikkax-multiprocess", "dev.rikka.rikkax.preference:multiprocess:$multiprocess")
} }
} }
} }
Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

+190 -194
View File
@@ -1,194 +1,190 @@
## UUVPN - Redesigned for Performance, Stability, and [V2Board](https://github.com/cedar2025/Xboard) Compatibility ## UUVPN - Redesigned for Performance, Stability, and [V2Board](https://github.com/cedar2025/Xboard) Compatibility
The original UUVPN was built using Flutter, which led to increasing challenges in maintaining the codebase due to performance issues, subpar UI quality, and a lack of stability. To address these concerns, UUVPN has been completely redeveloped for native performance on iOS/macOS and Android, utilizing the powerful SINGBOX and CLASH cores. The original UUVPN was built using Flutter, which led to increasing challenges in maintaining the codebase due to performance issues, subpar UI quality, and a lack of stability. To address these concerns, UUVPN has been completely redeveloped for native performance on iOS/macOS and Android, utilizing the powerful SINGBOX and CLASH cores.
![](screenshots/android/combined_image11-19_12-04-1.jpeg)
![](screenshots/android/combined_image11-19_12-04-1.jpeg)
### The new version features:
### The new version features:
- A sleek, more responsive user interface
- A sleek, more responsive user interface - Enhanced app stability
- Enhanced app stability - Significant performance optimizations
- Significant performance optimizations - Additionally, UUVPN now supports server backend protocols with full compatibility for V2Board, providing a more seamless and flexible user experience for VPN management.
- Additionally, UUVPN now supports server backend protocols with full compatibility for V2Board, providing a more seamless and flexible user experience for VPN management.
### Key Features:
### Key Features: - Native Performance: Utilizing SINGBOX for iOS/macOS and CLASH for Android, UUVPN is optimized for stability and speed.
- Native Performance: Utilizing SINGBOX for iOS/macOS and CLASH for Android, UUVPN is optimized for stability and speed. - V2Board Compatibility: Fully supports V2Board protocols, offering smooth integration for backend management.
- V2Board Compatibility: Fully supports V2Board protocols, offering smooth integration for backend management. - Refined UI: A completely redesigned interface with a modern look and feel, providing a user-friendly experience.
- Refined UI: A completely redesigned interface with a modern look and feel, providing a user-friendly experience.
### Server : ### Download iOS and android
- https://github.com/cedar2025/Xboard - [iOS TestFlight (Beta)](https://t.me/dcgzeus)
- [Android Apk](https://github.com/nicolastinkl/UUVPN/releases)
### Download iOS and android ## iOS Screenshots and Demo Video:
- [iOS TestFlight (Beta)](https://t.me/dcgzeus)
- [Android Apk](https://github.com/nicolastinkl/UUVPN/releases) ### SKIN 1:
<table>
## iOS Screenshots and Demo Video: <tr>
### SKIN 1: <td><img src="screenshots/IMG_8546.PNG" width="300" /></td>
<table> <td><img src="screenshots/IMG_8544.PNG" width="300" /></td>
<tr> <td><img src="screenshots/IMG_8547.PNG" width="300" /></td>
</tr>
<td><img src="screenshots/IMG_8546.PNG" width="300" /></td>
<td><img src="screenshots/IMG_8544.PNG" width="300" /></td> </table>
<td><img src="screenshots/IMG_8547.PNG" width="300" /></td>
</tr>
</table> ### SKIN 2:
<table>
### SKIN 2:
<tr>
<table> <td><img src="screenshots/21-31-06.png" width="300" /></td>
<td><img src="screenshots/IMG_8728.PNG" width="300" /></td>
<tr> <td><img src="screenshots/IMG_8725.PNG" width="300" /></td>
</tr>
<td><img src="screenshots/21-31-06.png" width="300" /></td>
<td><img src="screenshots/IMG_8728.PNG" width="300" /></td> </table>
<td><img src="screenshots/IMG_8725.PNG" width="300" /></td>
</tr> ### LOGIC VIEWS:
</table>
<table>
### LOGIC VIEWS:
<tr>
<table> <td><img src="screenshots/mmexport1730598307009.png" width="300" /></td>
<td><img src="screenshots/mmexport1730598308041.png" width="300" /></td>
<tr> <td><img src="screenshots/mmexport1730598311150.png" width="300" /></td>
</tr>
<td><img src="screenshots/mmexport1730598307009.png" width="300" /></td>
<td><img src="screenshots/mmexport1730598308041.png" width="300" /></td>
<td><img src="screenshots/mmexport1730598311150.png" width="300" /></td> <tr>
</tr>
<td><img src="screenshots/gongdan.png" width="300" /></td>
<td><img src="screenshots/gongdanchat.png" width="300" /></td>
<tr> <td><img src="screenshots/mmexport1730598305428.jpg" width="300" /></td>
</tr>
<td><img src="screenshots/gongdan.png" width="300" /></td>
<td><img src="screenshots/gongdanchat.png" width="300" /></td>
<td><img src="screenshots/mmexport1730598305428.jpg" width="300" /></td> </table>
</tr>
</table> ## Vidos:
<table>
<tr>
<td><img src="screenshots/13264cf9-99e7-4ff8-8e32-2564eea05670.gif" width="200" /></td>
## Vidos: <td><img src="screenshots/8a51ed33-248b-45eb-b5ba-b92821256632.gif" width="200" /></td>
<table> <td><img src="screenshots/8a51ed33-248b-45eb-b5ba-b928212566321.gif" width="200" /></td>
<tr>
<td><img src="screenshots/13264cf9-99e7-4ff8-8e32-2564eea05670.gif" width="200" /></td> </tr>
<td><img src="screenshots/8a51ed33-248b-45eb-b5ba-b92821256632.gif" width="200" /></td> </table>
<td><img src="screenshots/8a51ed33-248b-45eb-b5ba-b928212566321.gif" width="200" /></td>
</tr> ## [iOS Youtu视频预览地址](https://www.youtube.com/shorts/tnr38-IM-Xo)
</table>
# Android App Project
## [iOS Youtu视频预览地址](https://www.youtube.com/shorts/tnr38-IM-Xo)
## [Android Youtu视频预览地址](https://youtube.com/shorts/zI1hrpFJbtg?feature=share)
# Android App Project
![](screenshots/combined_image12-31_10-39.jpeg)
## [Android Youtu视频预览地址](https://youtube.com/shorts/zI1hrpFJbtg?feature=share) ## Prerequisites
Before you begin, ensure you have met the following requirements:
![](screenshots/combined_image12-31_10-39.jpeg)
## Prerequisites - **Operating System**: Any system that supports Android development (Windows, macOS, Linux).
- **Java Development Kit (JDK)**: JDK 11 or higher.
Before you begin, ensure you have met the following requirements: - **Android Studio**: The official IDE for Android development, version 4.1 or higher.
- **Android SDK**: The latest version of the Android SDK tools.
- **Operating System**: Any system that supports Android development (Windows, macOS, Linux). - **Go**: go version go1.23.2 darwin/amd64
- **Java Development Kit (JDK)**: JDK 11 or higher.
- **Android Studio**: The official IDE for Android development, version 4.1 or higher. # Legacy Version (Original Flutter-based UUVPN)
- **Android SDK**: The latest version of the Android SDK tools. The following section contains information about the original Flutter-based UUVPN for historical reference. If you need the source code, you can check out the **flutter** branch
- **Go**: go version go1.23.2 darwin/amd64
<details> <summary>Click to view the legacy version details</summary>
# Legacy Version (Original Flutter-based UUVPN) # Old Description:
The following section contains information about the original Flutter-based UUVPN for historical reference. If you need the source code, you can check out the **flutter** branch
![](screenshots/Snipaste_2023-06-25_11-38-47.png)
<details> <summary>Click to view the legacy version details</summary>
# Old Description: # UUVPN
基于Flutter开发的VPN客户端(ios/android),自主设计,精美UI,优化VPN速度,完全开源。
![](screenshots/Snipaste_2023-06-25_11-38-47.png)
A VPN application for [V2Board](https://github.com/v2board/v2board)
# UUVPN
基于Flutter开发的VPN客户端(ios/android),自主设计,精美UI,优化VPN速度,完全开源。 Support iOS and Android now.
A VPN application for [V2Board](https://github.com/v2board/v2board)
Support iOS and Android now. **IF THIS PROJECT HELPS YOU, PLEASE GIVE ME A LITTLE STAR⭐️.**
## Screenshots
![](screenshots/page_7.png)
**IF THIS PROJECT HELPS YOU, PLEASE GIVE ME A LITTLE STAR⭐️.**
## App Store
## Screenshots ![](screenshots/Snipaste_2023-06-10_14-21-20.png)
![](screenshots/page_7.png)
## App Store ## Environment
![](screenshots/Snipaste_2023-06-10_14-21-20.png)
- Flutter Flutter 3.10.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision d3d8effc68 (6 weeks ago) • 2023-05-16 17:59:05 -0700
## Environment Engine • revision b4fb11214d
Tools • Dart 3.0.1 • DevTools 2.23.1
- Flutter Flutter 3.10.1 • channel stable • https://github.com/flutter/flutter.git - Download this version url: https://drive.google.com/file/d/1ksM4_PK9Ibk7ycyrfF7XffM_99_4JYV3/view?usp=sharing
Framework • revision d3d8effc68 (6 weeks ago) • 2023-05-16 17:59:05 -0700 - leaf sdk downlaod url: https://github.com/eycorsican/leaf/releases/tag/v0.10.7
Engine • revision b4fb11214d
Tools • Dart 3.0.1 • DevTools 2.23.1 - macOS 13.3.1 +
- Download this version url: https://drive.google.com/file/d/1ksM4_PK9Ibk7ycyrfF7XffM_99_4JYV3/view?usp=sharing - Xcode 14 +
- leaf sdk downlaod url: https://github.com/eycorsican/leaf/releases/tag/v0.10.7 - iOS 15.0 +
- macOS 13.3.1 + ## Installation
- Xcode 14 +
- iOS 15.0 + ```shell
flutter pub get
## Installation ```
```shell ## Develop
flutter pub get ```shell
``` flutter run
```
## Develop
```shell ## Build
flutter run build android apk
``` ```shell
flutter build apk
## Build ```
build android apk
```shell build ios
flutter build apk ```shell
``` flutter build ios
```
build ios
```shell ----------------------
flutter build ios
``` # How to use it?
![](screenshots/ios.png)
---------------------- ![](screenshots/Snipaste_2024-07-24_14-25-11.png)
![](screenshots/Snipaste_2024-07-24_14-58-41.png)
# How to use it?
![](screenshots/ios.png) - 1: Change Domain File Path : ~UUVPN/flutter/lib/constant/app_urls.dart
![](screenshots/Snipaste_2024-07-24_14-25-11.png) ```
![](screenshots/Snipaste_2024-07-24_14-58-41.png) static const String baseUrl = "https://xxxx.com";
```
- 1: Change Domain File Path : ~UUVPN/flutter/lib/constant/app_urls.dart
``` - 2: Xcode Settings:
static const String baseUrl = "https://xxxx.com"; ![](screenshots/Snipaste_2023-12-05_09-48-45.png)
``` ![](screenshots/Snipaste_2023-12-05_09-49-14.png)
![](screenshots/Snipaste_2023-12-05_09-49-23.png)
- 2: Xcode Settings:
![](screenshots/Snipaste_2023-12-05_09-48-45.png) - 3: running screenshot:
![](screenshots/Snipaste_2023-12-05_09-49-14.png) ![](screenshots/Snipaste_2023-12-05_15-43-54.png)
![](screenshots/Snipaste_2023-12-05_09-49-23.png)
- 3: running screenshot:
![](screenshots/Snipaste_2023-12-05_15-43-54.png)