Android Gradle排除Debug BuildType的类

Ive*_*ius 3 android build gradle android-studio

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.+'
Run Code Online (Sandbox Code Playgroud)

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

一个陷阱

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

解决方法

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

   debug {
        minifyEnabled false
        sourceSets {
            main {
                java {
                    exclude '**/tracking/impl/**'
                    exclude '**/GoogleApiClientWrapper.java'
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题解决了,我可以通过"调试"版本编译而没有谷歌播放服务,并且构建时间更快.

问题

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

注意

  • 已配置的proguard规则不剥离这些类(因为我使用反射)
  • 发布版本已禁用proguard
  • 试图在不同的地方定义源集(即使在风格中),看起来最新的sourceSet定义覆盖了所有以前的.

Com*_*are 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.Foomain和其他com.ivelius.awesomeapp.Foorelease-你会得到某种形式的"重复类"的错误.