)
从零编译双架构APKtg-ws-proxy-android 构建指南cargo-ndk Gradle 完整流程【免费下载链接】tg-ws-proxy-androidAndroid-форк популярного приложения Flowseal - tg-ws-proxy - локальный прокси-сервер MTProto с проксированием CF или без для частичного обхода проблем загрузки Telegram项目地址: https://gitcode.com/gh_mirrors/tg/tg-ws-proxy-androidtg-ws-proxy-android是知名 MTProto 本地代理 tg-ws-proxy 的 Android 移植版它在手机上启动一个本地 MTProto 代理默认127.0.0.1:1443把 Telegram 流量经加密 WebSocket可走 CloudFlare转发到数据センター从而部分解决加载、连接类问题。项目采用Rust 原生引擎 Kotlin Compose 界面的双层架构核心逻辑用 Rust 编写Kotlin 侧通过 JNA 调用编译出的libtgwsproxy.so。自己动手从零编译你就能获得支持arm64-v8a64位与armeabi-v7a32位双架构的 APK甚至打包出同时兼容两者的 universal 包。整条流程只有两步cargo-ndk 编译 .so → Gradle 打包 APK。一、项目结构与构建原理速览 ️编译前先搞清楚每个部分在哪里、干什么组成部分路径作用Rust 代理引擎src/proxy.rs、ws.rs、cfproxy.rs、crypto.rs、balancer.rs 等本地 MTProto 代理、WS 连接池、CF 转发、加密逻辑原生库导出层src/lib.rs定义 FFI 导出函数供 JNA 调用、全局 tokio 运行时Rust 工程配置Cargo.tomlcdylib动态库、release 极致优化LTO strip opt-level z编译好的原生库app/src/main/jniLibs/arm64-v8a/、armeabi-v7a/下的libtgwsproxy.soKotlin 应用层app/src/main/java/com/amurcanov/tgwsproxy/Compose 界面、前台服务、快捷开关磁贴构建脚本build_so.bat、build_apk.bat一键编译 .so / 一键打包 APKWindows 版 为什么需要两个 .so因为arm64-v8a面向 64 位新设备minSdk 24armeabi-v7a面向 32 位老设备minSdk 21。两者由 Gradle 的 product flavor 分别打入对应 APK。Rust 侧的发布优化配置值得看一眼它把体积压到了极致见 Cargo.tomlopt-level z # 按体积优化 lto true # 链接期优化 codegen-units 1 panic abort strip true # 去除符号表二、构建环境准备Rust、cargo-ndk 与 Android NDK2.1 工具链版本清单 ✅工具版本要求用途Rust rustup1.70编译 Rust 代理引擎cargo-ndk最新版封装 NDK 交叉编译一条命令产出 .soAndroid NDK任意较新版本需含 24、21 级别 sysroot提供 Android 交叉编译工具链JDK17Gradle / Android 构建gradle-wrapper.properties 使用 Gradle 9.6.0Android SDKPlatform 35compileSdk 35app/build.gradle.kts 中指定2.2 安装 Rust 交叉编译目标cargo-ndk 底层靠 rustup 目标 NDK 工具链工作先装好两个 Android 目标rustup target add aarch64-linux-android armv7-linux-androideabi cargo install cargo-ndk2.3 配置 NDK 路径Android Studio 用户SDK Manager → SDK Tools 勾选NDK (Side by side)安装然后记住 NDK 安装目录如...\sdk\ndk\26.x.xxxxxxx。命令行用户安装后需把 NDK 目录设为环境变量ANDROID_NDK_HOME旧版为NDK_HOMEcargo-ndk 靠它定位编译器。这是新手最常踩的坑 ⚠️。Windows 下项目已内置脚本 build_so.bat只需把第 10 行的SDK_PATH改为你自己的 SDK 路径它会自动找到 NDK 版本目录、检测/安装 cargo-ndk 并添加目标。三、cargo-ndk 编译双架构 .so核心步骤 ️3.1 两条命令编译 arm64 arm32build_so.bat 的核心就是两次cargo ndk build --release输出直接落到app\src\main\jniLibs下# [1/2] 64 位arm64-v8aAPI 24 cargo ndk -t arm64-v8a --platform 24 -o app/src/main/jniLibs build --release # [2/2] 32 位armeabi-v7aAPI 21 cargo ndk -t armeabi-v7a --platform 21 -o app/src/main/jniLibs build --release参数速记-t目标 ABIarm64-v8a/armeabi-v7a--platform最低 Android API 级别-o.so 输出目录对应 app/src/main/jniLibs/--release走 Cargo.toml 中的 release 优化配置成功后你会看到两个文件app/src/main/jniLibs/arm64-v8a/libtgwsproxy.so app/src/main/jniLibs/armeabi-v7a/libtgwsproxy.soLinux / macOS 用户直接执行上面两条命令即可-o后路径写成app/src/main/jniLibs无需 .bat 脚本。3.2 编译成功标志终端末尾出现类似输出即成功arm64-v8a: OK [xxxxx bytes] armeabi-v7a: OK [xxxxx bytes]仓库中已经内置了一份编译好的 libtgwsproxy.so如果你只想体验 Gradle 打包环节可以跳过本节的重新编译。四、Gradle 打包 release APK一键产出三个包 4.1 双架构如何映射到 APK flavorapp/build.gradle.kts 用arch维度定义了三个 flavor与 .so 一一对应FlavorminSdk包含 ABI产出 APKarm3221armeabi-v7aapp-arm32-release.apkarm6424arm64-v8aapp-arm64-release.apkuniversal21两者都装app-universal-release.apk同时 app/build.gradle.kts 中显式声明了jniLibs.srcDirs(src/main/jniLibs)保证上一步的 .so 被正确打进包内。4.2 执行打包脚本 build_apk.bat 的流程是从 app/build.gradle.kts 读取versionName当前为1.2.3拼出v1.2.3-android前缀校验两个 .so 是否齐全缺失会提示先运行 build_so.bat执行gradlew assembleRelease --no-daemon把三个 APK 复制重命名到app\release\app/release/ ├── v1.2.3-android-universal.apk # 双架构合一分发给所有人最省事 ├── v1.2.3-android-v8a-minsdk24.apk # 仅 64 位 ARM └── v1.2.3-android-v7a-minsdk21.apk # 仅 32 位 ARM没有 Windows 脚本任何系统下在项目根目录运行./gradlew assembleRelease # Linux / macOS gradlew.bat assembleRelease # Windows4.3 签名说明 release 构建默认开启混淆与资源压缩isMinifyEnabled true R8 full mode。签名逻辑在 app/build.gradle.kts若根目录local.properties里配置了KEYSTORE_FILE、KEYSTORE_PASSWORD、KEY_ALIAS、KEY_PASSWORD则用你的 keystore 正式签名未配置时自动降级为 debug 签名本地安装测试完全没问题只是不能用于商店上架或覆盖更新。性能参数方面gradle.properties 已为构建机做了调优4G 堆内存、并行任务、构建缓存、configuration cache一般无需改动。五、常见问题快速排查 现象原因与对策cargo ndk提示找不到 NDK未设置ANDROID_NDK_HOME环境变量或 NDK 未安装对照 build_so.bat 手动指定目标平台报错如target not installed漏装 rustup 目标rustup target add aarch64-linux-android armv7-linux-androideabibuild_apk.bat 报.so not found先完成第三节运行 build_so.bat再打包 APK提示WARNING: Keystore not found, using debug signing正常现象只是没有配置正式签名见 4.3 节Gradle 下载 JDK 失败settings.gradle.kts 使用 foojay-resolver 自动拉取 JDK 17 工具链确认网络可访问 Gradle 分发源六、完整流程一图流 ┌─ 环境 ─────────────────────────────────────────────┐ │ rustup target add 双目标 → cargo install cargo-ndk │ │ 安装 Android NDK → 设置 ANDROID_NDK_HOME │ └──────────────────────────────────────────────────────┘ ↓ ┌─ 第 1 步编译原生库 ───────────────────────────────┐ │ cargo ndk -t arm64-v8a --platform 24 build --release │ │ cargo ndk -t armeabi-v7a --platform 21 build --release│ │ 输出 → app/src/main/jniLibs/{arm64-v8a,armeabi-v7a}/libtgwsproxy.so └──────────────────────────────────────────────────────┘ ↓ ┌─ 第 2 步Gradle 打包 ─────────────────────────────┐ │ gradlew assembleRelease │ │ 输出 → app/release/ 下 3 个 APKarm32 / arm64 / universal └──────────────────────────────────────────────────────┘完成后推荐安装universal 版一台 APK 通吃 32 位与 64 位设备。装好应用后打开它阅读内置的「信息」页说明点击「启动代理」再点「应用到 Telegram」双架构编译的成果就能跑起来了 关键文件速查build_so.bat.so 编译脚本· build_apk.batAPK 打包脚本· app/build.gradle.ktsflavor 与签名配置· Cargo.tomlRust 依赖与优化配置【免费下载链接】tg-ws-proxy-androidAndroid-форк популярного приложения Flowseal - tg-ws-proxy - локальный прокси-сервер MTProto с проксированием CF или без для частичного обхода проблем загрузки Telegram项目地址: https://gitcode.com/gh_mirrors/tg/tg-ws-proxy-android创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考