From d0919943f59ea80a04c67c00512b205018a02221 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Mon, 22 Jun 2026 20:43:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(android):=20=E7=9C=9F=E6=9C=BA=E8=BF=9E?= =?UTF-8?q?=E9=80=9A=E4=BF=AE=E5=A4=8D=E2=80=94=E2=80=94=E8=A1=A5=20ACCESS?= =?UTF-8?q?=5FNETWORK=5FSTATE=20+=20=E7=A0=8D=20IPv6=20zone(Task=207)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- client/android/app/src/main/AndroidManifest.xml | 3 +++ .../kotlin/com/pangolin/pangolin_vpn/PangolinVpnService.kt | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/client/android/app/src/main/AndroidManifest.xml b/client/android/app/src/main/AndroidManifest.xml index 8e0188f..99b3c2b 100644 --- a/client/android/app/src/main/AndroidManifest.xml +++ b/client/android/app/src/main/AndroidManifest.xml @@ -4,6 +4,9 @@ + + + diff --git a/client/android/app/src/main/kotlin/com/pangolin/pangolin_vpn/PangolinVpnService.kt b/client/android/app/src/main/kotlin/com/pangolin/pangolin_vpn/PangolinVpnService.kt index 6c96801..c881953 100644 --- a/client/android/app/src/main/kotlin/com/pangolin/pangolin_vpn/PangolinVpnService.kt +++ b/client/android/app/src/main/kotlin/com/pangolin/pangolin_vpn/PangolinVpnService.kt @@ -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() )