gpt4 book ai didi

android - 如何使 Hugo 和 AndroidDevMetrics 插件仅在调试 : 中编译

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:40:32 25 4
gpt4 key购买 nike

我正在使用 Jack's 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 中的这些插件,以防我构建发布版本。

最佳答案

您可以使用 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 以启用混淆器,并加载自定义规则文件。

release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

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

-dontwarn hugo.weaving**

这种方法确实意味着您需要在 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
}
}

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

debugCompile 'com.example.yourlibrary'

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

关于android - 如何使 Hugo 和 AndroidDevMetrics 插件仅在调试 : 中编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37462509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com