fix(android): 真机连通修复——补 ACCESS_NETWORK_STATE + 砍 IPv6 zone(Task 7)

Vivo X200(Android 16)真机实测两处运行期崩溃并修复:

- DefaultNetworkMonitor 用 ConnectivityManager 需 ACCESS_NETWORK_STATE 权限(缺则 SecurityException)

- getInterfaces 返回的 IPv6 link-local 含 zone(%rmnet_data0),sing-box netip.ParsePrefix panic;substringBefore('%') 砍掉

真机端到端连通已由用户验证通过。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-22 20:43:49 +08:00
parent c1fddcdf99
commit d0919943f5
2 changed files with 6 additions and 1 deletions
@@ -4,6 +4,9 @@
<!-- 网络权限(隧道流量) -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 默认网络监听需要(DefaultNetworkMonitor 用 ConnectivityManager 取默认接口) -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 前台服务(VPN 持续运行所需,API 28+) -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
@@ -391,7 +391,9 @@ class PangolinVpnService : VpnService(), PlatformInterface, CommandServerHandler
runCatching { box.setMTU(ni.mtu) }
box.addresses = StringArray(
ni.interfaceAddresses.mapNotNull { ia ->
val host = ia.address?.hostAddress ?: return@mapNotNull null
// 砍掉 IPv6 link-local 的 zone 标识(如 %rmnet_data0)——
// sing-box netip.ParsePrefix 不接受 prefix 内含 zone,否则 panic。
val host = ia.address?.hostAddress?.substringBefore('%') ?: return@mapNotNull null
"$host/${ia.networkPrefixLength}"
}.iterator()
)