android - 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 是否也有相关修复?
解决方案
推荐阅读
- javascript - 如何标记搜索变得可拖动并在传单中给出经度和纬度
- pine-script - 编译两个指标(一个在第 3 版上,另一个在第 4 版上)
- git - 关于 git commit error: pathspec 'A' did not match any file(s) known to git
- ajax - 如何在数据表中使用 ajax 发送参数?
- angularjs - 未捕获的语法错误:使用“@babel/preset-env”时,无法在模块外使用 import 语句
- python - PyYaml 文档中的错误或遗漏(如何构造类)
- c# - 如何将字典结果绑定到类对象c#linq
- c# - MailKit.Net.Smtp.SmtpClient SMTP 服务器不支持身份验证
- c# - 是否可以选择将文件添加到 Visual Studio 中的项目?
- babeljs - 找不到模块'babel-plugin-r'