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

某 v2er 做的 App 代码关键部分可能不是基于 LocalSend 改的

  •  
  •   othercat · 3 天前 · 1505 次点击

    起因是看到 这个帖子 https://v2ex.com/t/1052120

    然后我好奇做了一些事情 (之前用的图是 Dropbox 但是 V2EX 可能不支持,现在换成 imgur 的)

    即把原作者 @LuLiangDev 的 Airclap v1.2.0 的 Frameworks 替换掉了 手头 v1.14.0 的 LocalSend

    这样显示效果是被我吐槽是一个 Airclap v1.14.0

    但是考虑到 Flutter 架构其实就是方便前端 UI 替换,所以根本考虑是否基于 LocalSend 修改还是要看行为

    例如原作者 在 https://v2ex.com/t/1051102 提到

    基于 SSDP 深度定制发现协议和 P2P 安全传输协议,利用多链路传输技术,保证数据不丢包, 安全稳定并且高速传输
    

    所以和朋友一起研究了一下

    首先先确保 LocalSend 的发现协议是基于 https://github.com/localsend/protocol 所说的私有协议

    The default multicast group is 224.0.0.0/24 because some Android devices reject any other multicast group.
    
    Multicast (UDP)
    
        Port: 53317
        Address: 224.0.0.167
    

    那么通过 WireShark 抓包的确能看到是这样的

    那么我们替换之后的新 Airclap v1.2.0 到底是和 LocalSend 一致,还是和作者所说的一致呢?

    通过抓包发现

    因为 SSDP 一般使用多播地址 239.255.255.250 和 UDP 端口号 1900 ,所以可以认为作者说的符合他自己的描述

    后续就不用特别研究了,因为至少目前为止,Airclap 表现的行为,和作者在发布的描述是一致的,而且的确是和 LocalSend 区别很大的

    所以可以认为,@LuLiangDev 的 Airclap ,代码关键部分可能不是基于 LocalSend 改的。

    以上。

    17 条回复    2024-06-27 01:49:04 +08:00
    Goooooos
        1
    Goooooos  
       3 天前
    人们更愿意相信自己认为的,所以你这贴没啥用,只有作者完全开放源代码,就像电影《让子弹飞》里的老六为了证明自己只吃了一碗凉粉。
    但作为一个付费 APP ,作者肯定不会开放源码。
    othercat
        2
    othercat  
    OP
       3 天前
    @Goooooos 所以我只是说关键代码不是基于 LocalSend 修改,因为协议层实现比 UI 还是要复杂得多(当然不一定比 LocalSend 更优雅或者安全)

    我相信通过替换 Framework 可以直接使用,应该是有借鉴 Flutter 层面相关代码的,但是由于关键功能的协议层自己有实现,因此作者认为自己没有抄袭可能也有他自己的道理。
    w568w
        3
    w568w  
       3 天前   ❤️ 2
    大家关心的问题不在于「抄没抄」,而是「遵没遵守协议」。不要打烟雾弹。

    LocalSend 使用的 MIT 协议本来就是允许抄、欢迎抄的。退一万步说,就算他抄了,抄袭不可耻,闭源也不可耻,盈利更没有违反任何协议,完全是他的营销本事。

    现在的关键是:他是否基于 LocalSend 代码二次开发,以及是否履行 MIT 协议。

    其项目源代码结构被逆向工程发现和 LocalSend 的目录结构、文件名完全一致,这基本确定是基于 LocalSend 源代码。然而其三番五次声称自己和 LocalSend 「没有任何关系」,也没有看到任何协议标注和版权署名,这才是问题所在。

    至于核心代码如何变化,我想这并非目前的重点。SSDP Flutter 方面的库也很多很成熟了,LocalSend 的 Provider 架构写得很好,加个协议只是复制粘贴的时间。
    w568w
        4
    w568w  
       3 天前
    @w568w 注:第一句没有说楼主故意混淆视听的意思。
    othercat
        5
    othercat  
    OP
       3 天前
    @w568w 没有打烟雾弹,只是描述一个事实。因为 Flutter UI 实在太好替换和借鉴,而 LocalSend 的代码结构说实话因为写的太规范,所以也可以认为有规范的人都可以写的相似。

    目录结构现在我只看到大家借鉴的是主程序部分,但是主程序说老实话,只有 UI ,因为协议层都不在这里。

    因此这部分我仔细看了一下引用的几个核心网络层面 Framework 的实现,其实有很多和 LocalSend 引用的不同,当然因为闭源很难证明,我也没精力和兴趣去证明。

    我只想表达,协议层面自己造轮子实现,如果用 LocalSend 的代码二次开发,可能会更痛苦。
    othercat
        6
    othercat  
    OP
       3 天前
    @w568w 补充一点我自己个人的猜测,仅仅是猜测:

    作者是基于 LocalSend 的代码结构还有设计思路,自己修改了 UI ,同时自己实现了他描述当中的核心功能协议替换。

    另外大家逆向的看到的主要还是基于 Flutter 打包的结构,这个结构可能写的规范的人都差不多,很难证明什么。
    w568w
        7
    w568w  
       3 天前
    @othercat #5

    > 认为有规范的人都可以写的相似

    所有文件名都相似的概率太低了。我是 Flutter 开发者,我很清楚至少在列出的那些文件名上,并没有听说过什么「规范」。

    > 主程序说老实话,只有 UI ,因为协议层都不在这里

    协议层可以就在这里。请不要把 Flutter 当成 HTML 那样的前端标记语言,它没有什么「主程序」、「前端」、「后端」的概念,编写一个操作系统模拟器都不在话下,实现一个网络协议还是非常容易的。

    例如,LocalSend 的协议实现就是纯 Dart 编写的。

    > 协议层面自己造轮子实现,如果用 LocalSend 的代码二次开发

    「二次开发」的意思你可能弄错了。并不是必须全部代码照搬,自己一行都不写,然后改两行加上「 VIP 充值」按钮才叫「二次开发」,理论上借鉴(即:再演绎)任何代码全都是「二次开发」。既然是二次开发,就必须遵守协议。

    再强调一次:关心的重点不是「抄不抄袭」,抄袭本来就是一个感情用事的词语。
    body007
        8
    body007  
       3 天前
    @othercat #6 作者是真不怕影响销量,也不出来说两句。结果我们一群吃瓜群众来回拉扯,这样一闹,知道的或以前不知道的都要去用 localsend 咯
    othercat
        9
    othercat  
    OP
       3 天前
    @w568w

    > 例如,LocalSend 的协议实现就是纯 Dart 编写的。

    是啊,都能看到 LocalSend 的协议实现是纯 Dart 编写了,其实也可以大概判断出如果不用这些协议,使用其他 SSDP 到底是自己造轮子方便,还是借鉴代码方便了吧。

    > 协议层可以就在这里。请不要把 Flutter 当成 HTML 那样的前端标记语言,它没有什么「主程序」、「前端」、「后端」的概念,编写一个操作系统模拟器都不在话下,实现一个网络协议还是非常容易的。

    我说的协议层指的是 cocoapods 包这些东西,核心在这里,而不是 LocalSend 代码。简单来说,我 WireShark 抓包的内容,并不在 LocalSend 主程序实现,而是在 cocoapods 里面实现的
    具体而言,可能是 https://github.com/localsend/localsend/blob/main/app/macos/Podfile.lock 这里面的

    ```
    Reachability
    network_info_plus
    connectivity_plus
    ```

    等等。

    如果这些东西两者调用实现都不同,而仅仅是中间层调用 API 相似,这。。。
    othercat
        10
    othercat  
    OP
       3 天前   ❤️ 1
    @body007 我个人看法:

    1. 代码结构和思路肯定是借鉴 LocalSend 的,多加一个 致敬声明 就没事了,但是自己觉得 UI 和协议都是我自己写的,我只是借鉴了思路和代码框架,为啥要声明,哈哈

    2. 具体协议层,就 macOS 上来说,LocalSend 自己用 Pod 的一些现成轮子组成的私有协议,和作者用另外一组 Pod 的的一些现成轮子组成的自己的另外的标准协议实现,后者算不算抄袭或借鉴,我觉得很难。

    3. 我个人来说,LocalSend ,除了在雷电 3 ,4 组雷雳网桥的性能极差(可能是一些变量没考虑 20Gbps 的传输带宽之外),其他层面 LocalSend 就够了。毕竟用一直用 SSDP 真的会比目前 LocalSend 这个协议耗电。
    othercat
        11
    othercat  
    OP
       3 天前
    上面说的 “但是自己觉得 UI 和协议都是我自己写的” -> ",但是作者肯定自己觉得 UI 和协议都是我自己写的"
    w568w
        12
    w568w  
       3 天前
    @othercat #9

    > 大概判断出如果不用这些协议,使用其他 SSDP 到底是自己造轮子方便,还是借鉴代码方便了吧

    你的逻辑我似乎没理解。要实现一个协议,除了「造轮子」和「借鉴代码」,还有一个选项是「调库」。我最后提的是调库最方便。

    另外,我再强调一次:这不是重点…… 以下讨论我们就按你的来,默认全部是他自己写的好了。

    > cocoapods 包这些东西,核心在这里

    核心多半不在这里,网络请求 API 在 Dart Runtime 本身就有,为什么要依赖三方库?

    > 在 cocoapods 里面实现的

    我对比了 LocalSend 和 AirClap 的依赖原生库(即你说的 cocapods 依赖库)。很遗憾,所有库我都用过,并没有哪个和 UDP 有特别的关系。你列出的几个都是获取平台信息的,比如 WiFi 名称、5G 情况、检查是否联网等。

    其次明确一点,这里不是他的依赖库列表,充其量是个子集。你可以再看看 Flutter packages 依赖进入打包的过程。
    Morii
        13
    Morii  
       3 天前
    他这个 UI 还挺好看的。
    othercat
        14
    othercat  
    OP
       3 天前
    @w568w 哎,我觉得重复回复人也累,哈哈, 参考我 10 楼的回复吧,就这样了。
    beimenjun
        15
    beimenjun  
       3 天前   ❤️ 2
    首先我觉得应该有个共识:

    1. 基于 localsend 开发,不代表就不能自己做修改了。

    2. 做了修改,不代表就不是基于 localsend 开发。

    脱离了这两点就没啥好讨论了。

    另外我的💢指责再说一遍:他这个 App 参考了很多 localsend 的代码(事实也是如此),稍微致谢里也该说一下吧?为什么还要撇清关系,好像完全没从这个开源项目获益一样。
    zagfai
        16
    zagfai  
       3 天前
    @othercat 我感觉 w568w 不是很懂,在装懂:)
    w568w
        17
    w568w  
       2 天前 via Android
    @zagfai 我是不是不懂装懂点进 github 个人主页就看到了,还是说必须是 flutter core dev 才能说话?

    有错请直接指出我的错误,阴阳怪气真的很没意思。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   980 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:45 · PVG 03:45 · LAX 12:45 · JFK 15:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.