Android环境下自定义Netlink协议编译为.so供APK调用时bind报错的排查与解决咨询
Android环境下自定义Netlink协议编译为.so供APK调用时bind报错的排查与解决咨询
各位好,我最近在开发一个功能:通过自定义Netlink协议在用户态程序中接收内核消息,比如获取DP接口的插拔状态以及连接设备的相关信息。目前碰到了一个棘手的问题,想和大家交流下排查思路和解决办法:
问题现象
- 当用户态代码编译成独立可执行文件时,直接在Android设备上运行完全正常,能稳定接收内核发来的消息(内核侧的自定义Netlink协议注册已经完成,这一点是确认无误的)。
- 但把完全相同的用户态代码编译成**.so共享库**,让APK调用时,在
bind()步骤会抛出错误:bind error: Operation not permitted。
我还特意对比了标准Netlink协议和自定义协议的表现差异:
标准协议(NETLINK_ROUTE)场景
不管是独立可执行文件,还是编译成.so被APK调用,以下代码都能正常执行,bind()没有任何报错:
struct sockaddr_nl sa; memset(&sa, 0, sizeof(sa)); sa.nl_family = PF_NETLINK; sa.nl_groups = 1; fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); bind(fd, (struct sockaddr *) &sa, sizeof(sa));
自定义协议(NETLINK_TEST)场景
- 独立可执行文件运行:全程无错误,功能正常
- .so被APK调用:
bind()失败,报错Operation not permitted
对应代码如下:
struct sockaddr_nl sa; memset(&sa, 0, sizeof(sa)); sa.nl_family = PF_NETLINK; sa.nl_groups = 1; fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_TEST); bind(fd, (struct sockaddr *) &sa, sizeof(sa));
已尝试的排查动作
- 最初阶段连
socket()创建都会报错,后来执行adb shell setenforce 0关闭SELinux后,创建socket的问题解决了,但bind()的错误依然存在。 - 我尝试将APK编译为priv-app并进行系统签名,还为这个特权应用添加了
LOCAL_MAC_ADDRESS权限,但bind()的报错还是没有消失。
我的疑问
- 是不是自定义Netlink协议不能直接编译成.so供APK调用?毕竟.so本身没有独立进程,会不会是权限上下文的问题?
- 针对这个问题,还有哪些可以尝试的排查方向和解决方法?另外我了解到从Android 11开始,应用被禁止在NETLINK_ROUTE套接字上使用
bind(),但我目标SDK设为32时,标准协议的bind()却能正常工作,这点也让我有点困惑。
内容来源于stack exchange
相关产品推荐
相关产品推荐

