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

Emi*_*Adz 9 android gradle build.gradle android-gradle-plugin hugo-logging

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

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

apply plugin: 'com.frogermcs.androiddevmetrics'
apply plugin: 'com.jakewharton.hugo'
Run Code Online (Sandbox Code Playgroud)

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

hugo {
   enabled false
}
Run Code Online (Sandbox Code Playgroud)

而控制AndroidDevMetrics的唯一方法是:

public class ExampleApplication extends Application {

@Override
 public void onCreate() {
     super.onCreate();
     //Use it only in debug builds
     if (BuildConfig.DEBUG) {
         AndroidDevMetrics.initWith(this);
     }
  }
 }
Run Code Online (Sandbox Code Playgroud)

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

fra*_*nch 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"
}
Run Code Online (Sandbox Code Playgroud)

要包含属性,您可以在调用 gradle 时使用下面的命令行标志。如果您想使用 Android Studio,您可以创建类似的启动配置。

./gradlew assembleDebug -PshouldApplyDevMetrics=true
Run Code Online (Sandbox Code Playgroud)

这将从发布版本中删除 gradle 插件,但根据库的不同,可能会在您的应用程序中留下已编译的代码。您可以使用下面详细介绍的两种方法之一来解决此问题。

使用混淆器

从 APK 中完全删除库的第一种(也是最简单的)方法是使用 Proguard 工具删除所有相关代码。您应该更新您的版本 buildType 以启用 proguard,并加载自定义规则文件。

release {
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,这应该删除注释。您可能需要更新依赖于反射或注释的其他依赖项的混淆器配置。如果启用 proguard 会产生与 Hugo 相关的编译器警告,您可以通过添加以下行来禁用它们:

-dontwarn hugo.weaving**
Run Code Online (Sandbox Code Playgroud)

这种方法确实意味着您需要在 build.gradle 文件中保留依赖项,但对于像 Hugo 这样的东西来说是最好的方法,它通过添加注释在各处使用。

使用源集

要从发布版本中完全删除AndroidDevMetrics库,我们应该首先创建调试和发布源集,然后在 src/debug 下添加一个功能类,在 src/release 下添加一个无操作类。

// src/debug
public class DevMetricWrapper() {
    void doMetricsThings(Context context) {
        AndroidDevMetrics.initWith(context);
    }
}

// src/release
public class DevMetricWrapper() {
    void doMetricsThings(Context context) {
        // no-op
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以更改模块的 build.gradle 文件,以便该库仅作为调试依赖项包含在内:

debugCompile 'com.example.yourlibrary'
Run Code Online (Sandbox Code Playgroud)

请注意,如果您计划做任何更复杂的事情,Dagger是一个非常有用的库,因为它允许您根据您正在构建的风格注入不同的依赖项。