Skip to content

Android 13+ excludeRoute bypass, arm64-only, pin ezvpn v0.0.43 - #7

Merged
andrewchen5678 merged 3 commits into
mainfrom
android-13-exclude-route-arm64
Aug 21, 2026
Merged

andrewchen5678 merged 3 commits into
mainfrom
android-13-exclude-route-arm64

Conversation

@andrewchen5678

Copy link
Copy Markdown
Contributor

Summary

  • Underlay bypass via excludeRoute on API 33+: the core's bypass hosts were always subtracted from the tunnel routes (no excludeRoute before Android 13), which turned a server /128 inside a routed IPv6 /56 into 72 routes. TunnelPlan.from(…, excludeRoutes) now keeps routes whole on API 33+ and the service installs the bypass with VpnService.Builder.excludeRoute (a throw route, longest match wins); subtraction remains for Android 10–12. DNS-coverage warnings use the effective set under both shapes.
  • arm64-only, Nexus 7 dropped: ndk.abiFilters = arm64-v8a (Play's 64-bit requirement); the physical-device serial, fixed-adb-port notes and refusal logic are gone from docs/scripts. scripts/install-release-apk.sh requires RELEASE_DEVICE_SERIAL.
  • Pin ezvpn v0.0.43 (versionCode 4): the custom-relay /healthz probe no longer builds rustls-platform-verifier, which aborted the app on "Connection path" for profiles with custom relays (Verify custom-relay /healthz with webpki roots; 0.0.43 ezvpn#57).

Test plan

  • ./gradlew :tunnelcore:test :app:testDebugUnitTest :app:assembleDebug (new planExcludesBypassInsteadOfSubtractingWhenThePlatformCan)
  • Debug APK contains only lib/arm64-v8a/
  • Emulator (arm64, API 36), pinned v0.0.43, profile with custom relays + routed 2600:…:a000::/56 containing the server's underlay /128: readout shows the single /56 + bypass /128; kernel has throw 2600:…:b6f8 dev lo; direct IPv6 path selected; IPv4/IPv6 gateway pings OK; "Connection path" opens without the abort and shows both relays working; clean disconnect

🤖 Generated with Claude Code

https://claude.ai/code/session_01QedowxAkQAV7HoeJu8ZYZC

Andrew Chen and others added 3 commits August 21, 2026 15:37
The 2013 Nexus 7 (32-bit armeabi-v7a) is no longer a target, so the docs,
instructions and scripts lose the "physical device" serial and the
fixed-adb-port notes. scripts/install-release-apk.sh now requires
RELEASE_DEVICE_SERIAL instead of defaulting to that tablet, and
scripts/run-device.sh no longer needs to refuse it.

The app packages only arm64-v8a (ndk.abiFilters), per Google Play's 64-bit
requirement; the core release zip's other ABIs are not shipped.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QedowxAkQAV7HoeJu8ZYZC
The core's bypass set (server/relay underlay hosts a routed prefix would
capture) was always subtracted from the tunnel routes, because
VpnService.Builder had no excludeRoute before API 33. Subtraction splits
the containing prefix into every sibling down to the host: a /128 inside a
routed /56 became 72 IPv6 routes on the interface and in the detail screen.

On API 33+ the plan now keeps the routes whole and the service installs the
bypass hosts with Builder.excludeRoute — a throw route inside the routed
prefix that wins by longest match. TunnelPlan.from takes the platform's
capability as a flag so tunnelcore stays pure; subtraction remains for
Android 10–12. DNS-coverage warnings are judged on the effective set under
both shapes, so a resolver on a bypassed address still warns.

Verified on the arm64 emulator (API 36) with a profile whose server sits
inside its routed IPv6 /56: one /56 route plus a kernel throw route for the
/128, the direct IPv6 path stays selected, both families reach the gateway.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QedowxAkQAV7HoeJu8ZYZC
The custom-relay /healthz probe no longer builds rustls-platform-verifier,
which aborted the app on "Connection path" for profiles with custom relays.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QedowxAkQAV7HoeJu8ZYZC
@andrewchen5678
andrewchen5678 merged commit 827f944 into main Aug 21, 2026
1 check passed
@andrewchen5678
andrewchen5678 deleted the android-13-exclude-route-arm64 branch August 21, 2026 22:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant