Android SDK 30+下调用Go的net.InterfaceAddrs()失败求助
Go Mobile Bind 与 Android SDK 30+ 兼容性问题:net.InterfaceAddrs() 权限错误
问题描述
问题编号40569导致Golang移动绑定与Android SDK 30+不兼容,调用标准库函数net.InterfaceAddrs()时会因Android SDK 30的权限变更报错,错误信息为:
route ip+net: netlinkrib: permission denied
已执行的操作:
- 按照该issue下编号为1603916131的评论修改了Go源码,并将修改后的源码放置在本地
GOPATH和GOROOT路径下 - 执行
gomobile bind ...命令生成移动绑定,但在Android SDK 33环境下仍出现相同错误
疑问:
gomobile bind(依赖gobind)是否会使用自身捆绑的Go二进制文件,而非本地安装/修改的版本?- 针对该兼容性问题,是否有更优的解决办法?
解答
关于gomobile bind的Go版本依赖
是的,gomobile工具默认会使用自身捆绑的Go版本,而非你本地修改的GOROOT/GOPATH中的版本,这就是你修改本地源码后问题仍未解决的核心原因。你可以通过执行gomobile env命令,查看输出中的GOROOT字段,确认gomobile实际使用的Go环境路径——这个路径通常和你本地修改的路径不一致。
更优解决办法
- 替换gomobile捆绑的Go源码
通过gomobile env获取到gomobile自带的Go根目录后,将你修改后的Go源码文件(比如涉及net.InterfaceAddrs()实现的src/net/interface_linux.go等相关文件)替换到对应位置,然后重新编译gomobile工具,确保它使用修改后的代码构建移动绑定。 - 采用Android原生API替代
绕过Go标准库的net.InterfaceAddrs(),直接在Android端编写获取网络接口地址的原生代码,再通过Go与Android的绑定层传递数据。这种方式完全避开了Go标准库在高版本Android上的权限限制,是更稳定的长期解决方案。 - 临时权限缓解(仅测试用)
若仅用于临时测试,可在AndroidManifest.xml中添加android.permission.ACCESS_NETWORK_STATE和android.permission.INTERNET权限,但注意Android 10+对隐私权限的限制严格,即使添加权限,部分场景下仍会触发报错,不推荐作为正式解决方案。 - 升级到含修复的Go版本
确认该兼容性问题是否已在Go的正式版本或beta/rc版本中被修复,若已有修复,升级gomobile工具使其使用包含该修复的Go版本。
内容的提问来源于stack exchange,提问作者Lovish Puri
相关产品推荐
相关产品推荐

