Proguard Gradle调试构建但不包括测试

15

我使用以下方法启用了调试版本的Proguard:

android {
    buildTypes {
        debug {
            runProguard true
            proguardFile 'proguard-debug.txt'
        }
        release {
            runProguard true
            proguardFile 'proguard-project.txt'
            zipAlign true
        }
    }
}

我在这样做时遇到的问题是,gradle构建在执行proguardDebugTest任务时也想要对测试进行混淆。我似乎无法修改以访问此特定任务。是否有一种方法可以混淆调试apk但不混淆测试apk?

3个回答

18

runProguard已经过时,它被minifyEnabled替代了。

使用minifyEnabled(和gradle的其他新版本中的更改),您可能会遇到问题,即proguard配置适用于您的debug apk,但不适用于instrumentation测试。为instrumentation测试创建的apk将使用其自己的proguard文件,因此更改现有的proguard文件将不起作用。

在这种情况下,您需要指定要在instrumentation测试中使用的proguard文件。它可以相当宽松,因为它根本不影响您的debug和release构建。

    // inside android block
    debug {
        shrinkResources true  // removes unused graphics etc
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        testProguardFile('test-proguard-rules.pro')
    }

我该如何为测试使用多个Proguard文件? - Daniel Gomez Rico
小写字母和文件名用复数形式? - milosmns
1
对我而言,我需要添加 testproguardFiles(<测试文件名>) ,并在该文件中加入 -dontshrink 标志。 - Billy Lazzaro

10
介绍一种新的构建类型“derived”,它是从debug派生而来,专门用于测试应用程序,并像以前一样禁用ProGuard。
android {
    buildTypes {
        debugTest.initWith(debug)
        debugTest {
            minifyEnabled false
        }
    }
}

通过将其名称分配给testBuildType属性,为测试应用程序使用该构建类型。

android {
    testBuildType 'debugTest'
}

小提示:现在的Gradle(已检查2.6版本)使用minifyEnabled false而不是runProguard false - Andrey Starodubtsev
@AndreyStarodubtsev 谢谢,我已经调整了我的答案。 - sschuberth

3
放置
gradle.projectsEvaluated {
    proguardDebugTest.enabled = false
}

在构建脚本中使用it技术需要知道以下两点:

编辑:

一个小提示:它会禁用该任务但会失败。这是因为preDexDebugTest任务不能在proguard模式下运行。目前我发现最好的解决方案是拥有调试特定的proguard配置。更多细节请参见此处。创建一个单独的proguard配置文件,并像下面这样包含正常的proguard文件:

-include proguard.cfg

并添加测试配置。对我来说,它是:

-dontwarn org.mockito.**
-dontwarn sun.reflect.**
-dontwarn android.test.**

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接