Oracle v. Google 以及 API 的版权问题

目前还没有人喜欢这个。
Two government buildings

Opensource.com

正如广泛报道的那样,*Oracle v. Google* 案件的地区法院发布了一项命令,认定 37 个 J2SE 5.0 API 包的“结构、顺序和组织”(SSO) 不受版权保护。预计 Oracle 将提出上诉。

有争议的 API 包包含 600 多个类和 6,000 多个方法,是 Sun 的 J2SE 5.0 JDK 和 JRE 产品捆绑的 166 个包类库的一部分。 被指控的 Android Froyo 平台的 Dalvik 类库中的 37 个包,在很大程度上复制了这些 J2SE 包的命名空间层次结构、类声明和方法声明,并提供了等效的功能。 Oracle 声称这种复制侵犯了版权,尽管 Google 对类和方法的实现是独立开发的。 从源代码的角度来看,两个平台中相应的 37 个 API 包的相似度为 97%。

此前没有美国法院审查过 API 的版权问题,更不用说一组 API 的 SSO 了。 正如最近欧盟的 SAS v. WPL 案件一样,这里的问题主要涉及可版权表达和不可版权思想之间的区别。 1976 年《版权法》第 102(b) 条规定了这种区别,指出版权不“扩展到任何思想、程序、过程、系统、操作方法、概念、原则或发现”。

在主张 SSO 侵权理论时,Oracle 借鉴了一系列案例,这些案例承认软件中存在剩余的版权权益,即使没有对源代码或目标代码进行字面复制。 正如法院解释的那样,对非字面软件版权侵权理论的司法支持在 20 世纪 80 年代达到顶峰。 从那时起,法院变得更加谨慎,注意 102(b) 条款,并需要防止将类似专利的垄断扩展到版权领域。

判决

法院的判决分为两个部分。 首先,法院在个体层面上处理了 Java 平台 API。 法院裁定,任何人都可以复制 API 类和方法的功能,使用相同的声明,只要实现不复制原始版本即可。 法院非常强调这样一个事实,即 Java 的语法规则要求使用相同的声明(类名和方法名除外),以便开发一个独立的实现,该实现将提供与原始版本相同的功能。 根据合并原则,如果只有一种方式可以表达给定的想法,那么没有人可以声称拥有这种表达的版权。 虽然没有必要复制 API 包中使用的名称,但名称本身不受版权保护。 尽管强调了 Java 语法,但法院的推理似乎适用于一般的 API,以及技术上不同的 Web 服务 API 的典型变体。

然后,法院解决了 37 个 API 包作为一个整体的版权问题。 Oracle 声称,以与 J2SE 类库相同的方式对各种包、类和方法进行分类是侵犯版权。 Java 语言中没有任何东西规定任何特定的组织方式,以便提供等效的功能。 然而,法院认为 J2SE 组织是用于执行指定功能的非版权实用“命令结构”。 此外,互操作性考虑表明,37 个 API 包作为一个整体是 102(b) 条款中的“系统”或“操作方法”。 本质上,法院得出结论,Google 必须提供具有相同分类组织、名称和功能规范的相同“命令系统”,以便将大量现有第三方 Java 代码轻松移植到 Android,因为此类现有代码假定常见 Java 平台 API 的可用性。

对开源的意义

一个有趣的周边事实是,Oracle 和 Google 都根据开源许可证向公众发布了相关类库代码库的版本。 Dalvik 类库的源代码(基于已故的 Apache Harmony 项目的子集)可根据 Apache License 2.0 获得。 Oracle 延续了 Sun 在 2006 年之后的做法,根据 GPLv2 以及 Classpath Exception 发布 Java SE 类库版本的源代码,作为 OpenJDK 项目的一部分。 Classpath Exception 将 GPLv2 转换为类似 MPL 的弱复制左许可证,它改编自 license for the GNU Classpath 项目。 GNU Classpath(仍在 积极开发中)和 Apache Harmony 都旨在生成核心 Java 类库的完整独立实现,它们是自由软件开发者社区与 Sun 之间多年紧张关系的遗留产物,后者试图保持对 Java 的控制,其中一个持久的影响是开源 Java 生态系统的文化孤立。

API 版权问题具有更深的历史共鸣。 自由软件的大部分历史的特点是努力开发替代方案,以取代主要的或流行的专有平台、系统和协议的元素。 这不仅体现在各种免费的 JVM 以及 Java 编译器和运行时项目中,而且还体现在早期开发不受约束的 Unix 克隆(GNU、BSD 的后期版本及其后代以及 Linux)的努力中。 在 *Oracle v. Google* 命令中提到的“互操作性”可以被视为许多此类项目的目标。

在 20 世纪 80 年代末和 90 年代初,这是专有 Unix 的免费替代方案开发的关键时期,自由软件开发人员子文化意识到并害怕在软件版权案件中对非字面侵权理论的司法认可。 虽然有影响力的 Richard Stallman 突出强调了“接口版权”的危险,但他的批评者 指责他在将 GPL 应用于软件库时,提出了一种类似于接口版权的理论。 (LGPL 的引入,部分原因是这种冲突。)但是,支持复制左和反对复制左的阵营都团结在一个基本的信念上,即不应使用法律来阻止开发不受约束的与接口兼容的专有软件重新实现。 关于 API 版权的 *Oracle v. Google* 裁决,人们怀疑它验证了大多数开发人员的政策直觉,这完全符合这种信念。

Richard Fontana
Richard 是红帽法律部门产品和技术团队的高级商业顾问。 他的大部分工作都集中在与开源相关的法律问题上。

12 条评论

Oracle 输掉了审判的专利阶段。 Oracle 输掉了审判的版权阶段。 包括我在内的 Google 的支持者正在庆祝 Google 的胜利。

这里还有另一场开源的胜利,它并不那么明显,但可能比上面列出的两个更重要。 当 Oracle 起诉 Google 时,Oracle 不仅未能获得任何资金,而且还输掉了他们在本案中使用的大部分专利。 这让那些考虑使用软件专利攻击开源的公司(再次)注意到,这样做他们可能会失去他们的软件专利。 律师可能不知道专利记录中没有出现的现有技术,但开源社区肯定知道。

---------------------------------
Steve Stites

又一次失败。 Oracle 已被责令支付 Google 的法律费用,金额约为 300,000 美元。

http://androidcommunity.com/oracle-loses-again-ordered-to-pay-googles-le...

------------------------------
Steve Stites

问题不在于 API 的版权,而在于 Google 宣传程序员,试图说服他们 Google 制作的实现与 JDK/JRE 规范完全兼容。

Google 制造了一场兼容性噩梦,给应用程序开发人员带来了很多成本,并诽谤了 Java 平台的名声。 我们必须说 Android SDK 绝对与 Java JDK 不兼容。

Google 的滥用之处在于说开发将是相同的。 Google 违反了 Java 中提供的合同“一次开发,随处部署”。

只要 Google 不满足兼容性测试,或者拒绝与 Android DSK 中自身实现相关的错误报告,Google 就不应滥用这些名称,而应使用自己的包名称。

Android 平台绝对不兼容。 应用程序必须专门为 Android 重新开发和重新测试,在其他移动平台上认证的测试(例如 Nokia)是不够的。

Google 向开发人员和运行 Android 的设备的客户撒谎。 它甚至创建了自己的兼容性测试,就像一种商业策略,为移动应用程序创建另一个非开放市场。

因此,版权滥用实际上是长期滥用 Java 参考名称。 我们知道 Google 向所有人(甚至向法庭)撒了谎,并决定滥用这个名称,只是为了拒绝开放自己的新专有平台。

请记住:Android 绝对不是开放的,远不如 Java。

Google 甚至不想获得许可证,以便能够将其规范集成到开放平台中,以确保兼容性合同“一次开发,随处部署”。

所以现在 Android 应用程序无法再部署在 Java 平台上(手机、机顶盒、电视、媒体中心设备),Java 应用程序也无法再部署在 Android 设备上。谷歌声称要与 Java 兼容,但实际上却创建了自己的**封闭**平台。

您真的在为谷歌的封闭平台辩护吗?而且问题不仅仅在于版权,还在于商标以及谷歌的 Android 开发者网站?

如果 Oracle 提供的 TCK 具有可接受的使用条款,那么谷歌就会直接实现 Java SE 或 ME。Oracle 关心的只是保持控制并赚钱。

Oracle 的控制权远不如谷歌对 Android 的控制(谷歌完全控制了 Google Apps Store,并且通过它赚钱比 Oracle 通过真正开放的许可协议赚钱要多得多)。
但是谷歌不想要任何可用的 Java 许可协议(包括那些免费的)。
谷歌想要推广自己的新标准,破坏了互操作性,还拒绝了 ISO 标准规范,拒绝了 GPL 原则。
只要比较一下谷歌现在想要使用的 Android SDK 许可协议:对于所有人来说,它都比 Oracle 提供的任何 Java 许可协议都要糟糕得多。
问题就在于此:谷歌有选择,包括使用开放许可协议。但它拒绝了。它想要在这些许可协议之外获取东西,就好像那是属于它的东西一样。

但对所有人来说,主要问题是谷歌破坏了互操作性,并且拒绝使其 SDK 适应与开放 Java 社区的合作。谁更开放?肯定不是谷歌。要求谷歌的是,如果它想影响 JDK 的内容,并获得其提议扩展的官方长期支持,就参与到社区中来。

社区本可以对谷歌的提议发表意见,以确保 Java 保持可移植性,而不仅仅局限于 Android。Android SDK 中绝对没有社区的声音。一切都是专有的,由谷歌单独决定,然后迫使所有开发人员遵循其在 Android SDK 中的决定。并迫使所有开发人员为 Android 重新开发他们的应用程序,专门为 Android 进行测试。

谷歌甚至未能使 Android 自身具有可移植性!Java 平台的向上升级能力不再适用于 Android。

我坚持认为:Android 平台是一个封闭的平台,因为除了谷歌之外,没有人能够支持它,而且谷歌不断地加入新的障碍,甚至包括跨版本的障碍,迫使 Android 开发者接受新的培训,重建他们的应用程序,直到谷歌最终通过创建自己的版本来吸取这些应用程序的价值,而这个版本将是唯一一个跨版本维护的版本。

实际上,谷歌现在玩的是与微软在 Windows 中使用的相同的封闭游戏(今天的问题少多了,Winphones 几乎退出了市场),然后是苹果(使用 IOS)。

Java 的设计目的是在所有平台上工作。但现在,即使是谷歌也阻止符合标准的 Java VM 在 Android 设备上运行(因为这意味着可以在 iPhone 和 Nokia 上运行的相同应用程序无需更改即可在 Android 上运行):这意味着谷歌将不再能够控制移动设备上可用的内容,这意味着内容提供商之间的竞争会更大,并且与智能手机制造商的依赖关系也会减少。

不再需要无限期地等待 OSM 制造商的固件更新。虚拟机将正确运行,无缝升级,并且应用程序仍然可以在这些更新的虚拟机上工作。这对于像 Android(和 iOS、WinPhone)这样的专有操作系统以及其他设备(直接在您的 HDTV 上,或在您的机顶盒中,在更广泛的应用程序市场上,这些应用程序可以在我们所有的屏幕上运行)来说是不可能的。

我坚持认为:问题不在于 API 的版权,而在于该 API 应该用于什么样的服务。谷歌承诺了各种各样的事情(包括复制 Oracle/Sun 的 JDK 文档,以及大部分 Java 源代码),但在其他方面都失败了。Android VM 的工作方式与 Java 不同。这意味着谷歌甚至通过逐字逐句地重新发布 JDK 文档来欺骗客户和开发人员,但拒绝使 Android VM 按照该副本中的承诺工作。这明显诽谤了 Oracle/Sun 及其开放社区所做的工作,即指定它并使其在清晰的设计模式下具有互操作性。

谷歌甚至不需要拒绝 Java 来开发自己的应用程序市场(现在更名为 Google Play,因为苹果赢得了针对谷歌的诉讼,谷歌将其 Appstore 命名为类似于苹果为其 iPhone/iOS 平台所做的事情)。

您只知道 Java 在开放许可下工作吗?包括独立的发行版,其中许多核心类已经以不同的方式重写(包括性能方面涉及的关键类,例如安全类、2D/3D 渲染、音频/视频编解码器,以及与许多服务的互操作性类,如 XML、HTML、CSS、Web 服务和高质量的数学软件包(这些软件包在 Android 上无法正确运行,会产生错误的结果,这在 Java 中已经几十年没有发生过了!)

“问题不在于 API 的版权,而在于谷歌宣传并试图说服程序员,谷歌制造的实现与 JDK/JRE 规范完全兼容。”
真的吗?你能提供一个链接吗?

谷歌制造了一个兼容性噩梦,这给应用程序开发人员带来了很大的成本,并诽谤了 Java 平台的名声。
这种“成本”如何影响开发人员?一个名为“android”的产品如何诽谤另一个名为“java”的独立产品?这就像说微软的 SQL 实现诽谤了 MySQL 的实现。Droid 和 Java 是类似概念的两种独立实现,就像 MS-SQL 和 mySQL-SQL 一样...

“Android SDK 绝对与 Java JDK 不兼容”
他们应该兼容的期望在哪里?

谷歌的滥用在于说开发将是相同的。
你能指出谷歌声明在 Sun E10K 上开发 Java 与在 Android 上为手机开发是相同的吗?真的吗?真的吗?

谷歌打破了 Java 中提供的“一次开发,随处部署”的合同。
我想看看这份合同的副本。RODA 在 Oracle 的 Java 实现中不存在(可以查阅“headless”,或者他们的串行通信实现)。你似乎一直坚持 Java 和 Android 是相同的这个想法。而它们只是相似的。

“只要谷歌不满足兼容性测试,或者拒绝与 Adroid DSK 中自己的实现相关的错误报告,谷歌就不应该滥用这些名称,而应该使用自己的包名称。”
所以没有人可以拥有“System”类或 IO 类?我不认为 Sun 在想出这些名字方面特别有创意。

“Android 平台绝对不兼容。应用程序必须专门为 Android 重新开发和重新测试,在其他认证的移动平台(例如 Nokia)上的测试是不够的。”
欢迎来到软件开发和配置管理的真实世界。这就是为什么我的公司仍然使用 12 年前的 Windows 版本 - 而且 Java 兼容性也无法解决这个问题。
以及为什么我必须在我的电脑上安装 4 个版本的 Oracle jInitiator 才能运行 Oracle e-business。

Google 向开发人员和运行 Android 的设备的客户撒谎。 它甚至创建了自己的兼容性测试,就像一种商业策略,为移动应用程序创建另一个非开放市场。

他们说了什么谎话?无论如何,我相信 Android 的应用程序比任何其他移动平台都多,所以我不太确定开发人员是否难以适应 Android 平台。顺便说一句:哪里写着谷歌必须提供一个“开放”平台?

“我们知道谷歌欺骗了所有人(甚至包括法庭),并决定滥用这个名字,只是为了拒绝开放其自己的新的专有平台。”
我们知道他们撒谎了?我当时不在那里,所以我怎么会知道?他们被指控藐视法庭了吗?什么“谎言”?展示你主张的出处?

请记住:Android 绝对不是开放的,远不如 Java。
它应该开放吗?所以它不开放又怎样?我不知道你想表达什么。你认为 Oracle ERP、webcenter 或 iFiles 是“开放”的吗?

Google 甚至不想获得许可证,以便能够将其规范集成到开放平台中,以确保兼容性合同“一次开发,随处部署”。
为什么谷歌会希望他们的智能手机操作系统在电视调谐器、DVR、摄像机、扭矩扳手控制器等上运行?谁说他们必须这样做?谁会期望他们这样做?我对软件供应商的最大不满之一是他们的企业软件是多么“通用” - 我最终花钱让阿司匹林工厂的需求在我的用于运行 CNC 铣床的软件中得到解决。手机操作系统应该在手机上运行得最好。

所以现在 Android 应用程序无法再部署在 Java 平台上(手机、机顶盒、电视、媒体中心设备),Java 应用程序也无法再部署在 Android 设备上。谷歌声称要与 Java 兼容,但实际上却创建了自己的**封闭**平台。
你是说他们做了和苹果、RIM 和微软一样的事情?真可耻。但他们仍然是迄今为止最受欢迎的操作系统,真令人费解。

您真的在为谷歌的封闭平台辩护吗?而且问题不仅仅在于版权,还在于商标以及谷歌的 Android 开发者网站?

听着,你必须捍卫他们。你不能只为某些人拥有自由(开源或什么都没有)。如果谷歌,或者任何其他人想要创建软件,我们有什么资格批评?我们又不是被迫使用它。开源社区应该被单独留下进行创新,商业产业也应该如此。
据我所知,谷歌并没有全力以赴地压制竞争对手。谷歌并没有向毫无戒心的用户勒索许可费,谷歌的搜索引擎不会在我每次错误输入 URL 或路径时在我的资源管理器窗口中弹出。
我不是谷歌的狂热粉丝,我实际上甚至没有 Android 手机,但由于我处理过 Oracle 的产品和他们的人员,所以我对他们遇到的任何不幸都没有太多的同情心。

API 的全部意义在于供应商试图提供一种工具,将开发人员锁定在他们的技术中。说谷歌是封闭的,而 Oracle 是开放的,忘记了 Oracle 收购公司只是为了以不断上涨的价格将 Oracle 强加给他们的客户。认为 Oracle 不会对 Java 这样做是天真的。

这个 API 判决是否意味着我们可以随意克隆 O/S 接口(内核调用和库)?

当然,在实现中要避免专利解决方案。

<em>这个 API 判决是否意味着我们可以随意克隆 O/S 接口(内核调用和库)?</em>

该判决包括其动机,即“复制”的 API 是一种编程语言的 API,并且使用相同的 API 结构、调用等(尽管实现方式不同)在技术上对于尝试实现互操作性是必要的,即:编写 Java 程序,使其有机会在两个平台上工作,并且这并不违反版权。

将这种推理扩展到 OS 接口需要下一步,但我认为这不是很大的一步。

如果所实现的 API 确实执行相同的事情,具有相同的安全级别和范例,那就没问题了。 然而,Android 版本违反了其中的几个范例,尤其是不抛出文档中说明的异常(它们可能会抛出派生异常),而是经常静默地返回一个默认值,而不向应用程序发出任何信号。 当期望通过异常来检查某些应用程序的安全性,以便异常处理程序能够提供一个预期的备用执行路径,并且只能产生正确的结果时;或者当应用程序没有准备好静默地接收 NULL 默认值,导致它们在尝试引用时生成致命错误时,这是一个严重的问题。

鉴于这些 Android API 是不同的,它们绝对不应该使用相同的类名(或者应该放在单独的替换包中,允许应用程序开发人员为两个平台创建支持类,并更容易地进行兼容性测试,以便在单个统一代码中同时兼容两者)。

这是不可能的。Android 实现不是一个独立的实现,它打破了所有 Java 编程范例:一次编写,到处部署,以及 Java 所承诺的向上兼容性。

这绝对不是一个 Bug 的问题(Bug 可以被识别,并且应该被纠正,同时也允许开发临时性的解决方法,如果平台是清晰可识别的,可以使用自定义类加载器来解决或绕过特定版本中的一些已知 Bug)。

如果 Google 参与了 Java 平台的正常开发,它将受益于所有 Bug 修复,这些修复现在将独立地影响两个平台,并且会为所有应用程序和所有用户增加更多的 Bug。 这是一种时间的浪费,而 Java 平台上的一切都是开放的(包括在一个所有人都可以访问的地方记录的修复)。

例如,GNU classpath 符合 Java 平台,即使它仍然不支持所有功能。 它有其用途和局限性,这些用途和局限性现在记录在 JDK 中,并且还允许 Java 平台在上层开发新的标准库,以解决在实现之间难以干净地解决的常见问题。 然后可以优化这些插件并优先使用它们来解决所有这些问题,包括使用“隐藏”的解决方法作为其内部实现的一部分,而不会影响黑盒 API。

事实上,现在属于标准 JVM 发行版的大多数实现都是由 Java 社区贡献的。 选择一种实现而不是另一种实现是一个漫长的过程,在这个过程中,每个 API 都通过社区收集的当前最佳实践和知识进行仔细审查(所有这些研究和开发都易于所有人访问,包括历史记录:在 Android 中没有任何类似的东西,它的平台和它的演变是由一些神秘的人秘密讨论的)。

你好,Philippe,

我不是 Java 程序员(我更喜欢其他语言),所以我无法评论你提到的问题,而且我不是在讨论它们可能对于 Java 编程社区来说是真正的技术问题。 我和你一样认为,如果某件事被称为“Java”,它就应该表现得像“Java”应该表现得那样。 如果不是,那就是一个 Bug,或者一个实现错误,而不是伪造版权。 还要注意,如果你是唯一实现某件事的人,那么做一个一致的实现,几乎以相同的方式在任何地方运行,避免你提到的许多问题,要容易得多。

关于这则新闻以及它所涉及的知识产权问题,我认为这是一个伟大的决定,为开源项目树立了先例,无论是实现另一个 Java,还是作为自由软件的任何其他编程语言。

最近,欧洲联盟法院在 C-406/10 SAS Institute Inc. v World Programming Ltd 案(2012 年 5 月 2 日)中做出了类似的裁决,该案涉及一种用于统计分析的编程语言。

http://curia.europa.eu/jcms/upload/docs/application/pdf/2012-05/cp120053...

我很高兴这种类型的决定在世界其他地方也能分享。

阅读美国加利福尼亚州北区地方法院法官的判决,你可以看到法院已经真正努力理解什么是编程语言,什么是 API,以便将法律原则应用于可以通过版权保护的内容,以及不能通过版权保护的内容。

这位美国法官所做的工作非常出色。

Java 是从现有技术拼凑而成的。 它出来的时候并没有什么新东西。 仔细检查会发现 Oracle 很容易受到同样的指责。

在 Creative Commons CC0 1.0 通用公共领域贡献 下发布。
© . All rights reserved.