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 类?
注意
答案 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
中的main
和com.ivelius.awesomeapp.Foo
中的另一个release
不能让您获得某种形式的重复类"错误。