V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cache
V2EX  ›  Android

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

  •  
  •   cache · 2021-05-20 00:26:52 +08:00 · 11337 次点击
    这是一个创建于 1269 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 )

    第 1 条附言  ·  2021-05-20 09:20:20 +08:00
    没错,Android 系统也可以单独控制 App 的联网权限,但是
    1,麻烦 ,MIUI 12 上自带 app 有 300 多个,大部分默认开了联网权限。
    2,有一些系统 App 并不能手动设置联网权限,如 com.miui.analytics
    [如何评价 MIUI 的 AnalyticsCore 后门? - 知乎]( https://www.zhihu.com/question/50722052)
    40 条回复    2021-05-24 19:04:34 +08:00
    Rxianbei
        1
    Rxianbei  
       2021-05-20 01:18:28 +08:00 via Android
    很棒的想法
    yitingbai
        2
    yitingbai  
       2021-05-20 02:43:52 +08:00
    意思是不是所有的网络流量都得经过你的 VPN 软件? 数据安全不能仅靠开发者的良心吧
    murmur
        3
    murmur  
       2021-05-20 08:07:22 +08:00
    安卓的联网权限不是动态控制的,但是可以全局控制啊,ios 也做不到按请求控制联网吧
    john6lq
        4
    john6lq  
       2021-05-20 08:40:34 +08:00 via iPhone
    Windows 也没有,有空可以做一个
    cache
        5
    cache  
    OP
       2021-05-20 08:44:22 +08:00
    @yitingbai
    Android 9 以后已经强制 https 了,VPN 端只能看到连接,看不到数据内容

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

    lineageos18.1 自带控制是怎么样的?
    MIUI 也能设置控制 App 联网权限,但每次点开比较麻烦,而且很多系统 App 不能设置
    sephinh
        12
    sephinh  
       2021-05-20 09:01:38 +08:00 via iPhone
    Android 自带不是就能分别控制移动网络和 Wi-Fi 的接入了吗
    ikas
        13
    ikas  
       2021-05-20 09:04:14 +08:00
    @cache lineageos18.1 也是加了几个开关,1.控制联网 2.控制 wifi 3.data 不过也不没有动态提示了
    AoEiuV020
        14
    AoEiuV020  
       2021-05-20 09:18:54 +08:00
    卵用,只会导致 bug,开发者不可能去适配你的确认授权,只会默认一启动就有网,
    cache
        15
    cache  
    OP
       2021-05-20 09:23:06 +08:00
    @AoEiuV020 这是 App 不是 SDK,只需要用户授权
    hs0000t
        16
    hs0000t  
       2021-05-20 09:24:04 +08:00 via Android
    类似于火绒的联网控制?
    cache
        17
    cache  
    OP
       2021-05-20 09:34:38 +08:00
    @hs0000t 具体效果就是 App 第一次联网时,弹出对话框,需用户授权,否则无法联网
    AoEiuV020
        18
    AoEiuV020  
       2021-05-20 09:36:38 +08:00
    @cache 我意思是,ios 开发时就必须考虑 app 首次启动用户授权前没有网络的情况,针对这种情况做一些处理,必要时一些请求失败要等授权后重试,安卓开发者不会考虑这个,以为有网却没网就可能导致 bug,
    Cavolo
        19
    Cavolo  
       2021-05-20 09:43:50 +08:00 via iPhone
    iOS 我求求不要有这功能
    HannibaI
        20
    HannibaI  
       2021-05-20 09:49:35 +08:00
    @Cavolo 不要买国行就可以了
    treblex
        21
    treblex  
       2021-05-20 11:13:01 +08:00
    请问下楼主,rust 和 flutter 交互方便嘛
    之前尝试过 go mobile,流程应该是 build farmework,添加到原生项目里,然后再写 methodChannel,感觉不是特别方便
    robinchina
        22
    robinchina  
       2021-05-20 11:39:48 +08:00
    安卓不是可以单独设置程序网络权限么?
    ily433664
        23
    ily433664  
       2021-05-20 11:43:11 +08:00
    魅族 18 在 app 首次启动的时候就会让你授权是否允许联网
    yanyumihuang
        24
    yanyumihuang  
       2021-05-20 12:02:41 +08:00
    如何跟别的 vpn 共存呢?我记得 cfa 是支持用 process-name 匹配包名来进行路由的。
    yanyumihuang
        25
    yanyumihuang  
       2021-05-20 12:03:49 +08:00
    cfa 是指 clash for android
    cache
        26
    cache  
    OP
       2021-05-20 12:39:55 +08:00   ❤️ 1
    @treblex 非常棒,我已经爱上他们了,这也是我写这个 app 的最大动力


    @ily433664 魅族这个功能就是我想实现的,但和 MIUI 一样,他应该不会限制系统自己的网络吧,从保护隐私的角度,你的隐私最不希望被了解你的人知道,而系统是最了解你手机的人了,需要被重点盯住。


    @yanyumihuang
    无法和其他 vpn 共存,貌似可以通过工作空间多开 VPN,没有深入研究,这个 App 主打使用简单,不用配置。
    Thinkerous
        27
    Thinkerous  
       2021-05-20 13:45:45 +08:00
    ily433664
        28
    ily433664  
       2021-05-20 14:13:53 +08:00
    @cache 按照你这么说,既然我不相信手机厂商,为什么会相信你这个 app ?
    HangoX
        29
    HangoX  
       2021-05-20 14:16:19 +08:00
    因为 iOS 的联网控制只有国内版本才有,国外是没有的,换个想法就是这货应该是国内 rom 做了
    gggccc44
        30
    gggccc44  
       2021-05-20 14:21:34 +08:00
    Analytics 谷歌和苹果都有啊,话说国行 iPhone 这个请求联网功能简直了。。。
    q197
        31
    q197  
       2021-05-20 14:56:59 +08:00
    好像还有一种实现是基于 iptable,当然需要 root,好处是设置完后这个防火墙 app 关了也无所谓,坏处是重启失效需要 app 开机再次设置适配一下
    cache
        32
    cache  
    OP
       2021-05-20 15:16:59 +08:00
    @ily433664 只是举个栗子,第三方 App 没有你其他维度的信息,相对能力弱。 当然我相信魅族小米这样的大公司不会干太出格的事,但市面上还有大量其他小作坊公司。

    @gggccc44 是的,小米的 Analytics 应该不是后门,我测试了一下可以用 adb 删掉,但重启就装回来了。这种有点感觉像开发商把房子卖给你后,还留着你房间的钥匙,时不时来检查一下装修的怎么样,门安不安全。 也不通知一下。

    @q197 Android 7.0 以后有一个 Always-on VPN 功能,重启也能生效,Vpn 没有连上时还能断网,防止数据泄漏。
    Cloutain
        33
    Cloutain  
       2021-05-20 17:22:54 +08:00
    很不错哦
    woodensail
        34
    woodensail  
       2021-05-20 17:41:41 +08:00
    @ily433664 因为在现有的环境下,app 开发者没有能力做到中间人窃听。

    就如同我不信任微信,但是信任微信小程序开发团队不会窃取我的隐私。因为微信早就把所有和隐私的口子堵完了,小程序压根没能力碰到涉及隐私的内容。
    Veneris
        35
    Veneris  
       2021-05-20 17:50:35 +08:00
    那开了这个,岂不是没法开小飞机了
    ily433664
        36
    ily433664  
       2021-05-20 18:08:03 +08:00
    @woodensail 按照楼主的方式,这个 app 至少知道你访问了什么,如果你觉得这个不是隐私当就我没说
    woodensail
        37
    woodensail  
       2021-05-20 18:10:52 +08:00
    @ily433664 是啊,也仅此而已,不像系统本身,不仅能知道你访问了什么网站,还能知道你访问了什么内容,还能篡改你访问的内容。
    如果你觉得这两种没有区别就当我没说。
    823805669hehe
        38
    823805669hehe  
       2021-05-24 13:01:22 +08:00
    @cache 楼主,这个 APP 的源码有计划公开吗?否则不是自己构建的很难让人放心啊
    cache
        39
    cache  
    OP
       2021-05-24 16:06:01 +08:00
    @823805669hehe 暂时还没有,主要是核心部分代码是其他恰饭项目的

    你可以用 xprivacy 监控一下,除了启动 vpn 相关,没有调用任何其他 Android 系统接口,连存储权限都没有申请
    feifeichen
        40
    feifeichen  
       2021-05-24 19:04:34 +08:00
    试用了一下,发现会出现大部分 app 识别不到的情况会导致默认关网并且打不开。希望楼主可以优化下,挺好用的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   974 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:20 · PVG 06:20 · LAX 14:20 · JFK 17:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.