安卓模拟实现 iOS 的动态联网权限

2021-05-20 00:26:52 +08:00
 cache

https://play.google.com/store/apps/details?id=com.cloudmonad.fw

前情提要: Android 为什么不和 iOS 一样需要用户动态确认联网权限

研究了一通后,决定自己写一个,和一众类似 App 一样,用的是 VPN 实现,底层用 Rust 实现,UI 用 Flutter 。

原理: 创建 Vpn 服务拦截网络流量,根据 socket 识别对应 App,弹出对话框让用户确认授权。

Vpn 部分是从另一个 rust 项目搬过来的,主要工作量在调 Flutter UI,特别是那个弹出对话框,一开始单独实现成一个 FlutterActivity,但每次弹出时需要几秒加载,尝试缓存对应 FlutterEngine 未果。目前的实现是复用主界面的 FlutterActivity,用路由区分。实现了通知秒现,但如果用户此时在主程序设置界面会被打断。 不知是否有更好的方案

五一开发完备用机上跑了几个星期,还算稳定,顺便上了 Play Store,今天发现审核完了,也算是有自己 App 的人了:)

感兴趣的 tx 可以试用一下

注意事项:目前只在我自己的手机上测试过(小米 10 lite ) MIUI 12/Android 11,由于使用了 getConnectionOwnerUid 最低支持版本为 Api 29(Android 10 )

7441 次点击
所在节点    Android
40 条回复
Rxianbei
2021-05-20 01:18:28 +08:00
很棒的想法
yitingbai
2021-05-20 02:43:52 +08:00
意思是不是所有的网络流量都得经过你的 VPN 软件? 数据安全不能仅靠开发者的良心吧
murmur
2021-05-20 08:07:22 +08:00
安卓的联网权限不是动态控制的,但是可以全局控制啊,ios 也做不到按请求控制联网吧
john6lq
2021-05-20 08:40:34 +08:00
Windows 也没有,有空可以做一个
cache
2021-05-20 08:44:22 +08:00
@yitingbai
Android 9 以后已经强制 https 了,VPN 端只能看到连接,看不到数据内容

除非你给 root 权限或主动安装 CA 证书,才能 mitm 解密
cache
2021-05-20 08:45:54 +08:00
@john6lq
理论可以很方便支持,Rust 在 Windows 上已经是一等公民了
1041412569
2021-05-20 08:46:01 +08:00
感觉,这 APP 需要一个开关
cache
2021-05-20 08:49:09 +08:00
@murmur 目前的实现是按 App 控制,主要是为了简单和验证一下效果
ikas
2021-05-20 08:49:16 +08:00
之前一直在用 NetGuard,与你这个原理一样,后来换了 afwall,现在 lineageos18.1 自带控制了......
cache
2021-05-20 08:52:40 +08:00
@1041412569 哈哈,是的,后面加上
cache
2021-05-20 08:57:43 +08:00
@ikas 是的,afwall 需要 root 权限吧,看了一下好像是用的是 iptables

lineageos18.1 自带控制是怎么样的?
MIUI 也能设置控制 App 联网权限,但每次点开比较麻烦,而且很多系统 App 不能设置
sephinh
2021-05-20 09:01:38 +08:00
Android 自带不是就能分别控制移动网络和 Wi-Fi 的接入了吗
ikas
2021-05-20 09:04:14 +08:00
@cache lineageos18.1 也是加了几个开关,1.控制联网 2.控制 wifi 3.data 不过也不没有动态提示了
AoEiuV020
2021-05-20 09:18:54 +08:00
卵用,只会导致 bug,开发者不可能去适配你的确认授权,只会默认一启动就有网,
cache
2021-05-20 09:23:06 +08:00
@AoEiuV020 这是 App 不是 SDK,只需要用户授权
hs0000t
2021-05-20 09:24:04 +08:00
类似于火绒的联网控制?
cache
2021-05-20 09:34:38 +08:00
@hs0000t 具体效果就是 App 第一次联网时,弹出对话框,需用户授权,否则无法联网
AoEiuV020
2021-05-20 09:36:38 +08:00
@cache 我意思是,ios 开发时就必须考虑 app 首次启动用户授权前没有网络的情况,针对这种情况做一些处理,必要时一些请求失败要等授权后重试,安卓开发者不会考虑这个,以为有网却没网就可能导致 bug,
Cavolo
2021-05-20 09:43:50 +08:00
iOS 我求求不要有这功能
HannibaI
2021-05-20 09:49:35 +08:00
@Cavolo 不要买国行就可以了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/778021

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX