proguard gradle debug build but not the tests

后端 未结 3 1951
长情又很酷
长情又很酷 2020-12-05 15:37

I enabled proguard for the debug build using:

android {
    buildTypes {
        debug {
            runProguard true
            proguardFile \'proguard-deb         


        
相关标签:
3条回答
  • 2020-12-05 15:47

    Introduce a new build type "derived" from debug specific to the test app that disables ProGuard again like

    android {
        buildTypes {
            debugTest.initWith(debug)
            debugTest {
                minifyEnabled false
            }
        }
    }
    

    and use that build type for the test app by assigning its name to the testBuildType property

    android {
        testBuildType 'debugTest'
    }
    
    0 讨论(0)
  • 2020-12-05 16:00

    runProguard is old. It was replaced with minifyEnabled

    With minifyEnabled (and other changes in new versions of gradle) you will may encounter issues where the proguard config works for your debug apk but not for the instrumentation tests. The apk created for instrumentation tests will use its own proguard file, so changing your existing proguard file will have no effect.

    In this case, you need to specify the proguard file to use on the instrumentation tests. It can be quite permissive because it's not affecting your debug and release builds at all.

        // 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')
        }
    
    0 讨论(0)
  • 2020-12-05 16:01

    Put

    gradle.projectsEvaluated {
        proguardDebugTest.enabled = false
    }
    

    it in your build script.

    There are two things to know here:

    • The general Gradle feature to enable / disable tasks.
    • The Android Gradle plugin specific deferred creation of tasks in afterEvaluate, so you need to also defer disabling of the task to afterEvaluate.

    EDIT:

    One small note: It disables the task but fails the build. This is because the :preDexDebugTest task wont run with proguard on. The best solution i've found so far is to have debug specific proguard config. More details here. Create a separate proguard config file, include the regular proguard file like so:

    -include proguard.cfg
    

    and add test config. For me it was:

    -dontwarn org.mockito.**
    -dontwarn sun.reflect.**
    -dontwarn android.test.**
    
    0 讨论(0)
提交回复
热议问题