如何使Hugo和AndroidDevMetrics插件仅在debug中编译:

时间:2016-05-26 13:37:46

标签: android gradle android-gradle build.gradle hugo-logging

我使用Jack's Wharton Hugo LibraryAndroidDevMetrics插件来衡量Android中的方法执行时间和应用程序性能。我需要使这些库仅在调试版本中编译,并将它们从发布版本中排除。

因为这两个库仅使用插件语法应用:

EJB

并且 Gradle 文件中不需要任何依赖项我无法使用 testCompile 选项将其排除在外。提供控制 Hugo 的唯一方法是在gradle文件中设置它:

apply plugin: 'com.frogermcs.androiddevmetrics'
apply plugin: 'com.jakewharton.hugo'

虽然控制 AndroidDevMetrics 的唯一方法是:

hugo {
   enabled false
}

问题:这些控制选项不会阻止这些库文件被编译到应用程序的发行版本。我正在寻找一种在Gradle中排除这些插件的方法,以防我构建发布版本。

2 个答案:

答案 0 :(得分:3)

您可以使用ProguardSourcesets的组合来确保库不会编译到您的发布应用程序中,并使用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这样的东西的最佳方法,它通过添加注释在整个地方使用。

使用Sourcesets

要完全从发布版本中删除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);
 }
 }
}

这可能不那么干净,但是有效。当您遇到发布时,代码是干净的。