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

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

  •  
  •   cache · 198 天前 · 3638 次点击
    这是一个创建于 198 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 条附言  ·  198 天前
    没错,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  
       198 天前 via Android
    很棒的想法
    yitingbai
        2
    yitingbai  
       198 天前
    意思是不是所有的网络流量都得经过你的 VPN 软件? 数据安全不能仅靠开发者的良心吧
    murmur
        3
    murmur  
       198 天前
    安卓的联网权限不是动态控制的,但是可以全局控制啊,ios 也做不到按请求控制联网吧
    john6lq
        4
    john6lq  
       198 天前 via iPhone
    Windows 也没有,有空可以做一个
    cache
        5
    cache  
    OP
       198 天前
    @yitingbai
    Android 9 以后已经强制 https 了,VPN 端只能看到连接,看不到数据内容

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

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


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


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

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

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

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

    你可以用 xprivacy 监控一下,除了启动 vpn 相关,没有调用任何其他 Android 系统接口,连存储权限都没有申请
    feifeichen
        40
    feifeichen  
       193 天前
    试用了一下,发现会出现大部分 app 识别不到的情况会导致默认关网并且打不开。希望楼主可以优化下,挺好用的
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2152 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:18 · PVG 10:18 · LAX 18:18 · JFK 21:18
    ♥ Do have faith in what you're doing.