0x00 前言
本文主要目的是为了了解一些基础的GPL注意事项,以及防止被一些一知半解的人蒙骗。本文不做任何内容的依据,仅为个人见解,仅供参考。
一些常见的开源协议
- GPL
- BSD
- MIT
- Mozilla
- Apache
- LGPL
0x01 GPL
GPL许可协议(GNU General Public License):只要软件中包含有其他GPL协议的产品或代码,那么该软件就必须也采用GPL许可协议且开源及免费,这一点也就是所谓的传染性,创始人是理查德·马修·斯托曼。
中文翻译版地址:https://jxself.org/translations/gpl-2.zh.shtml
1. GPL历史版本
GPL 总共有三个版本,每一个版本之间是有区别的,大部分使用GPL开源软件都是使用GPL v2 的开源协议,比如openjdk
- GPLv1:1989年2月25日发布。
- GPLv2:1991年6月发布。
- GPLv3:2007年6月29日发布。
2.GPL特点
- 复制自由:允许软件复制到任何人的电脑中,并且不限制复制的数量
- 收费自由:允许以各种形式进行传播
- 传播自由:允许在各种媒介上出售改软件,但是买家知道这个软件是免费的获取的,并且解释收费的原因
- 修改自由:允许开发人员增加或删除软件的功能,但是必须基于GPL许可协议授权。
3. GPL的传染性
依据开源作品修改的开源软件(无论是否包含独立部分)视作不可分割的完整作品,在传输、分发这样的作品时,无论其中开源部分与独立部分是分开发布还是统一发布,这一发布后的作品整体均应遵守开源协议。
3.1 不同版本GPL的感染区别
GPL存在两个维度的感染,一个是横向,一个是纵向。纵向感染指的是直接在GPL源码中修改了内容,形成了一个新的GPL版本。
横向是指用了GPL开源代码的一部分,或者所有。
GPL v1:只要企业使用了GPL代码,那么所有这个整体都会感染,遵循GPL协议。
GPL v2:使用了GPL代码的部分以及衍生部分,都要被GPL协议感染,遵循GPL协议,但是除了衍生的或者使用的这一个部分,独立部分都不需要遵循GPL协议(需要单独分发,遵循GPL的分发,独立部分单独分发)。
GPL v3:依据开源作品修改的开源软件,无论是否包含独立部分,都视作不可分割的完整作品,在传输、分发这样的作品时,无论其中开源部分与独立部分是分开发布还是统一发布,这一发布后的作品整体均应遵守开源协议。
这里举一个栗子:
GPL V1 如果你用了GPL发动机,并且改装了发动机,优化了性能,最终的这个成品也得是GPL。
GPL V2 如果你用了GPL发动起,并且改装了发动机,优化了性能,并且增加了基于这个改装后的发动机增加了新功能,后面的这个新功能可以避免被感染
GPL V3 如果你用了GPL发动起,并且改装了发动机,优化了性能,并且增加了基于这个改装后的发动机增加了新功能,全部都是GPL。
3.2 规避感染
- 不分发,GPL限制只要不通过任何突进分发出去,仅自己使用,此时不需要公布自己的源码。这个最典型的就是SaaS,只给你用,但是我不给你。
- GPL v2,独立部分可不受GPL感染。
- 聚合类,当GPL仅作为容器或者载体的时候,不会进行感染,最常见的是通过JDK运行Java代码
3.3 静态链接,动态链接
这个争议很大,静态链接只静态使用,动态链接指动态调用,Hook,或者引用。没有具体的法律认为动态链接就一定会违反GPL。
3.4 Android 如归规避GPL
简单的说就是先将Linux的核心进行封装,然后将程序运行到这个封装之后的GPL程序上。也就是说除了封装核心,其他都不再属于GPL感染的内容。