Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
5d81fd6
Feature: Support Android Platform.
burningtnt Nov 8, 2025
120e2ae
Fix: GitHub CI. Feature: JNI Binding
burningtnt Nov 9, 2025
8eb1cbb
Fix.
burningtnt Nov 9, 2025
3b533e1
Fix.
burningtnt Nov 9, 2025
bea39ad
Fix.
burningtnt Nov 9, 2025
6386c31
Merge branch 'master' into feature/android
burningtnt Nov 11, 2025
5138892
Fix: linkage_impl module declaration.
burningtnt Nov 11, 2025
cb95516
Code cleanup.
burningtnt Nov 11, 2025
294f531
Refactor lib mode: remove rocket and expose state management API.
burningtnt Nov 14, 2025
580b6c5
Update JNI declaration to support requesting Tun ID on Android.
burningtnt Nov 15, 2025
74bd31e
Fix.
burningtnt Nov 15, 2025
01b1083
Fix.
burningtnt Nov 15, 2025
263602e
Fix.
burningtnt Nov 15, 2025
051262c
Fix.
burningtnt Nov 15, 2025
36e8a24
Fix: Android doesn't support JNI_GetCreatedVMs
burningtnt Nov 16, 2025
e5b3c23
Fix: A jclass argument is missing.
burningtnt Nov 16, 2025
0513bea
Fix: Print more logs on EasyTier to log.
burningtnt Nov 16, 2025
ce405bf
Fix: Android Support for VpnService requesting.
burningtnt Nov 21, 2025
0647632
Merge remote-tracking branch 'burningtnt/master' into feature/android
burningtnt Nov 22, 2025
99308ca
Update platform compilation guards' messages.
burningtnt Nov 28, 2025
2eb4df3
Feature: Allow panic to be detected in Java Level. Feature: Export logs.
burningtnt Nov 30, 2025
f3125e5
Provide builds for armeabi-v7a, x86, x86_64.
burningtnt Nov 30, 2025
71b89c9
Feature: Make JNI Bindings portable.
burningtnt Nov 30, 2025
5ca55ce
Update JNI Bindings.
burningtnt Nov 30, 2025
e3dbab5
Bump local-ip-address to customed edition with bug fixes.
burningtnt Dec 11, 2025
d1cbe00
Merge remote-tracking branch 'burningtnt/master' into feature/android
burningtnt Dec 11, 2025
455c13c
Trigger CI
burningtnt Dec 13, 2025
6a3e239
Bump local-ip-address to 0.6.7
burningtnt Dec 13, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 57 additions & 34 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ jobs:
run: |
rustup target add --toolchain nightly "${{ matrix.target }}"
rustup component add rust-src --toolchain "nightly-$(rustc --print host-tuple)"
cargo +nightly build --release --target "${{ matrix.target }}" \
cargo +nightly build --release --bin terracotta --target "${{ matrix.target }}" \
-Z build-std=core,std,alloc,proc_macro,panic_abort \
-Z build-std-features=default,optimize_for_size
env:
Expand All @@ -70,46 +70,46 @@ jobs:
fail-fast: false
matrix:
include:
- runs-on: ubuntu-24.04
os: linux
arch: x86_64
target: x86_64-unknown-linux-musl
- runs-on: ubuntu-24.04-arm
os: linux
arch: arm64
target: aarch64-unknown-linux-musl
- runs-on: ubuntu-24.04
os: linux
arch: riscv64
target: riscv64gc-unknown-linux-gnu
glibc-version: 2.27
- runs-on: ubuntu-24.04
os: linux
arch: loongarch64
target: loongarch64-unknown-linux-gnu
- runs-on: ubuntu-24.04
os: freebsd
arch: x86_64
target: x86_64-unknown-freebsd
runs-on: ${{ matrix.runs-on }}
- { os: linux, arch: x86_64, target: x86_64-unknown-linux-musl }
- { os: linux, arch: arm64, target: aarch64-unknown-linux-musl, runs-on: ubuntu-24.04-arm }
- { os: linux, arch: riscv64, target: riscv64gc-unknown-linux-gnu, glibc-version: 2.27 }
- { os: linux, arch: loongarch64, target: loongarch64-unknown-linux-gnu }
- { os: freebsd, arch: x86_64, target: x86_64-unknown-freebsd }
- { os: android, arch: armv7 , target: armv7-linux-androideabi }
- { os: android, arch: arm64v8a, target: aarch64-linux-android }
- { os: android, arch: x86, target: i686-linux-android }
- { os: android, arch: x86_64, target: x86_64-linux-android }
runs-on: ${{ matrix.runs-on || 'ubuntu-24.04' }}
name: Build (${{ matrix.target }})
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install GitHub Artifact Client
uses: lhotari/gh-actions-artifact-client@v2
- name: Install musl libc (linux x86_64 | linux arm64)
if: ${{ contains(fromJSON('["x86_64", "arm64"]'), matrix.arch) && matrix.os == 'linux' }}
run: |
sudo apt update
sudo apt install --yes --no-install-recommends build-essential musl-tools musl-dev
- name: Compute Version
run: |
if [ -z "${{ github.event.inputs.version }}" ]; then
echo "TERRACOTTA_VERSION=${GITHUB_SHA::7}" >> $GITHUB_ENV
else
echo "TERRACOTTA_VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV
fi
- name: Setup Android SDK (Android)
if: ${{ matrix.os == 'android' }}
uses: android-actions/setup-android@v3
with:
cmdline-tools-version: 11076708
packages: 'build-tools;34.0.0 ndk;26.0.10792818 tools platform-tools platforms;android-34 '
- name: Install cargo-ndk and protobuf-compiler (Android)
if: ${{ matrix.os == 'android' }}
run: |
sudo apt update
sudo apt install --yes --no-install-recommends protobuf-compiler libprotobuf-dev
cargo install cargo-ndk --force
- name: Install musl libc (linux x86_64 | linux arm64)
if: ${{ contains(fromJSON('["x86_64", "arm64"]'), matrix.arch) && matrix.os == 'linux' }}
run: |
sudo apt update
sudo apt install --yes --no-install-recommends build-essential musl-tools musl-dev
- name: Install Zig (linux riscv64 | linux loongarch64)
if: ${{ contains(fromJSON('["riscv64", "loongarch64"]'), matrix.arch) && matrix.os == 'linux' }}
uses: mlugg/setup-zig@v2
Expand All @@ -121,7 +121,7 @@ jobs:
run: |
rustup target add --toolchain nightly "${{ matrix.target }}"
rustup component add rust-src --toolchain "nightly-$(rustc --print host-tuple)"
cargo +nightly build --release --target "${{ matrix.target }}" \
cargo +nightly build --release --bin terracotta --target "${{ matrix.target }}" \
-Z build-std=core,std,alloc,proc_macro,panic_abort \
-Z build-std-features=default,optimize_for_size
env:
Expand All @@ -130,7 +130,7 @@ jobs:
if: ${{ contains(fromJSON('["riscv64", "loongarch64"]'), matrix.arch) && matrix.os == 'linux' }}
run: |
rustup target add --toolchain nightly "${{ matrix.target }}"
cargo +nightly zigbuild --release --target "${{ matrix.target }}.${{ matrix.glibc-version }}"
cargo +nightly zigbuild --release --bin terracotta --target "${{ matrix.target }}.${{ matrix.glibc-version }}"
- name: Build (freebsd x86_64)
if: ${{ contains(fromJSON('["x86_64"]'), matrix.arch) && matrix.os == 'freebsd' }}
uses: cross-platform-actions/action@v0.30.0
Expand All @@ -146,11 +146,30 @@ jobs:
export CXX=clang++
. $HOME/.cargo/env
rustup target add --toolchain nightly "${{ matrix.target }}"
cargo +nightly build --release --target "${{ matrix.target }}"
cargo +nightly build --release --bin terracotta --target "${{ matrix.target }}"
- name: Build (Android)
if: ${{ matrix.os == 'android' }}
run: |
export PATH="$PATH:$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin"
export NDK_HOME="$ANDROID_NDK_HOME"

rustup target add --toolchain nightly "${{ matrix.target }}"
rustup component add rust-src --toolchain "nightly-$(rustc --print host-tuple)"
cargo +nightly ndk build --release --lib --target "${{ matrix.target }}" \
-Z build-std=core,std,alloc,proc_macro,panic_abort \
-Z build-std-features=default,optimize_for_size
env:
RUSTFLAGS: -Zunstable-options -Cpanic=unwind
- name: Upload Artifact
run: |
source="terracotta-${TERRACOTTA_VERSION}-${{ matrix.os }}-${{ matrix.arch }}"
cp "target/${{ matrix.target }}/release/terracotta" "$source"
if [ "${{ matrix.os }}" = "android" ]; then
source="terracotta-${TERRACOTTA_VERSION}-${{ matrix.os }}-${{ matrix.arch }}.so"
cp "target/${{ matrix.target }}/release/libterracotta.so" "$source"
else
source="terracotta-${TERRACOTTA_VERSION}-${{ matrix.os }}-${{ matrix.arch }}"
cp "target/${{ matrix.target }}/release/terracotta" "$source"
fi

chmod 755 "$source"
tar -cf "$source.tar" "$source"
zip -q - "$source.tar" | gh-actions-artifact-client.js upload -r 90 "$source.tar"
Expand Down Expand Up @@ -185,7 +204,7 @@ jobs:
run: |
rustup target add --toolchain nightly "${{ matrix.target }}"
rustup component add rust-src --toolchain "nightly-$(rustc --print host-tuple)"
cargo +nightly build --release --target "${{ matrix.target }}" \
cargo +nightly build --release --bin terracotta --target "${{ matrix.target }}" \
-Z build-std=core,std,alloc,proc_macro,panic_abort \
-Z build-std-features=default,optimize_for_size
env:
Expand Down Expand Up @@ -252,6 +271,10 @@ jobs:
"terracotta-${TERRACOTTA_VERSION}-freebsd-x86_64"
"terracotta-${TERRACOTTA_VERSION}-macos-x86_64"
"terracotta-${TERRACOTTA_VERSION}-macos-arm64"
"terracotta-${TERRACOTTA_VERSION}-android-armv7.so"
"terracotta-${TERRACOTTA_VERSION}-android-arm64v8a.so"
"terracotta-${TERRACOTTA_VERSION}-android-x86.so"
"terracotta-${TERRACOTTA_VERSION}-android-x86_64.so"
)

file=$(mktemp -t XXXXXX.zip)
Expand Down
20 changes: 18 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@ chrono = { version = "0.4.41", default-features = false, features = [
] }
lazy_static = "1.5.0"
libc = "0.2.174"
local-ip-address = "0.6.5"
native-dialog = "0.9.0"
local-ip-address = "0.6.7"
num-bigint = "0.4.6"
open = { version = "5.3.2", default-features = false }
rand_core = { version = "0.9.3", features = ["os_rng"] }
Expand All @@ -47,6 +46,16 @@ objc2 = "0.6.1"
objc2-app-kit = "0.3.1"
objc2-foundation = "0.3.1"
objc2-web-kit = "0.3.1"
native-dialog = "0.9.0"

[target.'cfg(target_os = "android")'.dependencies]
easytier = { git = "https://github.com/burningtnt/EasyTier.git", branch = "main"}
jni = { version = "0.21.1", features = ["invocation"] }
# These libraries are the necessities to interact with EasyTier. DO NOT upgrade their version.
uuid = "1"
toml = "0"
tokio = "1"
cidr = { version = "0", features = ["serde"] }

[build-dependencies]
winresource = "0.1"
Expand All @@ -60,6 +69,13 @@ reqwest = { version = "0.12.22", default-features = false, features = [
zip = "4.3.0"
toml = "0.9.4"

[lib]
crate-type = ["cdylib"]

[[bin]]
name = "terracotta"
path = "src/main.rs"

[profile.dev]
panic = "abort"

Expand Down
13 changes: 9 additions & 4 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,13 @@ use std::{
fn main() {
println!("cargo::rerun-if-changed=Cargo.toml");

println!("cargo::rerun-if-changed=.easytier");
download_easytier();

sevenz_rust2::compress_to_path(
"web",
Path::new(&get_var("OUT_DIR").unwrap()).join("webstatics.7z"),
)
.unwrap();
.unwrap();
println!("cargo::rerun-if-changed=web");

let desc = get_var("TARGET").unwrap().replace('-', "_").to_uppercase();
Expand Down Expand Up @@ -84,6 +83,7 @@ fn download_easytier() {

input.get("version").unwrap().as_str().unwrap().to_string()
};
println!("cargo::rustc-env=TERRACOTTA_ET_VERSION={}", version);

let target_os = get_var("CARGO_CFG_TARGET_OS").unwrap();
let target_arch = get_var("CARGO_CFG_TARGET_ARCH").unwrap();
Expand Down Expand Up @@ -181,9 +181,15 @@ fn download_easytier() {
cli: "easytier-cli",
desc: "freebsd-x86_64",
},
_ => panic!("Cannot compile Terracotta on {}-{}: Cannot find valid EasyTier binary.", target_os, target_arch)
("android", "arm") | ("android", "aarch64") | ("android", "x86") | ("android", "x86_64") => return,
_ => panic!(
"Cannot compile Terracotta on {}-{}: Cannot find valid EasyTier binary.",
target_os, target_arch
),
};

println!("cargo::rerun-if-changed=.easytier");

let base = Path::new(&get_var("CARGO_MANIFEST_DIR").unwrap())
.join(".easytier")
.join(&version)
Expand All @@ -203,7 +209,6 @@ fn download_easytier() {
"cargo::rustc-env=TERRACOTTA_ET_ARCHIVE={}",
entry_archive.as_path().to_str().unwrap()
);
println!("cargo::rustc-env=TERRACOTTA_ET_VERSION={}", version);

if fs::metadata(entry_conf.clone()).is_ok() {
return;
Expand Down
Loading