Android Gradle排除Debug BuildType的类

时间:2015-08-12 14:12:49

标签: android android-studio gradle build

Bakground

我出于各种原因在我的项目中使用Google Play服务。 Google Play服务是一个很大的依赖,它会大大增加我的构建时间。所以我想为我的“Debug”版本禁用Google Play服务,这样我就可以更快地编译我的项目。

我做了什么?

要在我的调试版本中排除Google Play服务,我只需执行以下条件编译:

releaseCompile 'com.google.android.gms:play-services-plus:7.5.+'
releaseCompile 'com.google.android.gms:play-services-ads:7.5.+'
releaseCompile 'com.google.android.gms:play-services-gcm:7.5.+'

因此Google Play服务仅针对发布版本进行编译,而不包含在Debug版本中。所以非常好。

陷阱

我的代码中有一些类依赖于Google Play Services。我可以使用接口轻松地抽象它们,然后加载存根。但问题是,这些类仍然在我的“Debug”构建过程中编译,即使我没有直接引用它们(事实上我正在使用反射加载它们)。

解决方法

要忽略我没有使用的类的编译错误,我只是将它们从调试构建类型的源集中排除,如下所示:

   debug {
        minifyEnabled false
        sourceSets {
            main {
                java {
                    exclude '**/tracking/impl/**'
                    exclude '**/GoogleApiClientWrapper.java'
                }
            }
        }
    }

问题解决了,我可以通过没有Google Play服务的“Debug”版本进行编译,并且构建时间更快。

问题

即使我只在“Debug”构建类型中指定 sourceSets 块,我注意到即使在发布版本类型中也会剥离这些类。为什么?如何为Debug构建类型排除 ONLY 类?

注意

  • 已经配置了proguard-rules以不剥离这些类(因为我正在使用反射)
  • 发布版本的已禁用程序
  • 尝试在不同的地方定义源集(即使是在各种风格中),看起来最新的sourceSet定义会覆盖以前的所有内容。

1 个答案:

答案 0 :(得分:8)

如果您希望拥有某些构建类型或产品风格独有的Java类,请将它们放在该构建类型或产品风格的源集中。

如果你有一个典型的Gradle for Android项目结构,那么你有src/main/java/,其中有基于包名的相应目录中的Java类。这些类在main源集中,用于所有构建。

如果您希望类仅在release版本中使用,请创建一个src/release/java/目录,并将这些类从src/main/java/移至src/release/java/

debug版本中,release类将被忽略。在release版本中,使用release类。

请注意,您无法使用此技术在main替换类。因此,com.ivelius.awesomeapp.Foo中的maincom.ivelius.awesomeapp.Foo中的另一个release不能让您获得某种形式的重复类"错误。