我使用Jack's Wharton Hugo Library和AndroidDevMetrics插件来衡量Android中的方法执行时间和应用程序性能。我需要使这些库仅在调试版本中编译,并将它们从发布版本中排除。
因为这两个库仅使用插件语法应用:
EJB
并且 Gradle 文件中不需要任何依赖项我无法使用 testCompile 选项将其排除在外。提供控制 Hugo 的唯一方法是在gradle文件中设置它:
apply plugin: 'com.frogermcs.androiddevmetrics'
apply plugin: 'com.jakewharton.hugo'
虽然控制 AndroidDevMetrics 的唯一方法是:
hugo {
enabled false
}
问题:这些控制选项不会阻止这些库文件被编译到应用程序的发行版本。我正在寻找一种在Gradle中排除这些插件的方法,以防我构建发布版本。
答案 0 :(得分:3)
您可以使用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插件,但根据库,可能会在您的应用程序中保留已编译的代码。您可以使用以下详述的两种方法之一解决此问题。
从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是一个非常有用的库,因为它允许您根据您正在构建的风格注入不同的依赖项。
答案 1 :(得分:0)
雨果汽车确保:
project.dependencies {
debugCompile 'com.jakewharton.hugo:hugo-runtime:1.2.2-SNAPSHOT'
// TODO this should come transitively
debugCompile 'org.aspectj:aspectjrt:1.8.6'
compile 'com.jakewharton.hugo:hugo-annotations:1.2.2-SNAPSHOT'
}
找到它here
只有注释无能为力,没问题。
关于AndroidDevMetrics,您可以阅读Get Start
public class ExampleApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//Use it only in debug builds
if (BuildConfig.DEBUG) {
AndroidDevMetrics.initWith(this);
}
}
}
这可能不那么干净,但是有效。当您遇到发布时,代码是干净的。