Android Gradle 为 Debug BuildType 排除 类
Android Gradle exclude classes for Debug BuildType
背景
出于各种原因,我在我的项目中使用 Google Play 服务。 Google Play 服务是一个很大的依赖项,它大大增加了我的构建时间。所以我想为我的 "Debug" 版本禁用 Google 播放服务,这样我可以更快地编译我的项目。
我是做什么的?
为了在我的调试构建期间排除 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 服务仅针对发布版本进行编译,未包含在调试中 builds.So 目前还算不错。
一个陷阱
我的代码中有一些 类 依赖于 Google 播放 Services.I 可以很容易地用接口抽象它们,并加载存根 instead.But 问题是,那些 类 在我的 "Debug" 构建期间仍在编译,即使我没有直接引用它们(实际上我正在使用反射加载它们)。
解决方法
要忽略 类 我没有使用的编译错误,我只是将它们从调试构建类型的源集中排除,如下所示:
debug {
minifyEnabled false
sourceSets {
main {
java {
exclude '**/tracking/impl/**'
exclude '**/GoogleApiClientWrapper.java'
}
}
}
}
问题解决了,我可以用 "Debug" 没有 Google 播放服务的版本编译,构建时间更快。
问题
即使我只在 "Debug" 构建类型中指定 sourceSets 块,我注意到那些 类 即使在发布时也被剥离了构建类型。为什么 ?我如何排除调试构建类型的 类 ONLY?
注意
- 已经配置了 proguard-rules 以不去除那些 类(因为我正在使用反射)
- 为发布版本禁用混淆器
- 试图在不同的地方定义源集(甚至在不同的地方),看起来最新定义的源集覆盖了所有以前的。
如果您想要 Java 类 对于某些构建类型或产品风格来说是独一无二的,请将它们放入该构建类型或产品风格的源集中。
如果您有一个典型的 Gradle 用于 Android 项目结构,那么在某处,您有 src/main/java/
,其中 Java 类 在适当的目录中基于包名。那些 类,在 main
源集中,用于所有构建。
如果您想让 类 仅在 release
构建中使用,请创建一个 src/release/java/
目录,然后将那些 类 从 src/main/java/
到 src/release/java/
.
在 debug
构建中,release
类 被忽略。在 release
构建中,使用 release
类。
请注意,您不能使用此技术 替换 main
中的 类。所以,你不能在 main
中有 com.ivelius.awesomeapp.Foo
而在 release
中有另一个 com.ivelius.awesomeapp.Foo
— 你会得到某种形式的 "duplicate class" 错误。
背景
出于各种原因,我在我的项目中使用 Google Play 服务。 Google Play 服务是一个很大的依赖项,它大大增加了我的构建时间。所以我想为我的 "Debug" 版本禁用 Google 播放服务,这样我可以更快地编译我的项目。
我是做什么的?
为了在我的调试构建期间排除 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 服务仅针对发布版本进行编译,未包含在调试中 builds.So 目前还算不错。
一个陷阱
我的代码中有一些 类 依赖于 Google 播放 Services.I 可以很容易地用接口抽象它们,并加载存根 instead.But 问题是,那些 类 在我的 "Debug" 构建期间仍在编译,即使我没有直接引用它们(实际上我正在使用反射加载它们)。
解决方法
要忽略 类 我没有使用的编译错误,我只是将它们从调试构建类型的源集中排除,如下所示:
debug {
minifyEnabled false
sourceSets {
main {
java {
exclude '**/tracking/impl/**'
exclude '**/GoogleApiClientWrapper.java'
}
}
}
}
问题解决了,我可以用 "Debug" 没有 Google 播放服务的版本编译,构建时间更快。
问题
即使我只在 "Debug" 构建类型中指定 sourceSets 块,我注意到那些 类 即使在发布时也被剥离了构建类型。为什么 ?我如何排除调试构建类型的 类 ONLY?
注意
- 已经配置了 proguard-rules 以不去除那些 类(因为我正在使用反射)
- 为发布版本禁用混淆器
- 试图在不同的地方定义源集(甚至在不同的地方),看起来最新定义的源集覆盖了所有以前的。
如果您想要 Java 类 对于某些构建类型或产品风格来说是独一无二的,请将它们放入该构建类型或产品风格的源集中。
如果您有一个典型的 Gradle 用于 Android 项目结构,那么在某处,您有 src/main/java/
,其中 Java 类 在适当的目录中基于包名。那些 类,在 main
源集中,用于所有构建。
如果您想让 类 仅在 release
构建中使用,请创建一个 src/release/java/
目录,然后将那些 类 从 src/main/java/
到 src/release/java/
.
在 debug
构建中,release
类 被忽略。在 release
构建中,使用 release
类。
请注意,您不能使用此技术 替换 main
中的 类。所以,你不能在 main
中有 com.ivelius.awesomeapp.Foo
而在 release
中有另一个 com.ivelius.awesomeapp.Foo
— 你会得到某种形式的 "duplicate class" 错误。