9

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

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

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

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

hugo {
   enabled false
}

而控制AndroidDevMetrics的唯一方法是:

public class ExampleApplication extends Application {

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

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

4

2 回答 2

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 这样的东西来说,这是最好的方法,它通过添加注释在各处使用。

使用源集

要从发布版本中完全删除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是一个非常有用的库,因为它允许你根据你正在构建的风格注入不同的依赖项。

于 2016-06-05T07:15:16.540 回答
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'
}

在这里找到

只有注解什么都不能做,没关系。

关于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);
 }
 }
}

这可能不那么干净,但它是工作。当您运行发布时,代码是干净的。

于 2016-05-30T04:30:48.267 回答