软件开发者如何保护自己的知识产权?
最近一个关于开源软件的知识产权纠纷的案例,非常有代表性,
其中涉及到的平台openwrt,一口君十几年前曾玩过,
通过这个案例,我们可以学习如何在今后工作中保护自己的知识产权,
以及如何合理直接或者间接利用别人的“成果”而不侵权,
一口君觉得非常有必要分享出来,让大家多了解知识产权的知识。
一、关于本案
1. 案子概述
通过下面鱼骨图,简单说一下这个案子的来龙去脉:

总结起来就是:
- 苏州公司基于openwrt开发了网关产品,但是用一种方法绕开GPLv2限制,
- 浙江通信公司通过苏州公司离职的两个核心员工抄袭了苏州公司的代码
- 法院二审裁定,苏州公司上层功能软件构成GPLv2协议项下“独立且分离的”,裁定浙江通信公司侵犯苏州公司软件著作权


2. 本案的核心:
本案争辩的核心主要两点:
浙江某通信科技有限公司等被诉侵权人基于GPLv2协议提出的不侵权抗辩是否成立?
软件开发者自身存在一定程度上的违反GPLv2协议,是否就一定不享有新研发软件著作权?
要想整明白这个问题,我们必须要搞懂GPL、Openwrt、软件著作权是什么。
二、什么是GPL?
关于GPL,一口君下面文章,做了详细讲述,大家可以回顾一下。
《GPL前世今生》

GPL许可协议(GNU General Public License):只要软件中包含有其他GPL协议的产品或代码,那么该软件就必须也采用GPL许可协议且开源及免费。
具有以下特点:
- 复制自由:
允许将软件复制到任何人的电脑中,并且不限制复制的数量。 - 传播自由:
允许以各种形式进行传播。 - 收费传播:
允许在各种媒介上出售该软件,但必需提前让买家知道这个软件是可以免费获得的,并解释收费的理由(一般来讲都是能够为用户提供某种服务,以技术服务的形式来收费)。 - 修改自由:
允许开发人员增加或删除软件的功能,但必须依然基于GPL许可协议授权。
总结成一句话,修改后必须以GPL授权开源发布。
只要在代码中加入这个名叫GPL的许可证,你就能保证软件的用户能够自由地运行、研究、分享和修改你的代码了。
而且,从你的软件衍生出的一切修改版本,都必须遵守这个许可协议。
一个有意思的地方是,拥有代码的人有权利用代码开发软件并盈利。
但是,在有人花钱买走软件之后,这个人可以随意把买到的软件分享给其他人,而不必担心侵权,甚至是被告上法庭——因为对于遵守开源协议的软件来说,压根不存在“盗版”的概念。
由此可见,开源协议大大地提高了软件使用者的权利。
除了GPL之外还有很多其他协议,见下图:

三、什么是openwrt?
1. openwrt基础知识
OpenWrt 是一个基于 Linux 的、针对嵌入式网络设备的开源操作系统。它主要用于替代各种家用路由器上的原始固件。

Linux我们知道,他是目前最著名的遵循GPL协议的开源软件。
所以openwrt也是开源的。

OpenWrt 具备一个好的路由器应该具备的所有有用功能:
如 DNS 服务器(dnsmasq),WiFi 接入点(AP)和客户端功能,用于调制解调器功能的 PPP 协议,还支持webserver。
而且,与标准固件不同,这一切都是可以完全配置的。
正式因为openwrt集成了这么多和网络息息相关的功能模块,
所以基于openwrt,可以很方便的开发和迭代出新的网络产品,
我们市面见到的很多无线通信产品,比如:家用路由器、无线AP等都是基于openwrt开发的。


本案中的苏州网络公司,他们所开发的源码正是基于openwrt开发的。
官网地址:
https://openwrt.org/
2. openwrt当年被迫开源
网络产品设备商的扛把子Cisco/Linksys(思科) 在 2003 年发布了 WRT54G 这款无线路由器。

同年有人发现它的操作系统是基于Linux的,然而 Linux 是基于GPL许可证发布的,按照该许可证 Cisco 应该把 WRT54G 的源代码公开。
2003年3月,Cisco 迫于公众压力公开了 WRT54G 的源代码。
此后就有了一些基于 Cisco 源码的第三方路由器固件,OpenWrt 就是其中的一个。
那么既然openwrt是开源的,根据gpl协议规定,
苏州公司的软件产品《OfficeTen》应该也是开源的才对,
那么为什么最终法院裁定浙江通信公司侵权了呢?
我们只需要搞清楚,安卓如何绕开GPL,就明白了。
四、安卓如何规避GPL的?
Android内核也是Linux,那他是如何规避GPL的?
下图是一个完整的Android软件系统所用到的所有协议分布。

图片与Android关系最为密切的主要包括两个方面:驱动和glibc
1. glibc
glibc是linux上的主流的c运行时库,几乎每个linux程序都会简介的依赖c运行时库。
由于glibc是gpl授权的,因此如果采用glibc作为crt,按照前述问题的第二条,这些程序必须开源。
因此安卓采用bionic作为c运行时库替代glibc来规避gpl
2. 驱动
再说驱动,Android是基于Linux 内核开发的,Linux内核是GPL授权。
传统的驱动是要作为内核模块被加入到内核中的。
而内核模块属于Linux内核的衍生产品,需要遵守GPL协议开源发布。
Android是由开放手机联盟共同完成的,为了保护联盟中手机生产商的利益,驱动不能被完全开源。
因此安卓引入HAL,给linux内核开了个后门,增加了一些系统调用。
HAL在内核的部分按照GPL的要求开源。
驱动开发者可以在用户态使用这些新增的系统调用完成驱动的开发。
从而在驱动方面规避了GPL。
3. 详细说明:
Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。
也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space), 其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。
为什么要这样安排呢?
把硬件抽象层和内核驱动整合在一起放在内核空间不可行吗?
从技术实现的角度来看,是可以的,然而从商业的角度来看,把对硬件的支持逻辑都放在内核空间,可能会损害厂家的利益。
我们知道,Linux内核源代码版权遵循GNU License,而Android源代码版权遵循Apache License,前者在发布产品时,必须公布源代码,而后者无须发布源代码。
如果把对硬件支持的所有代码都放在Linux驱动层,那就意味着发布时要公开驱动程序的源代码,而公开源代码就意味着把硬件的相关参数和实现都公开了,在手机市场竞争激烈的今天,这对厂家来说,损害是非常大的。
因此,Android才会想到把对硬件的支持分成硬件抽象层和内核驱动层,
- 内核驱动层只提供简单的访问硬件逻辑,
例如读写硬件寄存器的通道, - 硬件抽象层负责硬件对应寄存器的读写操作,这样就可以把商业秘密隐藏起来了。
也正是由于这个分层的原因,Android被踢出了Linux内核主线代码树中。
大家想想,Android放在内核空间的驱动程序对硬件的支持是不完整的,把Linux内核移植到别的机器上去时,由于缺乏硬件抽象层的支持,硬件就完全不能用了,这也是为什么说Android是开放系统而不是开源系统的原因。
4. 苏州公司如何绕开GPLv2的?
具体到本案,苏州某网络科技有限公司研发的“OfficeTen”软件是以OpenWRT系统软件(OpenWRT系统软件是开源软件,适用的许可证协议为GPLv2协议)为基础经二次开发形成的衍生软件,
具体可分为两个部分:
- 一部分是对OpenWRT系统软件所对应源代码进行增删、修改、调整而形成的涉案软件底层系统(以下简称底层系统软件),
- 另一部分则是与涉案软件具体功能相对应的新增源代码形成的上层功能软件(以下简称上层功能软件)。
苏州某网络科技有限公司声称其在底层系统软件与上层功能软件之间采用套接字(socket)与命令行(command line)等技术手段建立了隔离层,
且二者之间通信内容不涉及内部数据结构信息,由此使得上层功能软件构成GPLv2协议项下“独立且分离的”的程序。
最高法院知产法庭在二审判决中认定,苏州某网络科技有限公司投资研发的名称为“OfficeTen”的网关产品系统软件,投入了大量成本,
涉案软件具有独创性且可以复制,构成著作权法项下的作品,依法应当获得保护。
他人未经苏州某网络科技有限公司许可,不得擅自复制、修改、发行涉案软件,否则将构成侵害涉案软件著作权的违法行为。
合议庭依在案证据认定关联网络公司在开发被诉软件过程中复制并修改了苏州某网络科技有限公司涉案软件的源代码;认定浙江某通信科技有限公司实施了销售被诉软件的行为。
认定该复制、修改、发行行为均未经苏州某网络科技有限公司许可,侵害了其享有的涉案软件著作权。
五、软件著作权
本案中,法院最终保护的是苏州公司的软件著作权,所以什么是软件著作权?
1. 什么是软件著作权?
软件著作权是指由权利人根据法律规定享有的,他人不可侵犯的民事权利。
软件著作权保护是对计算机程序和文档两部分的保护。
软件著作权保护不延及开发软件所用的思想、处理过程、操作方法或者数学概念。
《计算机软件保护条例》
第二条
本条例所称计算机软件(以下简称软件),是指计算机程序及其有关文档。
第三条
本条例下列用语的含义:
(一)计算机程序,是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。同一计算机程序的源程序和目标程序为同一作品。
(二)文档,是指用来描述程序的内容、组成、设计、功能规格、开发情况、测试结果及使用方法的文字资料和图表等,如程序设计说明书、流程图、用户手册等。
2. 在我国软件著作权登记有什么意义?
-
1、享受国家优惠政策:
办理软件著作权登记的企业可享受国家各种优惠政策,包括投融资、税收、出口政策等,具体可参见国务院18号文件; -
2、“双软认定”的前提:
软件著作权登记是企业办理“双软认定”(软件产品登记、软件企业认定)的必要前提。信息产业部的《软件产品登记管理办法》的第七条第四款规定,软件登记时要提交知识产权证明。此知识产权证明即指《软件著作权登记证书》; -
3、可作为技术出资入股:
《关于以高新技术成果出资入股若干问题的规定》规定:“计算机软件可以作为高新技术出资入股,而且作价的比例可以突破公司法20%的限制达到35%。”甚至有的地方政府规定“可以100%的软件技术作为出资入股”,但都要求必须首先办理软件著作权登记; -
4、申请科技成果的依据:科学技术部关于印发《科技成果登记办法》的通知第八条规定:“办理科技成果登记应当提交《科技成果登记表》及下列材料:
(一)应用技术成果:相关的评价证明(鉴定证书或者鉴定报告、科技计划项目验收报告、行业准入证明、新产品证书等)和研制报告;(二)知识产权证明(专利证书、植物品种权证书、软件登记证书等)和用户证明”。这里的软件登记证书指的是软件著作权登记证书和软件产品登记证书。其他部委也有类似规定;
-
5、企业破产后的有形收益:
软件著作权作为企业的“无形资产”,不会随企业的破产而消失。企业破产后,无形资产的生命力和价值仍然存在,可以在转让和拍卖中获取有形资金; -
6、予以重点保护:
计算机软件著作权登记是我国著作权法规所规定的对计算机软件著作权保护的一项行政辅助管理措施,《计算机软件著作权登记办法》第二条和国务院18号文件均有规定,国家著作权行政管理部门鼓励著作权人进行计算机软件著作权登记,并对已登记的软件给予重点保护。
六、对科技企业的警示
- 有知识产权保护意识
作为企业负责人或者软件开发管理者,一定要有知识产权保护意识,
开发的软件要及时申请软件著作权,
对于一些有创新的产品还要及时申请专利,
- license授权
软件最大的问题就是复制性,
通过license授权可以在一定程度上保护自己的软件产品。
详情大家可以参考下面文章:
《软件License授权原理》
- 对于技术人员的管理
技术人员的是企业的核心竞争力,
企业要想做走的更长远、提升产品竞争力,
主要依靠的就是研发,
平时要注重技术人的培训和提升,
保持研发团队人员的稳定,
尤其是核心技术人员,
核心技术人员的流失对企业会有致命的伤害,
一旦加入竞争对手的公司,
后果不堪设想。
- 关键岗位签署竞业协议
对于一些非常重要得岗位,
要与员工签署竞业协议,
最大程度上保护自己。
相关文章:
软件开发者如何保护自己的知识产权?
最近一个关于开源软件的知识产权纠纷的案例,非常有代表性, 其中涉及到的平台openwrt,一口君十几年前曾玩过, 通过这个案例,我们可以学习如何在今后工作中保护自己的知识产权, 以及如何合理直接或者间接利…...
Promise魔鬼面试题
文章目录 题目解析难点分析分析输出step1step2step3step4step5step6 参考/致谢:渡一袁老师 题目 Promise.resolve().then(() > {console.log(0);return Promise.resolve(4);}).then((res) > {console.log(res);});Promise.resolve().then(() > {console.l…...
Vue3+Nuxt3 从0到1搭建官网项目(SEO搜索、中英文切换、图片懒加载)
Vue2Nuxt2 从 0 到1 搭建官网~ Vue3Nuxt3 从0到1搭建官网项目 安装 Nuxt3,创建项目初始化的 package.json项目结构初始化项目pages 文件下创建index.vue引入sass修改 app.vue 文件查看效果 配置公共的css、metaassets下的cssreset.scss 重置文件common.scss 配置nux…...
面试经典150题——三数之和
面试经典150题 day29 题目来源我的题解方法一 暴力解法 超时方法二 扩展两数之和(双指针)方法三 扩展为通用的n数之和 题目来源 力扣每日一题;题序:15 我的题解 方法一 暴力解法 超时 进行三重循环遍历,判断和是否为…...
go动态创建/增加channel并处理数据
背景描述 有一个需求,大概可以描述为:有多个websocket连接,因此消息会并发地发送过来,这些消息中有一个标志可以表明是哪个连接发来的消息,但只有收到消息后才能建立channel或写入已有channel,在收消息前无…...
asp.net成绩查询系统
说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术: 基于asp.net架构和sql server数据库 功能模块: asp.net成绩查询系统 学生功能有查看成绩和修改账号密码等 后台管理员可以进行用户管理 管理员添加管理员查询注…...
Express路由
什么是路由 官方定义:路由确定了应用程序如何响应客户端对特定端点的请求。 路由的使用 一个路由的组成有 请求方法、路径 和 回调函数 组成。 Express中提供了一些列方法,可以很方便的使用路由,使用格式如下: app.<metho…...
在做题中学习(53): 寻找旋转数组中的最小值
153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode) 解法:O(logn)->很可能就是二分查找 思路:再看看题目要求,可以画出旋转之后数组中元素的大小关系: 首先,数组是具有二段性的(适配二分查…...
C#语言进阶(三) 元组
总目录 C# 语法总目录 元组目录 元组1. 元组元素命名2. 元组的解构3. 元组的比较 元组 元组(tuple)是一组存储值的便捷方式。 元组的目的主要是,不使用out参数而从方法中返回多个值。(匿名类型无法做这个操作)元组能做匿名类型所有操作。 元组是值类型࿰…...
实用的Chrome 浏览器命令
Google Chrome 浏览器提供了许多快捷命令和实用功能,可以帮助用户提高效率和改善浏览体验。这里列举了一些非常实用的Chrome浏览器命令: 1. **CtrlT** / **CmdT** - 打开一个新的标签页。 2. **CtrlShiftT** / **CmdShiftT** - 重新打开最后关闭的标签页…...
IDEA远程连接docker服务,windows版docker desktop
1.windows上安装docker desktop docker desktop下载地址:Docker Desktop: The #1 Containerization Tool for Developers | Docker 有的windows系统不支持安装docker desktop 安装完之后我们可以直接打开,可以选择不登录使用 我们用IDEA连接到docker …...
Rust 和 Go 哪个更好?
在讨论 Rust 与 Go 两种编程语言哪种更优秀时,我们将探讨它们在性能、简易性、安全性、功能、规模和并发处理等方面的比较。同时,我们看看它们有什么共同点和根本的差异。现在就来看看这个友好而公平的对比。 Rust 和 Go 都是优秀的选择 首先ÿ…...
【免费Java系列】大家好 ,今天是学习面向对象高级的第八天点赞收藏关注,持续更新作品 !
这是java进阶课面向对象第一天的课程可以坐传送去学习http://t.csdnimg.cn/Lq3io day08-Map集合、Stream流、File类 一、Map集合 同学们,在前面几节课我们已经学习了Map集合的常用方法,以及遍历方式。 下面我们要学习的是Map接口下面的是三个实现类H…...
RPC 失败。curl 16 Error in the HTTP2 framing layer
报错: (base) hh-virtual-machine:~/work$ git clone https://github.com/yangzongzhuan/RuoYi-Vue3.git 正克隆到 RuoYi-Vue3... error: RPC 失败。curl 16 Error in the HTTP2 framing layer fatal: 在引用列表之后应该有一个 flush 包这个错误通常是由于 Git 在…...
(图论)最短路问题合集(包含C,C++,Java,Python,Go)
不存在负权边: 1.朴素dijkstra算法 原题: 思路:(依然是贪心的思想) 1.初始化距离:dis[1]0,dis[i]INF(正无穷) 2.循环n次: 找到当前不在s中的dis最小的点&…...
电脑文件批量重命名不求人:快速操作,高效技巧让你轻松搞定
在数字化时代,电脑文件的管理与整理显得尤为重要。当面对大量需要重命名的文件时,一个个手动修改不仅耗时,还容易出错。那么,有没有一种方法可以快速、高效地完成这一任务呢?答案是肯定的,下面就来介绍几种…...
基于springboot的网上点餐系统源码数据库
基于springboot的网上点餐系统源码数据库 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于网上点餐系统当然也不能排除在外,随着网络技术的不断成熟,带动了网上点餐系统…...
mysql cluster数据库集群介绍、部署及配置
前言: MySQL集群是一个无共享的、分布式节点架构的存储方案,旨在提供容错性和高性能。它由三个主要节点组成:管理节点(MGM)、数据节点和SQL节点。 管理节点(MGM) 定义与用途:管理节点是MySQL Cluster的控制中心,负责管理集群内的其他节点。它提供配置数据,启动和停止…...
uniapp的app端软件更新弹框
1:使用html PLUS实现:地址HTML5 API Reference (html5plus.org),效果图 2:在app.vue的onLaunch生命周期中,代码如下: onLaunch: function() {let a 0let view new plus.nativeObj.View(maskView, {backg…...
win11 Terminal 部分窗口美化
需求及分析:因为在 cmd、anaconda prompt 窗口中输入命令较多,而命令输入行和输出结果都是同一个颜色,不易阅读,故将需求定性为「美化窗口」。 美化结束后,我在想是否能不安装任何软件,简单地通过调整主题颜…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
