AVC Denied 错误为 Android Instant App 创建 DatagramSocket

问题描述

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

举个简单的例子,我可以在 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,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 可以在免安装应用中打开吗?

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...