您可以使用Proguard和Sourcesets的组合来确保库不会编译到您的发布应用程序中,并使用 gradle 属性来有条件地应用插件。
有条件地包括插件
你可以有条件地包含一个 gradle 插件,方法是像往常一样在 build.gradle 的顶部声明它,并用一个条件子句包围它。例如,下面的代码检查属性是否存在,如果存在,则应用插件。
if (hasProperty('shouldApplyDevMetrics')) {
println "Applying devmetrics plugin"
apply plugin: 'com.frogermcs.androiddevmetrics'
}
else {
println "Not applying devmetrics plugin in release build"
}
要包含属性,您可以在调用 gradle 时使用下面的命令行标志。如果您想使用 Android Studio,可以创建类似的启动配置。
./gradlew assembleDebug -PshouldApplyDevMetrics=true
这会从发布版本中删除 gradle 插件,但根据库的不同,可能会将编译后的代码留在您的应用程序中。您可以使用下面详述的两种方法之一来解决此问题。
使用 Proguard
从 APK 中完全删除库的第一种(也是最简单的)方法是使用 Proguard 工具删除所有相关代码。您应该更新您的版本 buildType 以启用 proguard,并加载自定义规则文件。
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
默认情况下,这应该去掉注释。您可能需要为依赖反射或注释的其他依赖项更新您的 proguard 配置。如果启用 proguard 产生与 Hugo 相关的编译器警告,您可以通过添加以下行来禁用它们:
-dontwarn hugo.weaving**
这种方法确实意味着您需要将依赖项保留在 build.gradle 文件中,但对于像 Hugo 这样的东西来说,这是最好的方法,它通过添加注释在各处使用。
使用源集
要从发布版本中完全删除AndroidDevMetrics库,我们应该首先创建一个调试和发布源集,然后在 src/debug 下添加一个功能类,在 src/release 下添加一个 no-op 类。
// src/debug
public class DevMetricWrapper() {
void doMetricsThings(Context context) {
AndroidDevMetrics.initWith(context);
}
}
// src/release
public class DevMetricWrapper() {
void doMetricsThings(Context context) {
// no-op
}
}
然后,您可以更改模块的 build.gradle 文件,以便该库仅作为调试依赖项包含:
debugCompile 'com.example.yourlibrary'
请注意,如果你打算做更复杂的事情,Dagger是一个非常有用的库,因为它允许你根据你正在构建的风格注入不同的依赖项。