flutter_singbox_proxy
Android sing-box proxy runtime plugin for WebLibre.
The public API is Pigeon-based and intentionally uses a generic JSON profile boundary. Flutter can add strongly typed editors over time while the native API stays stable across sing-box protocol/schema updates.
Current state:
- Builds sing-box JSON for multiple simultaneous profile outbounds.
- Creates one authenticated local SOCKS inbound per active profile.
- Returns runtime endpoint metadata for Gecko container proxy integration.
- Exposes status/log callbacks.
- Starts libbox via reflection against the
io.nekohasekai.libbox.*classes shipped in the AAR — if the AAR is missing, the plugin still compiles butstartreports anIllegalStateExceptionat runtime.
Building official sing-box libbox
The plugin does not commit binary AARs. Build them from the official sing-box checkout before release/F-Droid builds:
packages/flutter_singbox_proxy/scripts/build-libbox-android.sh \
--source /path/to/sing-box
By default the script looks for ../../../sing-box relative to this package,
which matches the local workspace layout used during development. It copies
libbox.aar into android/libs/; Gradle consumes that AAR automatically when
present.
For F-Droid metadata, call the package-local prebuild script:
packages/flutter_singbox_proxy/scripts/fdroid-prebuild.sh \
--source /path/to/sing-box
The build requires OpenJDK 17, Go, Android SDK/NDK, and gomobile/gobind. If
JAVA_HOME is unset and /usr/lib/jvm/java-17-openjdk exists, the script uses
that automatically. If gomobile/gobind are missing, the script installs the
official SagerNet gomobile tools with go install.
Version compatibility
The script pins github.com/sagernet/gomobile/cmd/gomobile@v0.1.12 and
gobind@v0.1.12. The sing-box source itself is whatever you point --source
at; the runtime accesses io.nekohasekai.libbox.* via reflection, so API drift
across sing-box releases surfaces as a NoSuchMethodException at start time
rather than a build failure. When bumping sing-box:
- Rebuild the AAR with the new tag.
- Smoke-test
start/stopon a profile to catch missing/renamed setup methods (notablySetupOptions.setOomKillerDisabled/setOomKillerEnabled—LibboxRuntimefalls back between the two). - Update this README with the verified sing-box tag if relying on it for a release.