【发布时间】:2015-08-12 14:12:49
【问题描述】:
烘焙地
出于各种原因,我在我的项目中使用 Google Play 服务。 Google Play 服务是一个很大的依赖项,它大大增加了我的构建时间。所以我想为我的“调试”版本禁用 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 服务仅针对发布版本进行编译,并未包含在调试版本中。到目前为止一切顺利。
一个陷阱
我的代码中有一些依赖于 Google Play 服务的类。我可以使用接口轻松抽象它们,并改为加载存根。但问题是,这些类在我的“调试”构建期间仍在编译,即使我没有直接引用它们(实际上我是使用反射加载它们)。
解决方法
要忽略我不使用的类的编译错误,我只是将它们从调试构建类型的源集中排除,如下所示:
debug {
minifyEnabled false
sourceSets {
main {
java {
exclude '**/tracking/impl/**'
exclude '**/GoogleApiClientWrapper.java'
}
}
}
}
问题解决了,我可以在没有 Google play 服务的情况下使用“Debug”版本进行编译,并且构建时间更快。
问题
尽管我只在“调试”构建类型中指定了 sourceSets 块,但我注意到即使在发布构建类型中这些类也被剥离了。为什么 ?我怎样才能排除那些类ONLY调试构建类型?
注意
- 已将 proguard-rules 配置为不剥离这些类(因为我使用的是反射)
- 为发布版本禁用了 proguard
- 试图在不同的地方定义源集(即使是在不同的地方),看起来最新定义的源集覆盖了之前的所有。
【问题讨论】:
-
“为什么?” -- 因为
sourcesets不会影响单个构建类型。我很惊讶你的 Gradle 脚本运行。我预计会出现 DSL 错误,因为在debug对象上找不到sourcesets方法。 “我怎样才能排除那些只用于调试构建类型的类?” -- 将它们放入release源集并从main中删除它们。 “看起来最新的 sourceSet 定义覆盖了所有以前的”——我不知道“最新的 sourceSet”是什么意思。 -
启发!如果你能指出我是如何将它们放入“发布源集”的?
标签: android android-studio gradle build