OSS许可插件不包含库模块许可

时间:2018-01-28 15:57:05

标签: android google-play-services

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

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

如果我将'插件'应用于我的所有模块,则会在每个模块的原始文件夹中生成third_party_license数据。但最终只有来自app模块的数据最终会出现在APK中。

此问题是否有解决方法?

1 个答案:

答案 0 :(得分:1)

是的,这是正确的。

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

有几种解决方法:

  1. 在您的应用模块中包含库模块中的相同依赖项。这可能是最糟糕的想法,但它不会影响您的应用程序,因为Gradle会自动解决依赖关系而不会出现任何问题,特别是如果它们的版本相同,如果它们的版本不同,那么Gradle会选择最新版本。
  2. 不是使用模块依赖项,而是将模块发布到maven仓库(本地或远程,这里是link以显示如何在本地完成),并添加它的依赖关系:{{1} }。不要忘记将其从项目implementation 'com.mygroup:library:1.0'文件中删除。这将生成库模块的build.settings文件,从而使插件读取并包含它的库许可证。这意味着在编译应用程序模块之前应该编译和发布库,但是当发生错误时,它可能会导致一些奇怪的编译问题和混淆。
  3. 不幸的是,我认为还有一种方法可行,但事实并非如此。通过将库模块中的依赖项更改为POM而不是api。这会将库依赖项暴露给app模块依赖项,但会增加项目的构建时间。但最后它没有正确生成原始资源,因为OSS许可插件似乎只从库的POM文件中读取依赖项,在这种情况下,即使库模块依赖项,也不生成implementation文件暴露了。可能应该将此作为增强或错误请求发布给插件的开发人员。