如何从 dex 中排除 package-info.java 文件?

How to exclude package-info.java files from dex?

我有一个多模块 Android 应用程序,当我构建发布 APK 时,我收到此 dex 错误:

java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Lcom/XX/package-info;

当然,我的所有模块中都有一个 package-info 文件,它们都具有相同的名称。
为什么 dex 甚至关心 package-info 个文件,我如何配置它以忽略它们?

注意:我想要启用 multi-dex

尝试在应用模块 build.gradle 中的 android 标签内使用 packagingOptions。

packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/license.txt'
exclude 'META-INF/LGPL2.1'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/notice.txt'
}

更多:Packaging

解决方案是从 jar 文件中排除 package-info 文件。

build.gradle 个文件中使用的示例代码

对于java-模块:

jar {
    exclude('com/**/package-info.*')
}

对于android-模块:

android {
    sourceSets.main.java.filter.exclude 'com/**/package-info.*'
}

适用于:

  • Android工作室3.0 Canary 5
  • Gradle 4.1-milestone-1
  • Android gradle 插件: 3.0.0-alpha5

注意:如果 package-info 文件对您的构建没有贡献,您当然可以只排除它们!
例如当您在 package-info 文件中使用 immutables style-configuration 时,您不能从构建中排除这些文件,因为生成的文件的名称可能会改变!