WhiteAestherMobile README

The project's README from github.com/WhiteDNS/WhiteAestherMobile. As one markdown file: README.md.

WhiteAestherMobile

Android client for the Aether encrypted route engine. Finds a working path out of restrictive networks and carries your traffic through it.

Release CI Licence Android

Install

Grab the APK for your phone from the latest release.

File Use it if
arm64-v8a Almost every phone from 2017 onward. Start here.
armeabi-v7a Older or budget 32-bit devices
x86_64 Emulators, ChromeOS
universal You are not sure. Works everywhere, roughly three times the size.
.aab Play Store submission, not for sideloading

Verify what you downloaded against SHA256SUMS in the same release:

sha256sum -c SHA256SUMS --ignore-missing

Android will warn about installing outside the Play Store. That is expected for a sideloaded APK.

راهنمای فارسی: docs/GUIDE.fa.md -- installing, first run, and what to change when a network blocks the connection.

First run

1. Leave Coverage on "Whole device". Under Traffic, this is the default and what almost everyone wants — every app on the phone is carried through the tunnel. Proxy only runs a local SOCKS5 listener instead and routes nothing by itself; traffic only goes through it if you point an app at 127.0.0.1:1819. If you pick it by accident, it looks like the app connected but did nothing.

2. Leave the profile on "Adaptive". Under Routes. It balances how hard the engine searches against how quickly it connects. The other profiles are narrower:

Profile For
Adaptive Most networks. Start here.
Patchy signal Mobile data that keeps dropping — searches harder
Strict network Office or campus Wi-Fi that blocks a lot — quieter probing, slower
Manual You set the transport and search depth yourself

3. Allow background running when asked. Under Settings, a card appears if Android is still allowed to suspend the app. Without the exemption the tunnel drops when the screen goes off — some manufacturers are far more aggressive about this than others.

4. Expect the first connect to take a moment. The engine tests real network paths before accepting one. If a path fails it backs off and retries, and the status line tells you which attempt it is on.

When it will not connect

The line under the big status heading is the engine's own message, not a generic error. It is the first thing to read.

What you see What it means
... · retry 3 of 8 in 12s A path failed and it is trying another. Normal on a hostile network.
Could not reach Tor's bridge service Tap Fetch bridges while connected through Aether or Psiphon, or paste bridges from @GetBridgesBot.
... is looking for a way out A carrier is establishing. Psiphon tries many protocols at once; Tor fetches a consensus and builds a circuit. A minute is normal, and behind a bridge rather more.
Stopped after 8 attempts Nothing worked here. Try a different profile or network.
custom endpoint ... failed MASQUE validation The address you pinned is not reachable. Switch Endpoint back to Automatic.
Connected to a different endpoint Your pinned address failed and fallback substituted a working one.

Worth trying, in order: switch the profile to Strict network; set Addresses to IPv4 only under Traffic if the network handles IPv6 badly; turn Obfuscation up to Aggressive.

Under Settings → Diagnostics you can raise the detail level, reproduce the problem, and send a report. It shows you the exact text before anything is sent, and replaces IP addresses with placeholders unless you turn that off.

How it works

Aether probes reachable Cloudflare endpoints, completes an authenticated MASQUE handshake against them, and only accepts a route once real traffic returns through it. The app then either raises an Android VpnService tunnel that captures IPv4, IPv6 and DNS, or exposes a loopback SOCKS5 proxy.

Requirements

Android 8.0 (API 26) or newer, on arm64-v8a, armeabi-v7a or x86_64.

Build from source

git clone https://github.com/WhiteDNS/WhiteAestherMobile.git
cd WhiteAestherMobile
./gradlew assembleStableDebug

Needs JDK 21, Android SDK 36 with NDK 29.0.14206865 and CMake 3.22.1, and Rust 1.88.0 with the Android targets plus cargo-ndk. The Gradle build compiles the Rust bridge itself.

./gradlew :app:compileStableDebugKotlin skips the native build and is the fast loop when only touching Kotlin.

Two things Gradle does not build for you. The exit chain's Go library, which the Psiphon carrier also needs to reach the interface:

pwsh -File native/chain/setup.ps1
pwsh -File native/chain/build.ps1

Psiphon's bootstrap server list, which is data rather than code and is not committed:

pwsh -File native/psiphon/setup.ps1

and Tor's pluggable transports, which are Go programs built as Android executables:

pwsh -File native/tor/setup.ps1
pwsh -File native/tor/build.ps1

A build missing either still installs and runs; the feature that needs it says so rather than failing at connect time on somebody's phone.

Repository layout

Path
app/ The Android application
native/aether/ Vendored Aether engine
native/psiphon/ The Psiphon carrier: what to fetch, and why it is a separate process
native/android-bridge/ Rust JNI bridge between the two
design/ Clickable design prototype and the notes from building it
docs/ Release process and device test plan

design/PORT-STATUS.md records what was verified against the engine and what is still outstanding — worth reading before changing the connection UI.

Releasing

CI verifies every pull request and every push to main. Publishing happens on tags alone:

git tag v1.2.3 && git push origin v1.2.3

That builds, tests, signs, verifies every APK, and publishes the release.

Privacy

No analytics, no telemetry, no accounts. The proxy binds to loopback only, cleartext traffic is blocked, backups are disabled, and diagnostics reports are never sent without you reviewing them first. See PRIVACY.md.

Licence

AGPL-3.0, as is the Aether engine it embeds. The exit chain is built on mihomo, which is GPL-3.0; AGPL-3.0 section 13 permits the combination, and each part keeps its own licence. Components, revisions, and the one modification we make are listed in THIRD_PARTY_NOTICES.md.

WhiteAestherMobile (WhiteDNS/WhiteAestherMobile)

Searching Database…

这是什么?WhiteAestherMobile 是 Aether 加密路由引擎的原生 Android 客户端。它会探测出一条可用的路径来突破受限或受审查的网络,并让设备流量经由该路径路由。
这是 VPN 应用,还是只是本地代理工具?默认是完整的 VPN:它会建立一个 Android VpnService 隧道,捕获设备的全部流量。你也可以把 Coverage 切换为“Proxy”,那样只暴露一个本地 SOCKS5 监听端口,需要手动把应用指向它。
怎么装到手机上?从最新的 GitHub release 下载与设备架构匹配的 APK(arm64-v8a 覆盖 2017 年以来几乎所有手机,不确定就选 universal 通用版),对照 SHA256SUMS 校验后侧载安装,因为它不通过 Play 商店分发。
需要什么 Android 版本和硬件?Android 8.0(API 26)或更新版本,设备需为 arm64-v8a、armeabi-v7a 或 x86_64。
它总能连得上吗?不能保证——引擎会主动测试真实网络路径并按退避策略重试,在恶劣网络下可能要尝试多次甚至彻底失败。Psiphon 和 Tor 等可选载体还依赖额外的构建步骤;如果跳过了这些步骤,应用仍能安装,但对应功能会报告无法工作,而不是在连接时静默失败。
这个应用收集哪些数据?默认什么都不收集:没有分析统计、没有遥测、没有账号。本地代理只绑定回环地址,明文流量被阻止,备份被禁用,诊断报告在发送出去之前会先展示给你。
Aether 用哪些传输方式穿透封锁?基于 HTTP/3(QUIC)的 MASQUE,在封锁 UDP 的网络上回退到 TLS/TCP 上的 HTTP/2,另有混淆填充配置,让隧道流量更难被指纹识别。
出口链(exit chain)功能是干什么的?它是在主隧道之后从隧道内部发起的可选第二跳,这样目标网站看到的是你自己的节点而不是 Cloudflare。节点来自订阅或粘贴的链接。
我能用 Tor 或 Psiphon 替代默认的 Aether 载体吗?可以,在 Routes 里可以把载体切换为 Psiphon 或 Tor。两者都更慢,面向 Aether 自身无法突围的网络,而且 Tor 不承载 UDP。
我的私钥存在哪里?私钥在首次连接时生成,保存在应用私有存储中——绝不会离开设备。
Creator
WhiteDNS
Size
19.7 MB
Stars
266
Age
2mo
Commits · 90 Days