Proguard ignores config file of library
You typically should not enable ProGuard in the library project. ProGuard processes the application and the library together in the application project, which is the most effective approach.
In the library project, you can specify any library-specific ProGuard configuration in build.gradle, e.g.:
defaultConfig {
consumerProguardFiles 'proguard-rules.txt'
}
This file is then packaged in the library aar as proguard.txt
and automatically applied in the application project.
If you do enable ProGuard in a library project (maybe because you want to distribute the library), then you also have to add the proper configuration for processing the library. The Android Gradle build doesn't seem to do this automatically. You can:
- Copy
android-sdk/tools/proguard/examples/library.pro
toproguard-project.txt
in your library project. - Remove the sample input/output lines
-injars
,-outjars
,-libraryjars
,-printmapping
from the file. The Gradle build process automatically provides these options. - Reference the configuration from the build.gradle of the library project.
Enabling/disabling ProGuard independently for the library project and for the application project works fine for me.
The only thing that worked for me is to define both options in my library:
release {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
consumerProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
Amazingly, Eric's answer is actually working for me too!
Of course Eric knows what he is talking about, but I have [on and off] been trying to find a clean way to do this automatically in gradle for over a year with no luck until I just found this post today.
I combined a few other SO threads and came up w/ this solution that works, that may also be able to be simplified. Steps 1-4 are optional, but so far it hasn't seemed to have hurt.
- Download Proguard 5.2 from http://sourceforge.net/projects/proguard/files/proguard/5.2/
- Unzip to ...
/android-sdk/tools/proguard5.2
- Rename ...
/android-sdk/tools/proguard
to .../android-sdk/tools/proguard4.7
ln -s .../android-sdk/tools/proguard5.2 .../android-sdk/tools/proguard
- Copy
android-sdk/tools/proguard/examples/library.pro
to the library project folder and rename toproguard-library.pro
- Edit
proguard-library.pro
and comment out the-injars
,-outjars
,-libraryjars
, and-printmapping
lines. Edit the library's
build.gradle
file to include:defaultConfig { minifyEnabled true shrinkResources true proguardFiles 'proguard-library.pro' consumerProguardFiles 'proguard-library-consumer.pro' }
You can tweak this to have different behavior for release and debug builds.
proguard-library-consumer.pro
# include in this file any rules you want applied to a # consumer of this library when it proguards itself. -dontwarn junit.** -dontwarn org.junit.** # Make crash call-stacks debuggable. -keepnames class ** { *; } -keepattributes SourceFile,LineNumberTable