首页 > 解决方案 > AVC 拒绝为 Android Instant App 创建 DatagramSocket 错误

问题描述

我有一个使用 UDP 套接字传输数据的 Android 应用程序,它运行良好,但是当作为即时应用程序运行时,我无法让该部分工作。

作为一个简单的示例,我可以在 Android 应用程序(目标 SDK 29)上创建一个 DatagramSocket 而不会出错。

DatagramSocket datagramSocket = null;
try {
        datagramSocket = new DatagramSocket();
        Log.i(TAG, "Created datagramSocket: "+datagramSocket);
} catch (SocketException e1) {
        // TODO Auto-generated catch block
        Log.w(TAG, "Failed to create datagram socket: "+e1);
        e1.printStackTrace();
}

我看到一个肯定的确认套接字已创建:

Created datagramSocket: java.net.DatagramSocket@f0bee5c

如果我重新运行与 Instant App 相同的代码,那么在创建套接字时会出现错误。

Failed to create datagram socket: java.net.BindException: bind failed: EACCES (Permission denied)
W/System.err: java.net.BindException: bind failed: EACCES (Permission denied)
W/System.err:     at libcore.io.IoBridge.bind(IoBridge.java:108)
W/System.err:     at java.net.PlainDatagramSocketImpl.bind0(PlainDatagramSocketImpl.java:104)
W/System.err:     at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:112)
W/System.err:     at java.net.DatagramSocket.bind(DatagramSocket.java:412)
W/System.err:     at java.net.DatagramSocket.<init>(DatagramSocket.java:262)
W/System.err:     at java.net.DatagramSocket.<init>(DatagramSocket.java:216)
....
type=1400 audit(0.0:106855): avc: denied { node_bind } for scontext=u:r:ephemeral_app:s0:c47,c257,c512,c768 tcontext=u:object_r:node:s0 tclass=udp_socket permissive=0 app=xxxx
....
W/System.err: Caused by: android.system.ErrnoException: bind failed: EACCES (Permission denied)
W/System.err:     at libcore.io.Linux.bind(Native Method)
W/System.err:     at libcore.io.ForwardingOs.bind(ForwardingOs.java:74)
W/System.err:     at libcore.io.ForwardingOs.bind(ForwardingOs.java:74)
W/System.err:     at libcore.io.IoBridge.bind(IoBridge.java:104)
W/System.err:   ... 22 more

应用程序和免安装应用程序都具有相同的权限,包括 INTERNET 权限。我们的 HTTPS API 服务器上的请求适用于应用程序和即时应用程序。

重要的部分似乎是 selinux 错误:

type=1400 audit(0.0:106855): avc: denied { node_bind } for scontext=u:r:ephemeral_app:s0:c47,c257,c512,c768 tcontext=u:object_r:node:s0 tclass=udp_socket permissive=0 app=xxxx

我认为 avc 行可能引用了https://android.googlesource.com/platform/system/sepolicy/+/refs/heads/master/prebuilts/api/29.0/public/net.te

# Bind to ports.
allow {netdomain -ephemeral_app} node_type:{ icmp_socket rawip_socket tcp_socket udp_socket } node_bind;
allow {netdomain -ephemeral_app} port_type:udp_socket name_bind;
allow {netdomain -ephemeral_app} port_type:tcp_socket name_bind;

可以在即时应用程序中打开 DatagramSockets 吗?

我们在支持 iOS 的 AppClips 时遇到了类似的问题,不得不切换到使用 Apple 网络框架。Android Instant Apps 是否也有相关修复?

标签: androidnetworkingudpselinuxandroid-instant-apps

解决方案


推荐阅读