snowdream
snowdream

Reputation: 933

Exclude BuildConfig.class and R.class from Android library jar in Gradle

When building an Android Library Project with Gradle, what's the correct way to exclude BuildConfig.class and R.class from the resulting .jar?

Upvotes: 6

Views: 9925

Answers (6)

Vlad
Vlad

Reputation: 8572

To excude R and BuildConfig use this

afterEvaluate {
    generateReleaseBuildConfig.enabled = false
    generateDebugBuildConfig.enabled = false
    generateReleaseResValues.enabled = false
    generateDebugResValues.enabled = false
}

Don't forget to clean the project before building

Upvotes: 8

act262
act262

Reputation: 563

Here is my code, when bundle task added, we can hook it here.

tasks.whenTaskAdded {
    if (it.name == 'bundleRelease' || it.name == 'bundleDebug') {
        // bundle task is Zip
        it.exclude '**/BuildConfig.class', '**/R.class', '**/R$*.class'
    }
}

Upvotes: 0

Ognyan
Ognyan

Reputation: 13600

Probably the most elegant solution is to add at the end of the library's build.gradle:

afterEvaluate {
    generateReleaseBuildConfig.enabled = false
}

Upvotes: 8

Gordon Tseng
Gordon Tseng

Reputation: 301

This works for me

afterEvaluate {
    bundleDebug.dependsOn "removeBuildConfigDebug"
    bundleRelease.dependsOn "removeBuildConfigRelease"
}

task removeBuildConfigDebug(dependsOn: "generateDebugBuildConfig") {
    doFirst {
        file("$buildDir/intermediates/classes/debug/com/amazon/geo/routing/BuildConfig.class").delete()
        file("$buildDir/generated/source/buildConfig/debug/com/amazon/geo/routing/BuildConfig.java").delete()
    }
} 

task removeBuildConfigRelease(dependsOn: "generateReleaseBuildConfig") {
    doFirst {
        file("$buildDir/intermediates/classes/release/com/amazon/geo/routing/BuildConfig.class").delete()
        file("$buildDir/generated/source/buildConfig/release/com/amazon/geo/routing/BuildConfig.java").delete()
    }
} 

Upvotes: 0

D.Shefer
D.Shefer

Reputation: 173

you should get it right after the CompileReleaseSources step.

this worked for me:

task removeBuildConfig(dependsOn: "compileReleaseSources") {
    doFirst {
        file("$buildDir/intermediates/classes/release/pathToFile/BuildConfig.class").delete()
    }
} 

Upvotes: 4

snowdream
snowdream

Reputation: 933

Add a custom task:

task androidReleaseJar(type: Jar, dependsOn: assembleRelease) {
    from "$buildDir/intermediates/classes/release/"
    exclude '**/BuildConfig.class'
    exclude '**/R.class'
    exclude '**/R$*.class'
}

Reference:
1.https://github.com/facebook/rebound/blob/master/build.gradle 2.https://github.com/keyboardsurfer/Crouton/blob/master/library/build.gradle 3.https://github.com/SnowdreamFramework/android-log/commit/4297a0244c972e3fcb9042b5e12181b21c33b524

Upvotes: 6

Related Questions