【问题标题】:OSS license plugin doesn't include library module licensesOSS 许可插件不包括库模块许可
【发布时间】:2018-01-28 15:57:04
【问题描述】:

迁移到 Gradle 3.0 的 Android 插件后,OSS 许可证插件 (https://developers.google.com/android/guides/opensource) 不再包含来自项目库模块依赖项的许可证。只有“应用程序”模块。

我正在使用com.google.gms:oss-licenses:0.9.1com.google.android.gms:play-services-oss-licenses:11.8.0

如果我将插件“应用”到我的所有模块,third_party_license 数据会在每个模块的原始文件夹中生成。但最终只有来自应用模块的数据最终进入 APK。

这个问题有解决办法吗?

【问题讨论】:

  • 您可以从您的 gradle 文件中附加快照,或者您可以确认您应用了插件吗? apply plugin: 'com.google.gms.oss.licenses.plugin'

标签: android google-play-services


【解决方案1】:

是的,没错。

根据我对插件工作原理的搜索,插件会根据POM 文件将数据生成到工件的res/raw 文件夹(aarapk,但不是jar 文件)它可以从图书馆获得。然后其余的合并由 Gradle Android 插件完成,而不是由 OSS 许可证插件完成,后者合并了来自所有源(依赖库、模块、主应用程序等)的 res 文件夹。然而,这里的问题是,在合并时,如果同一资源有重复项,Android Gradle 插件会选择一个(link 解释),并且选择的一个是基于优先级的,这意味着因为两个应用程序模块并且 lib 模块正在生成重复的 R.raw.third_party_license 资源,来自 app 模块的资源比来自模块的资源具有更高的包含优先级,因此不包括来自模块的许可证信息。

有几种方法可以解决这个问题:

  1. 在应用模块中包含与库模块相同的依赖项。这可能是最糟糕的想法,但它不会影响您的应用程序,因为 Gradle 会自动解决依赖关系而不会出现任何问题,特别是如果它们具有相同的版本,如果它们具有不同的版本,那么 Gradle 会选择最新的。李>
  2. 与其使用模块依赖,不如将模块发布到 maven repo(本地或远程,这里有一个 link 来展示如何在本地完成),并添加它的依赖:implementation 'com.mygroup:library:1.0'。不要忘记将其从项目build.settings 文件中删除。这将生成库模块的POM 文件,从而让插件读取它并包含它的库许可证。这意味着应该在编译应用模块之前编译和发布库,但也可能导致一些奇怪的编译问题和错误发生时的混乱。

不幸的是,我认为还有另一种方法可行,但它没有。这是通过将库模块中的依赖项更改为api 而不是implementation。这会将库依赖项暴露到应用程序模块依赖项中,但会增加项目的构建时间。但最后它没有正确生成原始资源,因为似乎 OSS License Plugin 只从库的 POM 文件中读取依赖项,在这种情况下,即使库模块依赖项被暴露,也不会生成 POM 文件.可能应该将此作为增强或错误请求发布给插件的开发人员。

【讨论】:

  • @petrus 的答案对您有帮助吗?
  • 谢谢,我同意你的总结。 #1肯定是一种解决方法。但我希望看到一个真正的解决方案,希望会有一个新版本修复这个问题。否则我会考虑转向另一个解决方案。
猜你喜欢
  • 2020-04-03
  • 2016-11-24
  • 2023-04-08
  • 2012-12-27
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
相关资源
最近更新 更多