问题描述
我有一个 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 (将#修改为@)